Набор статей и руководств по дизассемблеру 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

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




        • Содержание  Назад  Вперед