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


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


  • o_reg

    Операнд является регистром, поле reg содержит номер регистра. Значения регистров см. в моём файле заголовков x86.h.

  • o_mem

    Операнд является прямой ссылкой на данные в памяти. Сегментный регистр содержится в поле specval_shorts.high, поле addr содержит адрес.

  • o_phrase

    Операнд представляет собой ссылку типа [базовый регистр + индексный регистр]. Сегментный регистр содержится в поле specval_shorts.high. Все значения операнда хранятся в SIB байте - поле specflag2.

    Значение базового регистра определяется как specflag2 & 0x7

    Значение индексного регистра определяется как (specflag2 >> 3) & 0x7

    Масштабный индекс определяется как (specflag2 & 0xC0) >> 6:

    0 eq 0

    1 eq 2

    2 eq 4

    3 eq 8

    По этой схеме specflag2, равный, скажем, 64, представляет операнд [eax+eax*2]

  • o_displ

    Операнд представляет собой ссылку типа [базовый регистр + индексный регистр + смещение]. Сегментный регистр содержится в поле specval_shorts.high. Поле phrase содержит значение базового регистра. Также используется SIB байт (см. описание выше). Поле value содержит значение, если flags & OF_OUTER_DISP.

    Поле addr содержит адрес, если !(flags & OF_NO_BASE_DISP).

  • o_imm

    Операнд содержит непосредственное значение в поле value.

  • o_far & o_near

    Операнд содержит дальнюю и ближнюю ссылку на адрес в поле addr. Сегментный регистр содержится в поле specval_shorts.high.

  • 11

    Для инструкций с плавающей точкой - поле reg содержит номер регистра FPU (0 - ST(0), 1 - ST(1) и т.д.)

  • 12

    Для инструкций с использованием MMX - поле reg содержит номер регистра MMX (0 - MM0, 1 - MM1 и т.д.)

  • 13

    Для инструкций с использованием SSE - поле reg содержит номер регистра SSE (0 - XMM0, 1 - XMM1 и т.д.)




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



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