Сношения с Идой Крис Касперски Хакер, номер #094, стр. 094-120-3 ; [00000031 BYTES: COLLAPSED FUNCTION _printf. PRESS KEYPAD "+" TO EXPAND] ; [000000D4 BYTES: COLLAPSED FUNCTION start. PRESS KEYPAD "+" TO EXPAND] Это же какую ума палату нужно уметь, чтобы допустить такое?! Интересно, тестировался ли ассемблерный генератор вообще или был написан в расчете на авось?! Матерясь, возвращаемся в IDA Pro, в меню «View» выбираем пункт «Unhide all», наблюдая за тем, как «раскрываются» библиотечные функции. Генерируем новый ассемблерный файл — на этот раз «demo_2.asm», — не забыв вставить в его начало директивы «.386» и «.model flat,C». Повторяем трансляцию. Просматривая протокол ошибок (ну куда же IDA Pro без ошибок), с удивлением обнаруживаем множественные ругательства на неопределенные символы StartupInfo и CPInfo, представляющие собой легко узнаваемые структуры: demo_2.asm(2533) : error A2006: undefined symbol : _STARTUPINFOA demo_2.asm(4276) : error A2006: undefined symbol : _cpinfo Куда же они могли подеваться?! Открываем ассемблерный листинг в текстовом редакторе и… нет, в русском языке просто не существует подходящих слов, чтобы адекватно выразить наше состояние: ; [00000012 BYTES. COLLAPSED STRUCT _cpinfo. PRESS KEYPAD "+" TO EXPAND] ; [00000044 BYTES. COLLAPSED STRUCT _STARTUPINFOA. PRESS KEYPAD "+" TO EXPAND] Ассемблерный генератор IDA Pro поместил структуры в целевой файл, даже не удосужившись их автоматически развернуть! Что же, придется это сделать самостоятельно. Возвращаемся в IDA Pro, в меню «View» находим пункт «Open Subview», а там — «Structures» или просто жмем горячую клавишу <Shift-F9>. Перед нами появляется окно с перечнем всех структур, и для их разворота достаточно дать команду "View" --> "Unhide all", после чего можно повторить генерацию ассемблерного файла, назвав его «demo_3.asm» (про директивы .386/.model flat мы не забываем, да?). Поразительно, но количество ошибок трансляции совсем не уменьшается, а даже возрастает. И ассемблер по прежнему не может найти «развернутые» структуры. Что же ему мешает? Присмотревшись к логу ошибок повнимательнее, мы видим, что ругательству на неопределенный символ предшествует ошибка типа «operand must be a memory expression» (операнд должен быть выражением, адресующим память): demo_3.asm(2561) : error A2027: operand must be a memory expression demo_3.asm(2596) : error A2006: undefined symbol : StartupInfo demo_3.asm(2599) : error A2006: undefined symbol : StartupInfo demo_3.asm(2601) : error A2006: undefined symbol : StartupInfo Открываем ассемблерный файл в редакторе, переходим к строке 2561 и видим следующую картину: __ioinit proc near ; CODE XREF: start+6Fp StartupInfo = _STARTUPINFOA ptr -44h … cmp [esp+54h+StartupInfo.cbReserved2], 0 jz loc_4022E6 mov eax, [esp+54h+StartupInfo.lpReserved2] Я не уверен на счет «Generic for Intel 80x86», но транслятор MASM, начиная с версии >5.1, такого способа объявлений структур уже не поддерживает, и, чтобы откомпилировать программу, у нас есть, по меньшей мере, два пути: разрушить все структуры (все равно в ассемблерном листинге они нам несильно понадобятся) или же использовать ключ командной строки /Zm, обеспечивающим обратную совместимость с MASM 5.1. Вот так, наверное, мы и поступим: «ml.exe /c /coff /Zm demo_3.asm». |