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


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


Высокоуровневая функция, анализирует байты по адресу ea, и преобразует их в код.

  • ida_export int ua_ana(ea_t ea)

    Анализирует байты байты по адресу ea, преобразует их в код, а также производит некоторые сопутствующие действия (например, применение fixups, увеличение сегментов и т.д.)

  • ida_export int ua_ana0(ea_t ea)

    Наша рабочая лошадка - просто анализирует байты по адресу ea, заполняя структуру cmd, при этом загруженная база данных не изменяется.

  • Все эти три функции возвращают длину декодированной инструкции, или 0, если инструкция не опознана. Аргумент ea - адрес (ea_t - просто ulong).

  • int (*u_emu) (void)

    Указатель на функцию, эмулирующую выполнение инструкции. Несмотря на отсутствие аргументов, эта функция имеет доступ к ранее заполненной в результате анализа структуре cmd для эмулируемой инструкции. Именно наличием эмулятора (а также наличием встроенной в IDA виртуальной регистровой машины) и объясняются её выдающиеся способности - инструкции не просто дизассемблируются, но и частично эмулируются, что позволяет производить более глубокий анализ кода. Эта функция отвечает за создание кросс-ссылок, за включение в зону анализа ветвей исполнения (для инструкций переходов и вызова функций) и множество других вещей...

  • Функции генерации текстового представления (то, что мы видим на экране):
    • void (*u_out) (void)

      Генерирует текстовое представление инструкции по ранее заполненной структуре cmd.

    • int (*u_outop) (op_t &op)

      Генерирует текстовое представление операнда op_t инструкции. Возвращает 1 в случае успеха, и 0, если операнд скрыт.

    Все эти функции не изменяют загруженную базу данных, генерируемый ими текст доступен через глобальную переменную u_line.

  • instruc_t *instruc

    Массив описаний инструкций (см. подробности ниже).

  • Структура instruc_t используется для внутреннего представления характеристик инструкции, и имеет всего два члена:

    • const char near *name

      Строка - имя инструкции

    • ushort feature

      Характеристики инструкции. Битовая маска, могущая состоять из следующих значений: