Автоматизация IDA Pro. Дорабатываем «Иду» напильником

Содержание статьи

  • Плагин на C++
  • Проблемы совместимости
  • IDC
  • IDAPython
  • Пишем скрипты на IDAPython
  • Подсветка CALL
  • Подмена результатов WinAPI
  • Поиск путей до небезопасных функций
  • Массовое исполнение
  • Заключение

Уп­равля­ющие отладчи­ком пла­гины поз­воля­ют сва­лить на машину рутин­ные задачи отладки и поис­ка уяз­вимос­тей. Мы на при­мерах рас­смот­рим обход анти­отладки, поиск путей до уяз­вимых фун­кций и под­свет­ку инте­ресу­юще­го кода. Для это­го напишем пла­гин на C++, гля­нем встро­енный язык IDC и поп­ракти­куем­ся писать скрип­ты на IDAPython, а так­же узна­ем, как обра­баты­вать им нес­коль­ко фай­лов за раз. info

Го­рячо рекомен­дую кни­гу Кри­са Игла «The IDA Pro Book». Она уста­рела по час­ти API, но отве­чает на боль­шинс­тво воп­росов.

 

Плагин на C++

Пер­вый спо­соб рас­ширить воз­можнос­ти «Иды» — это ком­пилиру­емые 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

Под­дер­жка скрип­тов на язы­ке IDC появи­лась со вто­рой вер­сии IDA Pro, в 1994 году.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *