Перехват WM_GETTEXT

Довольно часто разработчики защит читают содержимое окна, посылая ему сообщение WM_GETTEXT. Это ставит в тупик неопытных кракеров. Установка точек останова на GetWindowsText и GetDIgItemText ни к чему не приведет. В таком случае необходимо использовать шпионские средства для анализа взаимо­действия приложения с окном. Б Windows все делается посредством сообщений, поэтому их перехват позволит выяснить алгоритм работы защитного механизма.

Выбор программ-шпионов достаточно широк. Очень неплохо для этой цели подходит ВС от NuMega, однако достаточно и более скромных средств. Например, распространяемый вместе с Microsoft Spy++ (см. рис. на следующей странице).

Рассмотрим полученный рапорт:

ОООООЕ9С S .WM_GETTEXT cchTextMax:30 lpszText:0063F750

ОООООЕ9С R .WM_GETTEXT cchCopied:^ ipszText:0063F750 ("Kris Kasperski")

Умница spyxx даже показал адрес, по которому считанная строка располага­ется в памяти. Впрочем, он мало что нам дает. Скорее всего буфер расположен в стеке, и активно используется приложением. Нам необходимо перехватить WM_GETTEXT непосредственно в отладчике. Для этого нужно знать дескриптор окна. В этом нам и поможет шпион.

Перехват сообщений в Soft-lcc осуществляется командой BMSG. Подробности ее использования можно найти в документации или встроенной помощи. После ввода строки в окно редактирования и нажатия на ENTER отладчик всплывет со следующим сообщением:

Break due to BMSG 1.1429 WV. GETTEXT (ET=513.11 milliseconds)

HWnd=0428 wParam = 001E 1Param = 28D70000 msd=000D WM_GETTEXT

Обратите внимание, что мы находимся в 16-разрядном сегменте н IParam это не 32-битное смещение, а 16-битное сегмент:смещение. Убедиться и этом можно, если вывести дамп этой области и дождаться выхода из процедуры. Если все сделано правильно, то в окне дамна окажется введенная строка. Теперь можно поставить на нее точку останова и обнаружить манипулирующий с ней код.

Впрочем, в данном примере он отсутствует. CrackOA просто демонстрирует один иа вариантов обмена с окном. Аналогичным образом происходит и динами­ческий обмен с окном. Подробное изложение его механизма несложно для понимания, и его можно найти в MSDN. Приблизительно же происходит следу­ющее. Если содержимое окна изменено, то оно посылает сообщение EN_CHANGE , (через WM_COMMAND), в ответ ему приходит запрос WM_GETTEXT. Такой механизм очень популярен и используется многими программистами. С другой стороны, все, что делает GelWindowText, — это посылает окну WM_GETTEXT и возвращает полученный результат.

Фактически удобнее и быстрее всегда перехватывать именно это сообщение, а не функции API или библиотек, которые очень трудно удержать в голове.