Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Управляющие отладчиком плагины позволяют свалить на машину рутинные задачи отладки и поиска уязвимостей. Мы на примерах рассмотрим обход антиотладки, поиск путей до уязвимых функций и подсветку интересующего кода. Для этого напишем плагин на C++, глянем встроенный язык IDC и попрактикуемся писать скрипты на IDAPython, а также узнаем, как обрабатывать им несколько файлов за раз. info
Горячо рекомендую книгу Криса Игла «The IDA Pro Book». Она устарела по части API, но отвечает на большинство вопросов.
Первый способ расширить возможности «Иды» — это компилируемые DLL. Для сборки плагина требуется C++ SDK. Легально скачать его можно, только купив лицензию на IDA Pro, о нелегальных способах ты можешь узнать сам.
Попробуем собрать и запустить тестовый плагин в Visual Studio 2019 или выше. Создаем пустой проект для Windows (не для консоли), указываем тип конфигурации — динамическая библиотека. В дополнительные каталоги включаемых файлов прописываем путь до папки с инклудами: idasdk90include
. Подключаемые либы из idasdk90libx64_win_vc_64
можно просто перетащить в список файлов проекта, компилятор подхватит их оттуда.
#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: %dn", 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%llXn", 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 Professional 9.0 SP1plugins
. Теперь в меню Edit → Plugins появится новый пункт List functions. Как вариант, плагин можно вызывать через указанное в нем сочетание клавиш Ctrl-Q.
Ключевая проблема плагинов — крайне низкая совместимость между старыми и новыми версиями SDK. Плагин, собранный с учетом одной версии, скорее всего, не заработает (и не соберется без танцев с бубном) на слегка обновленном SDK. То есть для каждого выпуска IDA Pro надо модифицировать и собирать свою версию плагина. Этим, разумеется, никто не занимается. Поэтому многие плагины со временем стали недоступны.
У этого подхода есть коммерческий интерес. SDK предоставляет крайне скупую документацию, фактически только имена аргументов и функций. Чтобы узнать детали работы конкретной функции API, надо искать чужой код или обращаться в поддержку, доступ к которой стоит немалых денег. Можно сказать, что потеря совместимости — своего рода защита от пиратства. Жаль, что от нее страдает конечный пользователь.
Поддержка скриптов на языке IDC появилась со второй версии IDA Pro, в 1994 году.
Источник: xakep.ru