Глава 4. Описание работы с дизассемблером W32Dasm и отладчиком ICE
В данной главе я попытаюсь рассказать о двух моих любимых средствах анализа программ.
I
Программа W32Dasm (Windows Disassembler) представляет собой симбиоз довольно мощного дизассемблера и отладчика. Версия 8.93 программы, наиболее распространенная в настоящее время, может работать не только с РЕ-модулями, но и DOS-, NE-, -LE- модулями. Я намерен довольно полно описать работу с этой программой.
Начало работы. Внешний вид программы показан на Рис. 4.4.1. Меню дополняется панелью инструментов, элементы которой активизируются в зависимости от ситуации.
Рис. 4.4.1. Внешний вид программы W32Dasm.
Как уже было сказано, программа является дизассемблером и отладчиком в одном лице. Это отражено также в двух пунктах меню: "Disassembler" и "Debugger". Соответственно, имеются отдельные настройки для дизассемблера и отладчика. Для дизассемблера имеется всего три опции, касающиеся анализа перекрестных ссылок в условных переходах, безусловных переходах и вызовах процедур. По умолчанию все три опции установлены. Отмена этих опций нежелательна, т.к. снижает информативность дизассемблированного текста. В принципе, это может понадобиться при дизассемблировании очень большой программы, так это несколько ускоряет процесс анализа.
Опций отладчика несколько больше, но они все очевидны. Окно установки опций отладчика изображено на Рис. 4.4.2, все они касаются особенностей загрузки процессов, потоков и динамических библиотек.
Рис. 4.4.2. Опции отлпдчика
Для начала работы с исполняемым модулем достаточно выбрать нужный файл в меню "Disassembler\0pen File...". После этого программа производит анализ модуля и выдает дизассемблированный текст, а также весьма полную информацию о секциях модуля54. W32Dasm весьма корректно распознает API-функции и комментирует их (см. Рис. 4.4.3).
После работы с модулем можно создать проект работы при помощи пункта "Disassembler\Save Disassembler...". По умолчанию проект сохраняется в подкаталог "wpjfiles", который расположен в рабочем каталоге W32Dasm и состоит из двух файлов: с расширением "alf" - дизассемблированный текст, с расширением "wpj" - собственно сам проект. При повторном запуске можно открывать уже не модуль, а проект с помощью пункта "Project\0pen...".
* Possible Reference to String Resource ID=00001: "! >>1I5=85" | :00401013 6A01 push 00000001 :00401015 FF3518304000 push dword ptr [00403018] * Reference To: USER32.LoadStringA, Ord:01A8h | :0040101B E8AE000000 Call 004010CE
Puc. 4.4.3. Фрагмент дизассемблированного текста.
Передвижение по дизассемблированному тексту. При передвижении по
тексту текущая строка подсвечивается другим цветом, при этом особо выделяются
переходы и вызовы процедур. Передвижение облегчается также с помощью пункта меню
"Goto":
Goto Code Start - переход на начало листинга;
Goto Program Entry
Point - переход на точку входа программы, наиболее важный пункт меню;
Goto
Page - переход на страницу с заданным номером, по умолчанию число строк на
странице составляет пятьдесят;
Goto Code Location - переход по заданному
адресу, в случае отсутствия адреса учитывается диапазон и близость к другим
адресам.
Другим способом передвижения по дизассемблированному тексту является пункт "Search" - поиск. Здесь нет никаких отличий от подобных команд других программ.
В случае, если текущая строка находится в команде перехода или вызова процедуры, с помощью кнопок, расположенных на панели инструментов, можно перейти по соответствующему адресу. Такое передвижение можно продолжать, пока Вы не обнаружите нужный фрагмент программы. Но самое приятное здесь то, что можно передвигаться и в обратном направлении. При этом нужные кнопки на панели инструментов автоматически подсвечиваются.
Кроме того, те адреса, куда производится переход, содержат список адресов, откуда производятся переходы. Подсветив строку, где расположен адрес, и дважды щелкнув правой кнопкой мыши по этому адресу, мы перейдем к соответствующей строке.
Данные. Есть несколько вариантов работы с данными.
Во-первых, имеется пункт меню "HexData\Hex Display of Data...", где можно просмотреть содержимое сегментов данных в шестнадцатеричном и строковом варианте. Кроме того, сам код программы также можно просматривать в шестнадцатеричном виде. Для этого используется пункт "HexData\Hex Display of Code...".
Во-вторых, имеется пункт меню "Refs\String Data References". Это весьма мощное и полезное средство. При выборе этого пункта появляется список строк, на которые имеются ссылки в тексте программы. Во всяком случае, это то, что сумел определить дизассемблер при анализе программы. Выбрав нужную строку, можно двойным щелчком перенестись в соответствующее место программы. Если ссылок на данную строку несколько, то, продолжая делать двойные щелчки, мы будем переходить во все нужные места программы. На Рис. 4.4.4 изображено окно ссылок на строковые типы данных.
Рис. 4.4.4. Окно ссылок на строки.
Как видно из рисунка, можно скопировать в буфер выбранную строку или все строки.
Импортированные и экспортированные функции. Список импортированных функций и модулей находится в начале дизассемблированного текста (см. Рис. 4.4.5). Кроме того, список импортированных функций можно получить из меню "Functions\Imports". Выбрав нужную функцию в списке, двойным щелчком можно получить все места программы, где вызывается эта функция. Экспортированные функции также можно получить в соответствующем окне, выбрав пункт "Functions\Exports".
Ресурсы. В начале дизассемблированного текста также описаны и ресурсы, точнее два основных ресурса-меню и диалоговое окно. Со списком этих ресурсов можно работать и в специальных окнах, получаемых с помощью пунктов меню программы "Refs\Menu References" и "Refs\Dialog references". Строковые ресурсы можно увидеть в уже упомянутом окне просмотра перечня строковых ссылок (см. Рис. 4.4.4). Остальные ресурсы данной версии программы, к сожалению, не выделяются.
Операции с текстом. Строки дизассемблированного текста могут быть выделены и скопированы в буфер либо напечатаны. Выделение строки осуществляется щелком левой кнопки мыши, когда курсор мыши расположен в крайнем левом положении. Для выделения группы строк дополнительно используется клавиша Shift. Выделенный фрагмент копируется специальной кнопкой, которая "загорается", когда фрагмент существует, либо отправляется на печатающее устройство.
Загрузка программ для отладки. Загрузить модуль для отладки можно двумя способами. С помощью пункта "Debug\Load Process" загружается для отладки уже дизассемблированный модуль. Пункт же "Debug\Attach to an Active Process" позволяет "подсоединяться" и отлаживать процесс, находящийся в памяти. После загрузки отладчика на экране появляются два окна. Первое окно информационное (Рис. 4.4.6), в документации оно называется "нижним левым окном отладчика". Второе окно управляющее (Рис. 4.4.7), называемое в документации "нижним правым окном отладчика".
+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++ Number of Imported Modules = 7 (decimal) Import Module 001: ADVAPI32.dll Import Module 002: KERNEL32.dll Import Module 003: MPR.dll Import Module 004: COMCTL32.dll Import Module 005: GDI32.dll Import Module 006: SHELL32.dll Import Module 007: USER32.dll +++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++ Import Module 001: ADVAPI32.dll Addr:000D9660 hint(0000) Name: RegCloseKey Addr:000D966B hint(0000) Name: RegOpenKeyExA Addr:000D967B hint(0000) Name: KegQueryValueExA Addr:000D9692 hint(0000) Name: RegSetValueBxA Import Module 002: KERNEL32.dll