Skip to content

Экспорт модулей для plugin sdk из IDA

Dmitry edited this page Jul 5, 2019 · 9 revisions

Модуль в plugin-sdk - это связка из заголовочного файла (.h), файла исходного кода (.cpp) и файла метаданных (meta.$ИмяМодуля$.h).

База данных plugin-sdk - это набор файлов (.csv, .json, .txt), полученных в результате экспорта из базы (баз) данных IDA, и в которых хранится информация об этой (этих) базе (базах).

Элемент базы данных - структура, член структуры, перечисление, член перечисления, функция, переменная.

Инструменты для экспорта

Для экспорта модулей из IDA разработаны следующие инструменты:

  1. Plugin-SDK Import (PluginSdkImport .dll/.plw) - плагин IDA для импорта базы данных plugin-sdk в базу IDA.
  2. Plugin-SDK Export (PluginSdkExport .dll/.plw) - плагин IDA для импорта базы данных plugin-sdk из базы IDA.
  3. Plugin-SDK Comments (PluginSdkComments .dll/.plw) - плагин IDA для упрощения создания комментариев к функциям и переменным, которые используются в базе данных plugin-sdk.
  4. Plugin-SDK Source Generator (plugin-sdk-source-gen.exe) - утилита для генерации модулей plugin-sdk из базы данных plugin-sdk.

Установка инструментов

Плагины IDA работают с версиями IDA 6.8, 7.0 и 7.2. Они находятся в папке plugin-sdk\tools\ida-tools\$ВерсияIDA$. Их необходимо перенести в папку plugins в папке IDA.

Работа с базой данных IDA

Атрибуты plugin-sdk

Атрибуты - это дополнительные параметры и свойства для элементов базы данных.

Запись атрибута имеет вид $ИмяАтрибута$:$Значение$, при этом, если значение атрибута содержит пробелы, то оно заключается в кавычки: $ИмяАтрибута$:"$Значение с пробелом$".

Значение атрибута может быть строчным (string), целочисельным (int) или булевым (bool).

Тип атрибута Значения Значение по умолчанию
string любой набор символов пустая строка
int целое число 0
bool true/false false

Все атрибуты записываются в первой строке комментария к элементу базы данных. Для переменных, структур, членов структур, перечислений, членов перечислений это обычный неповторяющийся комментарий (ПКМ > Enter comment...), а для функций - неповторяющийся комментарий для функции (FUNCTION comment (но не function comment), Edit > Comments > Enter comment...).

Для упрощения ввода таких комментариев для функций и переменных есть плагин Plugin-SDK Comments (ПКМ > Set plugin-sdk comment...).

Привязка к модулю

Для привязки к модулю необходимо указать атрибут module с названием модуля: module:$ИмяМодуля$.

Для упрощения привязки привязки переменных и функций к модулю есть плагин Plugin-SDK Comments (ПКМ > Set plugin-sdk module..., или ПКМ > Set pluigin sdk module to $ИмяПоследнегоМодуля$ (стаёт доступным после использования команды Set plugin-sdk module...)).

Атрибуты структуры (класса)

Атрибут Тип Назначение
scope string область видимости
isstruct bool использовать тег struct (по умолчанию - class)
isanonymous bool анонимный класс
iscore bool класс является одним из основных в plugin-sdk, и не потребует специального управления памятью
isabstract bool обьект такого класса невозможно создать или удалить
vectordd bool у класса есть удаляющий деструктор, который может удалить вектор обьектов

Атрибуты члена структуры (класса)

Атрибут Тип Назначение
rawtype string тип члена класса (используется, если невозможно указать тип стандартно)
isanonymous bool анонимный член класса
isbase bool поле класса - базовый (родительский) класс
isbitfield bool поле класса - набор битовых полей

Атрибуты перечисления

Атрибут Тип Назначение
scope string область видимости
isclass bool изолированное перечисление (scoped enum)
startword string строка, с которой начинаются имена членов перечисления (используется, когда перечисление является набором битовых полей в структуре)

Атрибуты члена перечисления

Атрибут Тип Назначение
bitwidth int размер битового поля (в битах)
iscounter bool счётчик внутри перечисления (на данный момент не используется)

Атрибуты функции

Атрибут Тип Назначение
rettype string тип возвращаемого значения (используется, если невозможно указать тип стандартно)
priority bool приоритет события (event priority) для этой функции: before или after (по умолчанию - before)
isconst bool константная функция (на данный момент не используется)
forceoverloaded bool использовать макросы OVERLOADED при обращении к метаданным функции
rt_$ИмяПараметра$ string тип параметра функции - используется, если невозможно указать тип в IDA стандартно
dt_$ИмяПараметра$ string значение по умолчанию для параметра функции

Атрибуты переменной

Атрибут Тип Назначение
rawtype string тип члена класса (используется, если невозможно указать тип стандартно)

Тип функции

Тип функции должен быть определён. Нестатические методы класса должны соответствовать соглашению __thiscall, статические методы - соглашению __cdecl. Первый параметр нестатического метода класса - это указатель на этот класс (параметр this).

Параметры функции

Если параметр функции является ссылкой, имя этого параметра должно начинаться с префикса ref_, а тип параметра должен быть указателем.

void __cdecl CSprite2d::DrawRect(CRect const *ref_rect, CRGBA const *ref_color);

Если параметр функции является возвращаемым значением (Return Value Optimisation), имя этого параметра должно начинаться с префикса ret_.

CVector *__cdecl FindPlayerCoors(CVector *ret_outCoords, int playerIndex);

Если параметр функции использует тип, который невозможно напрямую указать в базе (например, шаблонный тип), то тип для такого параметра определяется в атрибутах функциях (название атрибута - это название параметра функции с префиксом rt_).

// module:SomeModule rt_param:SomeTemplateClass<TemplateParamType>
void __cdecl TestFunction(SomeTemplateClass *param)`;

Если у параметра функции есть значение по умолчанию, то это значение определяется в атрибутах функциях (название атрибута - это название параметра функции с префиксом dt_).

// module:common dt_playerId:-1
CPlayerPed *__cdecl FindPlayerPed(int playerId)`;

Выравнивание в структурах

Поля класса, которые обозначают выравнивание, должны начинаться префиксом _pad или __pad.

Clone this wiki locally