Набор статей и руководств по дизассемблеру IDA


Как IDA дизассемблирует программы - часть 4


  • uchar flags

    Некоторые характеристики операндов. Объяснение см. ниже.

  • char dtyp

    Тип значения операнда. Наиболее распространённые типы значений:

    dt_byte 0 // 8 бит dt_word 1 // 16 бит dt_dword 2 // 32 бит dt_float 3 // 4 байта dt_double 4 // 8 байт dt_qword 7 // 64 бит

  • Все нижеописанные члены структуры op_t хранят информацию о значении операнда (и их использование зависит от значений type & flags):

    • union { uchar reg; uchar phrase; };

      Номер регистра. Для ассемблера x86 номера регистров определены в файле заголовков x86.h моей библиотеки - см. макросы r_XX.

    • union { ulong value; struct { ushort low; ushort high; } value_shorts; };

      Значение непосредственного операнда.

    • union { ulong addr; struct { ushort low; ushort high; } addr_shorts; };

      Значение виртуального адреса, используемого операндом.

    • union { ulong specval; struct { ushort low; ushort high; } specval_shorts; };

      Содержит значение операнда, не могущее быть представленным остальными членами структуры op_t. Специфично для каждого процессорного модуля, для ассемблера x86 не используется (IMHO ?).

    • char specflag1; char specflag2;

      Содержат дополнительную информацию об операнде.

    Как же именно вышеописанные структуры могут быть использованы для анализа кода ? Я выяснил этот вопрос, не дождавшись ответа от Гильфанова. Хочу ещё раз предупредить, что всё нижеописанное касается только IDA Pro версии 3.85b (и может измениться без предупреждения в любой из следующих версий) и только процессора x86.

    Итак, инструкция может иметь один из префиксов. Наличие или отсутствие префиксов определяет поле auxpref_chars.low структуры insn_t:

    • lock auxpref_chars.low & 0x1 == 0x1
    • rep/repe auxpref_chars.low & 0xE == 0xA
    • repne auxpref_chars.low & 0xE == 0xC

    Количество операндов можно определить так: последний из них должен иметь type

    o_void (но не больше трёх).

    Значение операнда определяется его полем type:

    • o_void

      Операнд не имеет значение. Признак отсутствия операнда и всех последующих операндов.




    • Начало  Назад  Вперед



      Книжный магазин