Сношения с Идой Крис Касперски Хакер, номер #094, стр. 094-120-2 Очень своевременное решение, особенно в свете того, что TASM давно мертв: не «переваривает» новых инструкций, не обновляется, не поддерживается и официально не распространяется. Borland уже давно забила на этот проект. И хотя есть несколько некоммерческих TASM-совместимых ассемблеров (см. статью «битва трансляторов») всех проблем они не решают, и дизассемблерные листинги транслируются только после существенной переделки, а раз так, то лучше остановить свой выбор на пакете MASM, входящим в состав NTDDK. Решено! Выбираем «Generic for Intel 80x86» и говорим "File" --> "Produce output file" --> "Produce ASM file" или просто нажимаем горячую клавишу <Alt-F10>. Даем файлу имя (например, «demo_1.asm») — и через несколько минут шуршания диском у нас образуется нечто по имени «ничто». Скармливаем эту штуку ассемблеру «ml.exe /c demo_1.asm» (версия 6.13.8204) для справки. Транслятор выдает свыше сотни ошибок, после чего прекращает свою работу, не видя никакого смысла ее продолжать (см. рис. 3). Анализ показывает, что 90% ошибок связаны с неверным определением типа процессора «instruction or register not accepted in current CPU mode». Ах, да! По умолчанию IDA Pro выбирает «MetaPC (disassemble all 32-bit opcodes)», но забывает поместить соответствующую директиву в дизассемблерный листинг, а транслятор по умолчанию устанавливает 8086 ЦП, совершенно не совместимый с 32-разрядным режимом. Лезем в начало листинга, вставляем директиву «.386», после чего повторяем сеанс трансляции заново. И опять куча ошибок (правда, на этот раз чуть меньше ста, что не может не радовать). Смотрим, что не понравилось транслятору: «demo_1.asm(34):error A2008:syntax error:flat». Хм?! Открываем demo_1.asm, переходим к строке 34 и видим: «model flat». А точка где?! Кто ее будет ставить? Абель, что ли? Возвращаем точку на место, заодно добавляя квалификатор языка Си: «.model flat,C» и вновь прогоняем программу через транслятор. На этот раз MASM едет крышей настолько, что выпадает в soft-ice (если тот был предварительно запущен) или выбрасывает знаменитое сообщение о критической ошибке. Ладно, предположим, что это ошибка самого транслятора, легко обходимая добавлением волшебного ключика «/coff» к командной строке, и следующая попытка трансляции проходит уже без ошибок: «ml.exe /c /coff demo_1.asm». В смысле, без критических ошибок самого транслятора, а ошибок в листинге по-прежнему предостаточно. Большинство из них относится к невозможности определения имен библиотечных функций, имен и меток: demo_1.asm(53) : error A2006: undefined symbol : _printf demo_1.asm(64) : error A2006: undefined symbol : __exit demo_1.asm(285) : error A2006: undefined symbol : _fclose demo_1.asm(297) : error A2006: undefined symbol : _free demo_1.asm(453) : error A2006: undefined symbol : off_403450 demo_1.asm(490) : error A2006: undefined symbol : off_403450 Черт! Как же мы могли забыть, что хитрая IDA Pro коллапсирует библиотечные функции, стремясь расчистить листинг от бесполезного мусора, не несущего никакой полезной нагрузки. Вернемся к рисунку 1 и сравним его со следующим фрагментом сгенерированного ассемблерного листинга: |