Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Техника отладки

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #057, стр. 057-020-4


Точки останова на сообщения

Допустим, у нас есть окно с несколькими элементами управления (меню, флажок или кнопка), нажатия на которые мы хотим отследить (см. картинку). Как это сделать? Очень просто! Установить точку останова на сообщение! В Windows весь интерфейс построен на сообщениях (об этом хорошо написал Петзолд в "Программировании для Windows 95"). В частности, при нажатии на элемент управления (или при изменении окна редактирования) окну посылается сообщение WM_COMMAND. Вот на него-то мы и поставим точку останова. Но сначала нам нужно определить дескриптор (handle) окна.

Это можно сделать либо любым Windows-шпионом (например Spyxx, входящим в состав Microsoft Visual Studio), либо средствами самого SoftIce, командой "HWND", выводящей список всех оконных элементов. Если в ответ на "HWND" SoftIce выплюнет "Unable to find a desktop window", необходимо переключить контекст командой "ADDR".

Самая левая колонка содержит дескрипторы оконных элементов, самая правая - имена модулей, которым эти элементы принадлежат. В данном случае диалог обрабатывается библиотекой oodlrwrs, о чем можно узнать с помощью команды MOD.

ЛИСТИНГ

Handle Class WinProc TID Module

010098 VMDropTargetClass 0403810 138 VMwareUser

010096 VMDropTargetClass 00403810 138 VMwareUser

010094 VMDropTargetClass 00403810 138 VMwareUser

010090 VMDropTargetClass 00403810 138 VMwareUser

01001C NDDEAgnt 0100BC04 F8 winlogon

120124 #32770 (Dialog) 00F7BC5E 2BC comctl32

220132 #32770 (Dialog 00F7BC5E 2BC oodlrwrs

1F00FE Button 00F7BC5E 2BC oodlrwrs

200102 Button 00F7BC5E 2BC oodlrwrs

1B00F0 Button 00F7BC5E 2BC oodlrwrs

320130 Static 00F7BC5E 2BC oodlrwrs

210138 Static 77E19AA4 2BC oodlrwrs

230116 Static 77E19AA4 2BC oodlrwrs

24014C Static 77E19AA4 2BC oodlrwrs

1700F8 Static 00F7BC5E 2BC oodlrwrs

20013A Static 77E19AA4 2BC oodlrwrs

1F0122 Static 77E19AA4 2BC oodlrwrs

Мы видим, что наши три кнопки принадлежат диалогу #32770 с дескриптором 220132. В принципе, можно поставить точку останова и на 120124 - адрес оконной процедуры (WinProc) у них одинаков. Говорим "BMSG 220132 WM_COMMAND" и выходим из SoftIce. Нажимаем на кнопку "Далее>", и (ура!) отладчик послушно всплывает! Остается только немного протрассировать оконную процедуру в поисках кода, обрабатывающего это нажатие.

Точки останова на данные

Чаще всего бывает так, что ключевой файл или регистрационные данные извлекаются в одном месте, а обрабатываются совсем в другом. Установив точку останова на GetWindowTextA, мы перехватим код, считывающий введенный нами регистрационный номер, но как найти то место, где он сравнивается с оригиналом? Легко!

Назад на стр. 057-020-3  Содержание  Вперед на стр. 057-020-5