Набор статей и руководств по дизассемблеру IDA


Faked ida.wll


Будучи от природы ленивым человеком, я не желал провести остаток моих дней в отладчике для анализа вызовов функций из IDA engine (ida.wll) и их аргументов, поэтому я решил сделать DLL wrapper. Однако в данном случае невозможно было использовать какой-либо из готовых DLL Wrapperов - все дело в том, что в данном конкретном случае кроме функций экспортируется также несколько переменных. Откуда я узнал, что это именно переменные ? Немного медитации в текстовом редакторе еще никому не вредили, по счастливой случайности все имена функций в Borland C++ Builder 5 (на котором скомпилирована данная версия IDA Pro) начинаются с символа '@', а переменных - с символа '_'.

Далее дело техники - в процедуре инициализации .DLL необходимо после разрешения адреса переменной из оригинальной DLL изменить собственную таблицу экспорта так, чтобы адрес в ней указывал на настоящее местоположение якобы экспортируемого символа. С этим методом связаны две проблемы:

  1. В таблице экспорта содержатся не абсолютные адреса, а относительные от адреса загрузки данного модуля, поэтому необходима коррекция помещаемого туда значения. Подробности смотрите в функции fix_export файла fix_exp.c.
  2. Visual C++ автоматически помещает таблицу экспорта в секцию .rdata, в артибутах которой не присутствует разрешение на запись. Можно конечно всегда воспользоваться тем же PEditorом, но такое решение показалось мне недостаточно автоматизированным, поэтому после некоторого размышления я просто добавил в .DEF файл следующую малодокументированную директиву, позволяющую тем не менее иметь writeable таблицу экспорта:

    SECTIONS .edata READ WRITE

    Теперь при каждой перекомпиляции таблица экспорта будет автоматически иметь нужные атрибуты.

Был переписан мой DLL wrapper wrapper.pl с учетом всего вышесказанного, а также с возможностью использования файла output.dem с информацией о demangled names (он был получена все из того же файла output с помощью нехитрого IDC scriptа demangle.idc). Для его запуска Вам необходим Perl, кроме того, он не генерирует файл fix_exp.c. Новая версия DLL wrapperа не может быть использована более ни для чего (very IDA Pro specific version :) и имеет следующие опции коммандной строки: