Есть множество версий разного рода ассемблеров и соответствующих программных компиляторов. Также немало и всевозможной документации по этим вопросам. Но лично мне кажется, что начинать нужно с классики жанра – знаменитого туториала от Iczelion'a и используемого им пакета Masm32.
Пакет Masm32 (на сегодня 10-я версия) на самом деле имеет компилятор макро ассемблера ml.exe от 1999 года. Т.е. он много лет практически не меняется. Возможно это последняя бесплатная версия, ибо более поздние компиляторы ml.exe принадлежат Microsoft и входят в состав продуктов MS Visual Studio, по крайней мере, начиная с 7-й версии (2000 год). Так что, если у вас есть MS VC7 или выше из VS, то вы можете воспользоваться более новой версией ассемблерного компилятора.
В принципе нас устраивает любая версия Masm32, хоть бесплатная, хоть от MS. Поэтому, для чистоты эксперимента будем работать с Masm32 и компилятором от 1999 года.
Вот перечень файлов, которые нам понадобятся. Они (или аналогичные) есть также и в Visual C++ из MS Visual Studio.
Каталог Bin:
ml.exe – компилятор макро ассемблера; ml.err – пустой текстовый файл, для вывода ошибок компилятора; link.exe – линковшик; rc.exe – компилятор ресурсов; rcdll.dll – библиотека компилятора ресурсов; cvtres.exe – дополнительный компилятор ресурсов; mspdb50.dll – общая библиотека поддержки.
В данном случае, это основная суть того, что делает «Ида», подгружая файл с отладочными символами. Как видим, не очень много и, может быть, не стоило бы так заморачиваться с pdb-файлами. Однако, для больших проектов, без отладочных символов трудоемкость работы может существенно возрасти. Получение из файла листинга ассемблерного файла
Полученный файл дизассемблерного листинга после копирования через буфер обмена, содержит не нужные, для целей компиляции, адреса строк кода, перед собственно кодом ассемблера
В общем-то, столбец с адресами можно попытаться удалить вручную. Так, например, многие редакторы (лучше с моноширинным шрифтом) поддерживают выделения столбца текста с помощью Alt + левая кнопка мыши, либо Shift + Alt + управление стрелками / PageUp / PageDown / Home / End. Но нам это делать как-то лениво , поэтому мы лучше напишем небольшой скрипт, который будет выполнять за нас всю эту «черную» работу. Лично мне привычен FoxPro, который, на уровне ядра, очень неплох, для любых версий. Однако в данном случае это неважно. Вы можете наваять собственный скрипт, на любом удобном вам языке.
Первый способ заключается в том, чтобы положить файл write.pdb рядом с файлом write.exe. По крайней мере, серверная ОСь понимает это правильно, и подгружает сама нужный нам файл, в результате чего мы получаем то, к чему стремились
Теперь мы вполне удовлетворены полученным результатом. Распознавание прототипов функций осуществлено успешно. Теперь, быстренько (так как время работы одного сеанса демо-версии ограниченно и составляет порядка 30 минут) выделяем весь полученный листинг и сохраняем в тот же файл write.lst, вставив ассемблерный листинг после описания структур.
Второй способ ручного использования pdb-файлов заключается в его непосредственном выборе из IdaPro через пункт меню File / Load file / PDB file . . . Мы просто указываем путь, выбрав маску файлов (*.*) для нужного файла символов. Заметим только, что выбор не того файла приведет к непредсказуемым последствиям по перекодировке ассемблерного листинга.
Напомним, что в двух различных сборках XPюши, «Ида» отказывается это делать, мотивируя тем, что «класс не определен». Какой класс и чего, нам объяснять не считают нужным. Можно только предположить, что это глюки самой демо-версии 5.6 либо ее плагина pdb.plw, хотя на серверной ОСи этот плагин вполне успешно работает в предыдущей версии «Иды» (и даже автоматом грузит символы из Интернета, в том числе, через прокси-сервер).
На случай, если нет интернета или файла write.pdb, покажем, как
... Читать дальше »
Как оказалось, со структурами просто вышел глюк. Если удалить вкладку со структурами (Alt-F3) и затем снова восстановить ее (через меню, либо по Shift-F9), то все нужные структуры появятся (рис. 3). Только не забудьте прокрутить окно вверх, а то будет казаться, что восстановлена только одна структура вместо трех необходимых.
Кстати, эти структуры можно сразу сохранить в файл (предварительно раскрыв их «серым» плюсом) через буфер обмена, скажем, в файл write.lst.
В таком виде (плюс лидирующий символ подчеркивания «_», который добавляет компилятор) эти имена функций присутствуют в библиотечных lib-файлах, которые нам нужно будет подгружать при компиляции ассемблерного кода. Понятно, что мы может внести все нужные изменения вручную, но зачем, если по-хорошему, то это задача «Иды».
Конкретно, это означает, что отладочная информация из соответствующих pdb-файлов не была автоматически загружена из Интернета (с сайта microsoft.com). По этому поводу Ильфак Гильфанов пишет в своей документации, что в этом случае, он типа не виноват, это все происки зловредной Виндозы. Мол, он грузит отладочные символы из Интернета или локально не сам, а через системную \WINDOWS\system32\imagehlp.dll. А она де может отказать в загрузке, по только ей известным причинам. Но мы то верим в это с большим трудом, так как в предыдущей версии IdaPro 5.5 (ее уже нет на сайте Ильфака, но при желании можно найти в бескрайних просторах Сети) отладочные pdb-файлы прекрасно грузят
... Читать дальше »
В настоящее время существует широко известный и достаточно высококачественный интеллектуальный дизассемблер IdaPro от выпускника мехмата МГУ Ильфака Гильфанова (Ilfak Guilfanov). Всегда интересно знать, насколько хорош этот инструмент. Например, как много и что именно нужно изменить в декомпилированном коде, выдаваемом IdaPro, скажем для простейшей GUI программы, которую можно найти в папке Windows, чтобы скомпилированная версия этой программы заработала снова, практическим ничем не отличаясь от исходной программы? Т.е., чем меньше телодвижений нужно делать, чтобы перекомпилировать дизассемблерный файл в работающее приложение, тем, очевидно, более качественен инструмент нашего Ильфака . Ну и конечно эти телодвижения не должны быть слишком уж изощренными, по крайней мере для небольших программ.
Естественно, тестировать можно любую версию дизассемблера. Но поскольку, на данный момент, на сайте разработчика доступна уже демо-версия 5.6, то мы и воспользуемся ею, тем более что нам достаточно будет даже ограниченных возможностей этой версии.
Главное ограничение демо-версии, это отсутствие возможности сохранения ассемблерного кода в файл, что не позволит использовать интерактивные возможности «Иды» длительное время, однако для наших целей тестирования это не очень актуально. Тем не менее, IdaPro оставила нам лазейку сохранения листинга кода в файл через буфер обмера (Ctrl-Ins или Ctrl-C / Shift-Ins или Ctrl-V). Правда, при этом сохраняются и адреса команд, но их о
... Читать дальше »