-
Notifications
You must be signed in to change notification settings - Fork 118
Экспорт модулей для plugin sdk из IDA
Модуль в plugin-sdk - это связка из заголовочного файла (.h
), файла исходного кода (.cpp
) и файла метаданных (meta.$ИмяМодуля$.h
).
База данных plugin-sdk - это набор файлов (.csv
, .json
, .txt
), полученных в результате экспорта из базы (баз) данных IDA, и в которых хранится информация об этой (этих) базе (базах).
Элемент базы данных - структура, член структуры, перечисление, член перечисления, функция, переменная.
Для экспорта модулей из IDA разработаны следующие инструменты:
- Plugin-SDK Import (
PluginSdkImport
.dll
/.plw
) - плагин IDA для импорта базы данных plugin-sdk в базу IDA. - Plugin-SDK Export (
PluginSdkExport
.dll
/.plw
) - плагин IDA для импорта базы данных plugin-sdk из базы IDA. - Plugin-SDK Comments (
PluginSdkComments
.dll
/.plw
) - плагин IDA для упрощения создания комментариев к функциям и переменным, которые используются в базе данных plugin-sdk. - 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.
Атрибуты - это дополнительные параметры и свойства для элементов базы данных.
Запись атрибута имеет вид $ИмяАтрибута$:$Значение$
, при этом, если значение атрибута содержит пробелы, то оно заключается в кавычки: $ИмяАтрибута$:"$Значение с пробелом$"
.
Значение атрибута может быть строчным (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
.