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

info

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

 

Плагин на C++

Пер­вый спо­соб рас­ширить воз­можнос­ти «Иды» — это ком­пилиру­емые DLL. Для сбор­ки пла­гина тре­бует­ся C++ SDK. Легаль­но ска­чать его мож­но, толь­ко купив лицен­зию на IDA Pro, о нелегаль­ных спо­собах ты можешь узнать сам.

Поп­робу­ем соб­рать и запус­тить тес­товый пла­гин в Visual Studio 2019 или выше. Соз­даем пус­той про­ект для Windows (не для кон­соли), ука­зыва­ем тип кон­фигура­ции — динами­чес­кая биб­лиоте­ка. В допол­нитель­ные катало­ги вклю­чаемых фай­лов про­писы­ваем путь до пап­ки с инклу­дами: idasdk90\include. Под­клю­чаемые либы из idasdk90\lib\x64_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: %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 Professional 9.0 SP1\plugins. Теперь в меню Edit → Plugins появит­ся новый пункт List functions. Как вари­ант, пла­гин мож­но вызывать через ука­зан­ное в нем сочета­ние кла­виш Ctrl-Q.

 

Проблемы совместимости

Клю­чевая проб­лема пла­гинов — край­не низ­кая сов­мести­мость меж­ду ста­рыми и новыми вер­сиями SDK. Пла­гин, соб­ранный с уче­том одной вер­сии, ско­рее все­го, не зарабо­тает (и не соберет­ся без тан­цев с буб­ном) на слег­ка обновлен­ном SDK. То есть для каж­дого выпус­ка IDA Pro надо модифи­циро­вать и собирать свою вер­сию пла­гина. Этим, разуме­ется, ник­то не занима­ется. Поэто­му мно­гие пла­гины со вре­менем ста­ли недос­тупны.

У это­го под­хода есть ком­мерчес­кий инте­рес. SDK пре­дос­тавля­ет край­не ску­пую докумен­тацию, фак­тичес­ки толь­ко име­на аргу­мен­тов и фун­кций. Что­бы узнать детали работы кон­крет­ной фун­кции API, надо искать чужой код или обра­щать­ся в под­дер­жку, дос­туп к которой сто­ит немалых денег. Мож­но ска­зать, что потеря сов­мести­мос­ти — сво­его рода защита от пиратс­тва. Жаль, что от нее стра­дает конеч­ный поль­зователь.

 

IDC

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии