Техника отладки Крис Касперски ака мыщъх Спецвыпуск: Хакер, номер #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, мы перехватим код, считывающий введенный нами регистрационный номер, но как найти то место, где он сравнивается с оригиналом? Легко! |