Содержание статьи
info
Горячо рекомендую книгу Криса Игла «The IDA Pro Book». Она устарела по части API, но отвечает на большинство вопросов.
Плагин на C++
Первый способ расширить возможности «Иды» — это компилируемые DLL. Для сборки плагина требуется C++ SDK. Легально скачать его можно, только купив лицензию на IDA Pro, о нелегальных способах ты можешь узнать сам.
Попробуем собрать и запустить тестовый плагин в Visual Studio 2019 или выше. Создаем пустой проект для Windows (не для консоли), указываем тип конфигурации — динамическая библиотека. В дополнительные каталоги включаемых файлов прописываем путь до папки с инклудами: idasdk90\
. Подключаемые либы из idasdk90\
можно просто перетащить в список файлов проекта, компилятор подхватит их оттуда.
#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <ida.hpp>#include <idp.hpp>#include <loader.hpp>#include <funcs.hpp>class MyPlugmod : public plugmod_t{public: MyPlugmod() { msg("MyPlugmod: Constructor called.\n"); } virtual ~MyPlugmod() { msg("MyPlugmod: Destructor called.\n"); } virtual bool idaapi run(size_t arg) override { msg("MyPlugmod.run() called with arg: %d\n", arg); int n = get_func_qty(); for (int i = 0; i < n; i++) { func_t* pfn = getn_func(i); if (pfn == nullptr) continue; qstring name; get_func_name(&name, pfn->start_ea); msg("Function %s at address 0x%llX\n", name.length() ? name.c_str() : "-UNK-", pfn->start_ea); } return true; }};static plugmod_t* idaapi init(void){ return new MyPlugmod();}static const char comment[] = "The plugin displays a list of functions along with the addresses.";static const char help[] = "Information is not provided";static const char wanted_name[] = "List functions";static const char wanted_hotkey[] = "Ctrl+Q";plugin_t PLUGIN ={ IDP_INTERFACE_VERSION, PLUGIN_MULTI, // flags init, // initialize nullptr, // terminate nullptr, // invoke the plugin comment, help, wanted_name, wanted_hotkey};
Архитектура стандартная. В экспорте указывается ссылка на структуру PLUGIN
. Она содержит описание плагина, желаемую горячую клавишу и ссылки на колбэки. Функция init
возвращает ссылку на экземпляр класса MyPlugmod
. Он содержит функцию run
, которая будет запущена при вызове плагина. Код колбэка получает количество распознанных «Идой» функций через get_func_qty
и проходит по каждой, чтобы получить ее имя (через getn_func
) и адрес начала. После чего выводит собранную информацию в консоль.
Копируем собранный плагин в папку IDA
. Теперь в меню Edit → Plugins появится новый пункт List functions. Как вариант, плагин можно вызывать через указанное в нем сочетание клавиш Ctrl-Q.
Проблемы совместимости
Ключевая проблема плагинов — крайне низкая совместимость между старыми и новыми версиями SDK. Плагин, собранный с учетом одной версии, скорее всего, не заработает (и не соберется без танцев с бубном) на слегка обновленном SDK. То есть для каждого выпуска IDA Pro надо модифицировать и собирать свою версию плагина. Этим, разумеется, никто не занимается. Поэтому многие плагины со временем стали недоступны.
У этого подхода есть коммерческий интерес. SDK предоставляет крайне скупую документацию, фактически только имена аргументов и функций. Чтобы узнать детали работы конкретной функции API, надо искать чужой код или обращаться в поддержку, доступ к которой стоит немалых денег. Можно сказать, что потеря совместимости — своего рода защита от пиратства. Жаль, что от нее страдает конечный пользователь.
IDC
Поддержка скриптов на языке IDC появилась со второй версии IDA Pro, в 1994 году.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее