[ru] Справочник по IDAPython
Справочник IDAPython
Текстовая версия шпаргалки. Эта информация так или иначе может быть найдена в модулях IDAPython (в основном в idc.py)
Глобальные константы
idc.BADADDR
– при работе с адресами указывает на несуществующий адрес (0xFFFFFFFF
для 32-битных систем);idc.BADSEL
– при работе с селекторами указывает на несуществующий селектор (0xFFFFFFFF
для 32-битных систем);idc.MAXADDR
– максимальный адрес (0xFF000000
для 32-битных систем)idc.SIZE_MAX
– максимальный размер (0xFFFFFFFF
для 32-битных систем)
Сегменты (Segments)
Итерация по сегментам
idautils.Segments()
– генератор, возвращающий стартовые адреса сегментов;idc.get_first_seg()
– возвращает адрес первого сегмента;-
idc.get_next_seg(ea)
– возвращает адрес следующего сегмента относительно адреса ea; idc.get_segm_attr(ea, attr)
– возвращает значение атрибута сегмента;idc.set_segm_attr(ea, attr, value)
– устанавливает значение атрибута сегмента;
Доступны следующие атрибуты сегментов:
idc.SEGATTR_START = 0
– адрес начала сегмента;idc.SEGATTR_END = 4
– адрес конца сегмента;idc.SEGATTR_ORGBASE = 16
–idc.SEGATTR_ALIGN = 20
– выравнивание;idc.SEGATTR_COMB = 21
– комбинация (combination)idc.SEGATTR_PERM = 22
– разрешения;idc.SEGATTR_BITNESS = 23
– разрядность;idc.SEGATTR_FLAGS = 24
– флаги;idc.SEGATTR_SEL = 28
– селектор сегмента;idc.SEGATTR_ES = 32
– значение регистра ES;idc.SEGATTR_CS = 36
– значение регистра CS;idc.SEGATTR_SS = 40
– значение регистра SS;idc.SEGATTR_DS = 44
– значение регистра DS;idc.SEGATTR_FS = 48
– значение регистра FS;idc.SEGATTR_GS = 52
– значение регистра GS;idc.SEGATTR_TYPE = 96
– тип сегмента;-
idc.SEGATTR_COLOR = 100
– цвет сегмента; idc.get_segm_start (ea)
– возвращает адрес начала сегмента;idc.get_segm_end (ea)
– возвращает адрес конца сегмента;idc.get_segm_name(ea)
– возвращает имя сегмента;idc.selector_by_name(name)
– возвращает селектор по имени.
Функции (Functions)
При работе с функциями адрес ea представляет собой любой адрес, который относится к функции.
Итерация по функциям
idautils.Functions(start_ea=None, end_ea=None)
– генератор, возвращающий адреса начала функций в интервале [start_ea, end_ea]; без аргументов используются минимальный и максимальный адреса в текущей базе IDA;idc.get_prev_func(ea)
– возвращает адрес начала предыдущей функции относительно заданного адреса ea, текущая функция не учитывается;idc.get_next_func(ea)
– возвращает адрес начала следующей функции относительно заданного адреса ea;
Информация о функции
-
idc.get_name_ea_simple(name)
– возвращает адрес объекта по его строковому имени name; -
idc.get_func_name(ea)
– возвращает имя функции по заданному адресу ea; если адрес не принадлежит функции, возвращает пустую строку; -
idc.get_func_off_str(ea)
- по заданному адресу ea возвращает строку формата ИмяФункции_СмещениеАдреса или пустую строку:Python>"%08x" % here() # текущий адрес 1001bb33 Python>idc.get_func_name(here()) # имя функции для текущего адреса sub_1001BB20 Python>idc.get_func_off_str(here()) # строковое представление текущего адреса sub_1001BB20+13
Управление функцией
idc.add_func(ea, end=BADADDR)
– создание функции в указанном диапазоне [ea, end]; аналогично созданию функции по клавише P;idc.set_func_end(ea, end)
– установить адрес конца выбранной функции равным end; важно: адрес end не будет включён в функцию, это адрес, где функция именно заканчивается;idc.del_func(ea)
– удалить информацию о функции (остаётся только код без сформированной функции);-
idc.find_func_end(ea)
– возвращает адрес конца выбранной функции; -
idc.get_func_flags(ea)
– возвращает флаги функции; -
idc.set_func_flags(ea, flags)
– устанавливает флаги функции:-
idc.FUNC_NORET = 1
– noreturn-функция (без выхода); -
idc.FUNC_FAR = 2
– far-функция; -
idc.FUNC_LIB = 4
– библиотечная функция; -
idc.FUNC_STATIC = 8
– static-функция; -
idc.FUNC_FRAME = 16
– функция использует указатель фрейма (base pointer, BP); -
idc.FUNC_USERFAR = 32
– пользователь установил признак far-функции; -
idc.FUNC_HIDDEN = 64
– свёрнутая (спрятанная функция), отображается обычно так:.text:1001B280 ; [00000341 BYTES: COLLAPSED FUNCTION sub_1001B280. PRESS CTRL-NUMPAD+ TO EXPAND]
; -
idc.FUNC_THUNK = 128
– функция-обёртка (выполняет jump на другую функцию); -
idc.FUNC_BOTTOMBP = 256
– указатель фрейма (BP) указывает на дно стека; -
idc.FUNC_NORET_PENDING = 512
– необходимо выполнить проверку функции на признак ‘non-return’; -
idc.FUNC_SP_READY = 1024
– анализ указателя стека уже выполнен для данной функции ; -
idc.FUNC_PURGED_OK = 16384
– проверка поля ‘argsize’ была выполнена; этот бит управляется процессорным модулем; -
idc.FUNC_TAIL = 32768
– признак хвостового чанка функции;
-
-
idc.get_func_cmt(ea, repeat)
– возвращает комментарий функции; -
idc.set_func_cmt(ea, comment, repeat)
– устанавливает комментарий для функции;- флаг repeat (0/1) указывает, какой комментарий требуется, обычный или повторяемый;
idc.get_func_attr(ea, attr)
– возвращает атрибут функции;idc.set_func_attr(ea, attr, val)
– устанавливает атрибут функции;- параметр attr может принимать значения:
FUNCATTR_START = 0
– адрес начала функции # readonly: function start addressFUNCATTR_END = 4
– адрес конца функции (readonly)FUNCATTR_FLAGS = 8
– флаги функции (см. выше)FUNCATTR_FRAME = 12
– ID стекового фрейма функции (readonly)FUNCATTR_FRSIZE = 16
– размер области локальных переменных функции в байтах (readonly)FUNCATTR_FRREGS = 20
– размер области сохранённых регистров в байтах (readonly)FUNCATTR_ARGSIZE = 24
– размер области аргументов функции в байтах (readonly)FUNCATTR_FPD = 28
– разница указателя кадра (frame pointer delta)FUNCATTR_COLOR = 32
– цвет фона функции в формате 0xBBGGRRFUNCATTR_OWNER = 12
– функция-владелец чанка функции (readonly)FUNCATTR_REFQTY = 16
– количество родительских функций для чанка (readonly)
- параметр attr может принимать значения:
Управление стеком и стековым фреймом
idc.get_sp_delta(ea)
– разница в значении указателя стека (SP) между текущим адресом и предыдущим;idc.get_spd(ea)
– разница текущего значения указателя стека (SP) относительно начала функции;-
idc.add_user_stkpnt(ea, delta)
– добавить разницу для указателя стека; idc.set_frame_size(ea, lvsize, frregs, args)
– создать фрейм функции, где параметры:lvsize
– размер локальных переменных функции в байтах;frregs
– размер сохранённых регистров в байтах;argsize
– размер аргументов функции в байтах;
-
idc.get_frame_size(ea)
– размер фрейма функции; idc.get_frame_regs_size(ea)
– размер сохранённых во фрейме регистров в байтах;idc.get_frame_lvar_size(ea)
– размер локальных переменных в байтах;idc.get_frame_args_size(ea)
– размер аргументов функции в байтах;idc.get_frame_id(ea)
– ID фрейма функции в текущей базе IDA.
Кросс-ссылки (Cross references / XRef)
Константы
IDA определяет два типа ссылок: кодовые ссылки и ссылки-данные. У каждого типа есть свои коды ссылок.
Пользовательские ссылки должны иметь дополнительный битовый флаг:
XREF_USER = 32
Кодовые ссылки (Code refs)
Подразумевают использование адреса в качестве адреса для выполнения
fl_CF = 16
– far-вызов функции;fl_CN = 17
– near-вызов функции;fl_JF = 18
– far-jump на адрес;fl_JN = 19
– near-jump на адрес;fl_F = 21
– обычный поток кода (от инструкции к инструкции).
Ссылки для данных (Data refs)
Подразумевают использование адреса в качестве данных (адреса глобальных переменных, строк, функций)
dr_O = 1
– получение адреса (Offset);dr_W = 2
– ссылка на запись (Write);dr_R = 3
– ссылка на чтение (Read);dr_T = 4
– текстовая ссылка (использование имени в определённых пользователем операндах);dr_I = 5
– информационная ссылка.
Доступ к кросс-ссылкам
-
idc.add_cref(from, to, flowtype)
– добавить кодовую ссылку из адресаfrom
на адресto
-
idc.del_cref(from, to, undef)
– удалить кодовую ссылку. Параметрundef
определяет, сделать ли адресto
неопределённым (undefined) -
idc.add_dref(from, to, datatype)
– добавить data-ссылку -
idc.del_dref(from, to)
– удалить data-ссылку -
idautils.CodeRefsTo(ea, flow)
– генератор кодовых ссылок на указанный адрес; возвращает адреса типаlong
-
idautils.CodeRefsFrom(ea, flow)
– генератор кодовых ссылок из указанного адреса; возвращает адреса типаlong
-
Параметр
flow
(0 / 1) определяет, учитывать ли ссылки, которые создаются простым переходом от инструкции к инструкции. То есть, если есть участок кода:.text:10022665 sub_10022665 proc near ; CODE XREF: sub_100226E0+3↓p .text:10022665 ; sub_10024574+5↓j .text:10022665 cmp byte ptr [ecx+8], 0 .text:10022669 mov dword ptr [ecx], offset off_1002A710 .text:1002266F jz short locret_1002267F .text:10022671 mov ecx, [ecx+4] .text:10022674 test ecx, ecx .text:10022676 jz short locret_1002267F .text:10022678 push ecx ; hHeap .text:10022679 call ds:HeapDestroy .text:1002267F .text:1002267F locret_1002267F: ; CODE XREF: sub_10022665+A↑j .text:1002267F ; sub_10022665+11↑j .text:1002267F retn .text:1002267F sub_10022665 endp
То выполнение
idautils.CodeRefsTo(0x1002267F, flow=0)
вернёт два адреса: 0x1002266f и0x10022676. Если же выполнить
idautils.CodeRefsTo(0x1002267F, flow=1)
, то вернутся три адреса: 0x10022679, 0x1002266f, 0x10022676.
-
-
idautils.DataRefsTo(ea)
– генератор ссылок-данных на указанный адрес; возвращает адреса типаlong
-
idautils.DataRefsFrom(ea)
– генератор ссылок-данных из указанного адреса; возвращает адреса типаlong
-
idautils.XrefsTo(ea, flags=0)
– генератор всех ссылок на указанный адрес; возвращает объекты типаidautils._xref
-
idautils.XrefsFrom(ea, flags=0)
– генератор всех ссылок на указанный адрес; возвращает объекты типаidautils._xref
- Объект типа
idautils._xref
имеет следующие атрибуты:frm
– адрес, ИЗ которого происходит ссылка (сокращение от from)iscode
– флаг (0 / 1), показывающий является ли ссылка кодовойto
– адрес, НА который происходит ссылкаtype
– код ссылки в рамках её типа (fl_
илиdr_
)user
– флаг (0 / 1), показывающий, является ли ссылка пользовательской, созданной с использованием флагаXREF_USER
- Объект типа