вторник, 10 ноября 2009 г.

Открываем поле пароля

В Интернете можно найти программки, которые показывают пароль, спрятанный за звёздочками в поле ввода. Начинающим пользователям (достаточно хорошо знакомым с полями для пароля) это покажется чудом и настоящим хакерством, но вы, HiAsm'исты, должны понимать, что для вас нет ничего невозможного... почти.

Для начала выясним, что такое поля для пароля. Это обычное текстовое поле ввода Edit, и в HiAsm вы его найдёте на вкладке "Интерфейс" панели компонентов. Вся хитрость в том, что его параметр Password установлен в true, и вместо символов теперь будут показываться лишь звёздочки.

Разумеется, реальный текст можно получить с точки свойств Text и использовать его, например, для проверки этого самого пароля. Однако так можно делать лишь в своей программе, а если надо узнать, что там, по звёздочками, в чужой программе? И потому нужно изменить само поле, чтобы оно показывало символы.

Поле ввода - это окно. А в любое окно Windows можно посылать так называемые системные сообщения. Они заставляют окно сделать то или иное действие. Например, когда вы нажимаете клавишу на клавиатуре, то активному окну Windows посылает сообщение о нажатии клавиши. Или провели мышью над окном - окно сразу уведомляется об этом с помощью системного сообщения. И такие сообщения можно посылать и самостоятельно, имитируя то или иное действие.

В HiAsm есть компонент для отправки окну системных сообщений, это SendMessage на вкладке "Окно". Любое системное сообщение содержит команду и два параметра - WParam и LParam, значения которых определяются назначением сообщения. В компоненте SendMessage всё это можно задать в параметрах. Однако в параметре Message очень мало вариантов команд. На самом деле их значительно больше, и любую из них можно задать через точку данных Message. А задавать нужно не имя команды, а её номер, который берётся из справочников.

Существует сообщение em_SetPasswordChar, номер которого - 204. Оно устанавливает символ, отображающийся в поле пароля и подходит лишь для полей ввода, но не для других окон. Его и нужно передать полю ввода, чтобы пароль скрывался за требуемым символом. А также с его помощью можно открыть символы из поля пароля.

Скачать схему HiAsm

В этом примере компонент SendMessage берёт идентификатор поля ввода. А инициирует отправку сообщения нажатие Enter во втором поле ввода. Я взял именно поле ввода, чтобы можно было задавать номер символа, отображающегося в поле пароля. Этот номер нужно передать как WParam, но здесь он берётся из потока. Число 42 - это обычные звёздочки, а число 0 - открытие поля пароля. Чтобы изменения стали видны, установите курсор в испытуемом поле.

Самое интересное, что можно даже не устанавливать параметр Password у поля в true, а передать сообщение em_SetPasswordChar с нужным символом. Правда, это неудобно и сказано только как демонстрация.

Однако перейдём к открытию поля пароля в чужой программе. Для этого всего лишь нужно получить идентификатор поля ввода, а это очень просто, ведь идентификатор окна выбирается произвольно при первом показе окна и не является скрытым от других программ.

Скачать схему HiAsm

Компонент KeyHook ловит все нажатия клавиш в Windows. Для его работы необходима библиотека Hook.dll, находящаяся в папке Plug. Её нужно скопировать в папку с программой. На событие onKeyDown этот компонент выдаёт код нажатой клавиши, который мы проверяем через Case. Если код равен 13 (а это код клавиши Enter), то сообщение отправляется тому окну, которое находится под курсором мыши. Так что просто подведите курсор к полю ввода в нужной программе и надмите Enter.

И в дополнение. Как узнать код клавиши? Для этого есть очень хорошая вкладка - Core. Там находятся элементы, которые работают прямо на рабочем поле, но в программу они не входят. Компонент hcVisualText и hcKeyHandler соединённые вам помогут.




Раздача DW-ключей - кардшаринг. При этом вы можете получить бесплатный тест сроком на сутки. Есть FAq и кардшаринг в картинках.

9 комментариев:

  1. а где можно справочник с командами взять?

    ОтветитьУдалить
  2. compiler\fpc\MESSAGES.pas
    Только там они в шестнадцатеричном формате, так что надо сначала хотя бы с помощью калькулятора windows перевести шестнадцатеричное число в десятичное.

    ОтветитьУдалить
  3. А можно как нибудь узнать код нажатой клавиши и выдать
    его значение в поток(не в hiasm а в самой программе)

    ОтветитьУдалить
  4. Использовать KeyHook со вкладки "Разное". Однако он использует библиотеку hook.dll, которая должна быть либо в папке WINDOWS, либо рядом с программой. Эту библиотеку как раз можно анйти в папке Windows после установки и интеграции hiasm.

    ОтветитьУдалить
  5. Привет, спасибо очень помогли уроки, только вопрос - Hook.dll отказывается работать...виводит сообщение - Hook.dll не является образом программы для Windows NT???
    Помогите разобратся...

    ОтветитьУдалить
  6. Да, действительно, в папке Plug находится зашифрованный Hook.dll, поэтому он и не работает. Так сделано потому, что некоторые антивирусы считают этот файл вирусом и удаляют его. На самом деле, это не вирус.
    Нормальный Hook.dll находится в папке C:\Windows (если его там нет, выполните Сервис - Настройка - Интеграция и там нажмите кнопку Интеграция).

    ОтветитьУдалить
  7. Спасибо, все работает...

    ОтветитьУдалить
  8. Здравствуйте, как отправить Программе сообщение, что бы в ней нажимались клавиши, которые я хочу?

    ОтветитьУдалить
  9. Наверное, это можно сделать как-то с помощью системных сообщений компонентом SendMessage, только я точно не знаю.

    ОтветитьУдалить