Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Внутренности IDA Pro 4.15

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: Red Plait <redplait@usa.net>

А мы пойдем с тобою погуляем по трамвайным рельсам
Посидим на трубах у начала кольцевой дороги
Нашим теплым ветром будет черный дым с трубы завода
Путеводною звездою будет желтая тарелка светофора


Янка "По трамвайным рельсам", 1988



О чем это все


Я уже давно устал высказывать претензии в адрес автора IDA Pro - трогательная поддержка пользователей и 100% совместимость с предыдущими версиями по API уже давно не вызывают у меня ничего кроме умиления, граничащего с нервным истощением. Разве не восхитительно, что одно и то же действие (легко и непринужденно совершающееся в интерактивном режиме с помощью нажатия всего лишь нескольких кнопок) выполняется (если вообще выполняется) на IDC гораздо менее непринужденно, а на IDA API и вовсе не так легко, как того бы хотелось. Причем IDC и IDA SDK тоже слабо коррелируют друг с другом. Разве это не прелесть?
В общем, от природы милостей я решил не дожидаться, а покопаться во внутренностях свежепоявившейся у меня версии IDA Pro самостоятельно. Для чего все это нужно, все еще кто-нибудь может вполне справедливо спросить меня? Чтобы понять, как же программировать на IDA API (например в plugin`ах) все то же самое (и даже лучше), что можно сделать на IDC или топча клавиатуру в "интерактивном" режиме.
Кроме того, у меня есть безумная идея сделать "неинтерактивный" инструмент, использующий движок IDA Pro для работы в batch-mode (например для пакетной обработки множества однотипных файлов, которая просто не может быть выполнена стандартными средствами IDA Pro (IDC scripts или plugins могут к сожалению далеко не все...). Да и просто приятно иметь возможность использовать из собственного приложения такой мощный движок дизассемблера...


Требования


Прежде всего Вы должны иметь IDA Pro Standard v4.15 c SDK к ней. Сразу же хочу предупредить - я Вам не дам копию этого замечательного инструмента, можете даже не просить. Если Вы неспособны завести себе эту программу ( по любым причинам ) - Вам просто незачем тратить Ваше время на чтение данного шедевра современной судебной психиатрии. Попробуйте посетить сайт автора IDA Pro по адресу www.datarescue.com
Совершенно необходимо также знание ассемблера процессоров семейства Intel x86. И если Вы захотите использовать какие-либо из созданных в результате этого маленького вскрытия программ, Вам могут потребоваться Perl (ActiveState Perl под Win32 взять можно здесь: http://www.activestate.com/) и Visual C++ 6.0.


Как распаковать


Как ни странно, запакована только версия для Win32, причем Ильфак видимо считает пользователей своего продукта своими злейшими врагами - запакованы абсолютно все исполнимые модули (процессорные модули с расширением .w32 и загрузчики с расширением .ldw). Я лично так и не могу понять логику такого половинчатого решения - при большом желании я с равным успехом мог бы заняться анализом DOS или OS/2 версий (они не упакованы ВООБЩЕ НИЧЕМ). Ну да ладно, чужая шизофрения - потемки. Для распаковки можно использовать UN PACK 2.1 (взять можно на Protools в разделе "Unpackers/decrypters/unprotectors") - все модули упакованы AsPack`ом разных версий и процесс их распаковки ничего нового с точки зрения передовой советской науки из себя не представляет.
Однако - для того чтобы при дальнейшем анализе в самой же IDA Pro можно было корректно загрузить сигнатуры библиотечных функций, необходимо корректно установить атрибуты секций, содержащие исполнимый код (после распаковки они имеют атрибуты IMAGE_SCN_INITIALIZED_DATA (0x00000040 в соответствии с файлом winnt.h), а необходимо иметь атрибуты IMAGE_SCN_CNT_CODE (0x00000020). Для изменения атрибутов секций можно воспользоваться любым редактором PE файлов, от себя лично могу порекомендовать PEditor (взять можно все на том же Protools в разделе "Utilities -> Exe modifiers"). Для анализа нам необходимо распаковать оболочку пользовательского интерфейса idaw.exe (консольный вариант) и, собственно, сам движок, реализованный под Win32 в виде отдельного модуля ida.wll.


Ковыряем внутренности


Сразу же после распаковки выяснилась одна проблема - дело в том, что бесхитростный Ильфак экспортирует все символы из IDA Pro engine исключительно по ординалам. Однако для того, чтобы все-таки можно было использовать изуродованный таким образом модуль, в SDK есть файл импорта (bin/w32/ida.imp) в формате, генерируемом утилитой implib от Borland. Мною был написан простой Perl script cewl.pl для кое-какой конвертации - в результате был получен файл output, содержащий в себе в сущности имена функций, отсортированные по ординалам. Далее были написаны пара script`ов на IDC для исправления таблицы импорта idaw.exe rename_i.idc и таблицы экспорта ida.wll rename_e.idc. Поместите перед их запуском ранее полученный файл output в одну директорию с этими файлами. Поверьте мне, после исполнения вышеназванных сценариев ассемблерный листинг станет значительно понятнее.


IDA.WLL


Ищем строку с именем любой IDC функции (например AskYN) - и видим, что смещение на нее расположено в одном из полей структуры, служащей для binding`а функций во встроенный IDC движок, адрес начала массива таких структур у меня был 0x1008D9C0. Структура имеет три поля - сначала ссылка на строку - имя функции в IDC, затем указатель на функцию, а последнее поле описывает типы аргументов функции. Об этом последнем поле хочется сказать подробнее - оно представляет собой указатель на массив байт. Каждый байт в этом массиве описывает собой один аргумент экспортируемой в IDC функции, значения байт:

- 1 строковый аргумент
- 2 числовой аргумент (long)
- 4 переменное число аргументов, как в функции Message
- 0 означает конец списка описания аргументов.

Для удобства я переименовал с помощью IDC scrpit`а rename_f.idc все экспортирумые в IDC функции. Оказалось, что далеко не все функции описаны в idc.idc. Теперь у нас есть полный список всех функций IDC, а также реализации IDC функций с помощью API - уже немало.


IDAW.EXE


Если посмотреть в распакованном файле, то мы не сможем найти ни одной строки меню. Однако можно обнаружить названия всех пунктов меню в текстовом виде в файле idatui.cfg. Далее все также не очень сложно - находим любую строку и отслеживаем ссылки на нее. В результате по адресу 0x6604EC50 обнаруживаем что-то вроде массива указателей на структуры обработчиков меню:

Адрес Пункт меню
--------------------------------
0x6604EC50 Меню Jump
0x6604EC54 Меню Search
0x6604EC58 Подменю Edit->Comments
0x6604EC5C Подменю Edit->>Operand types
0x6604EC60 Подменю Edit->Other
0x6604EC64 Подменю Edit->Segments
0x6604EC68 Подменю Edit->Patch program
0x6604EC6C Подменю File->Produce Output File
0x6604EC70 Подменю Edit->Functions
0x6604EC74 Подменю Edit->Structs
0x6604EC78 Подменю Edit->Enums
0x6604EC7C Подменю File->Load file
0x6604EC80 Подменю View->Open subviews
0x6604EC84 Меню File
0x6604EC88 Меню Edit
0x6604EC8C Меню View
0x6604EC90 Меню Options
0x6604EC94 Меню Win

Каждый из вышеприведенных указателей ссылается на массив структур, названных мною

struct menu_handler {
BYTE unkn[12];
char *name;
WORD unkn_w;
DWORD func_ptr;
};


Значение многих полей не было выяснено (ясно, что какие-то из них могут указывать на под-меню, горячие клавиши по умолчанию, номер события в TurboVision и так далее), меня в данной структуре интересовали только поля name (название пункта меню) и func_ptr (указатель на функцию-обработчик данного пункта меню). Для переименования этих функций я написал маленький script rename_h.idc. Рекомендуется запускать его с большой осторожностью, передавая функции rename_h адрес начала массива структур menu_handler. Теперь у меня есть и другая интересующая меня часть кода - реализация пунктов меню пользовательского интерфейса с помощью функций API. Осталось лишь найти время для reverse engeneering`а этих мегабайт ассеблерного листинга...


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 :) и имеет следующие опции коммандной строки:

-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.


Жалобы и предложения


можно отправлять автору по адресу redplait@usa.net. На глупые вопросы типа "А где же мне всё-таки достать IDA Pro" или "А что это такое" я не отвечаю. Если же Вы нашли bug, имеете конструктивные идеи или уверены в моей неправоте - всегда открыт к общению. Также большая просьба - не присылайте мне десятимегабайтных (притом несжатых) файлов в качестве доказательства чего бы то ни было.
Кроме того, автор не несёт ответственности за последствия работы его программ... Ну и если Вам нужно написать загрузчик, plugin или процессорный модуль для IDA Pro - можете смело обращаться к автору сего...

#include <std_disclaim.h>

Файлы к статье находятся по адресу http://pilorama.com.ru/library/src.zip

Статью добавил dzen <dzen@inbox.ru>

Обсуждение статьи: Внутренности IDA Pro 4.15 >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS