[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 address
- FUNCATTR_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– цвет фона функции в формате 0xBBGGRR
- FUNCATTR_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
 
 
- Объект типа