Faked ida.wll
Будучи от природы ленивым человеком, я не желал провести остаток моих дней в отладчике для анализа вызовов функций из IDA engine (ida.wll) и их аргументов, поэтому я решил сделать DLL wrapper. Однако в данном случае невозможно было использовать какой-либо из готовых DLL Wrapperов - все дело в том, что в данном конкретном случае кроме функций экспортируется также несколько переменных. Откуда я узнал, что это именно переменные ? Немного медитации в текстовом редакторе еще никому не вредили, по счастливой случайности все имена функций в Borland C++ Builder 5 (на котором скомпилирована данная версия IDA Pro) начинаются с символа '@', а переменных - с символа '_'.
Далее дело техники - в процедуре инициализации .DLL необходимо после разрешения адреса переменной из оригинальной DLL изменить собственную таблицу экспорта так, чтобы адрес в ней указывал на настоящее местоположение якобы экспортируемого символа. С этим методом связаны две проблемы:
- В таблице экспорта содержатся не абсолютные адреса, а относительные от адреса загрузки данного модуля, поэтому необходима коррекция помещаемого туда значения. Подробности смотрите в функции fix_export файла fix_exp.c.
- Visual C++ автоматически помещает таблицу экспорта в секцию .rdata, в артибутах которой не присутствует разрешение на запись. Можно конечно всегда воспользоваться тем же PEditorом, но такое решение показалось мне недостаточно автоматизированным, поэтому после некоторого размышления я просто добавил в .DEF файл следующую малодокументированную директиву, позволяющую тем не менее иметь writeable таблицу экспорта:
SECTIONS .edata READ WRITE
Теперь при каждой перекомпиляции таблица экспорта будет автоматически иметь нужные атрибуты.
- -i задает входной .IMP файл
- -n задает созданный ранее файл с demanled names. В принципе можно легко обойтись и без него, но с ним генерируемый исходник выглядит несколько более эстетично
- fish.c содержит тела функций, перехватывающих управление и вызывающих функцию протоколирования. Ничего интересного, можете заменить вызов LogIt
на что-нибудь более подходящее. - init.c содержит код загрузки оригинальной DLL (переименуйте ее в _ida.wll) и инициализации всех внутренних данных, а также вызовы функций для модификации собственной таблицы экспорта.
- rp.c содержит код функций протоколирования и синхронизации. Лог будет помещаться в файл ida.log.
- fake.def DEF файл для создания DLL.
- header.h содержит декларации всех используемых данных.
- rp.h содержит декларации для rp.c
Однако на этом сложности не заканчиваются - дело в том, что сгенерированная faked DLL с настройками по умолчанию будет грузиться с того же адреса, что и оригинальная ida.wll - похоже, что это IDA Pro не совсем нравится, поэтому необходимо изменить адрес загрузки нашей faked DLL на какой-нибудь другой, например на 0x12a40000 (цифра была взята совершенно произвольно).
Исходники faked IDA.WLL содержатся в каталоге fake.
Содержание раздела
Был переписан мой DLL wrapper wrapper.pl с учетом всего вышесказанного, а также с возможностью использования файла output.dem с информацией о demangled names (он был получена все из того же файла output с помощью нехитрого IDC scriptа demangle.idc). Для его запуска Вам необходим Perl, кроме того, он не генерирует файл fix_exp.c. Новая версия DLL wrapperа не может быть использована более ни для чего (very IDA Pro specific version :) и имеет следующие опции коммандной строки:
В результате после непродолжительного шуршания жесткого диска будут созданы следующие файлы с исходным кодом: