Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 [ 39 ] 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

ОПЕРАНДЫ #definition

Элементы могут содержать один и более операндов, включающих в себя непосредственные значения. Одно и то же непосредственное значение может являться и константой, и смещением в сегменте, и базовым адресом сегмента. Константа в свою очередь может отображаться в двоичной, восьмеричной, десятичной и шестнадцатеричной системе исчисления или символьной ASCII-строки.

Тип и представление каждого операнда определяется значением соответствующих битов флагов (см. таблицу 14). Две группы битов определяют представление первого и второго операнда; если же элемент содержит более двух операндов, третий и все последующие операнды имеют тот же самый тип и представление, что и второй операнд.

Если ни один бит атрибутов операнда не установен, операнд не имеет никакого типа, (т.е. имеет тип "void") и отображается в системе исчисления принятой по умолчанию. В зависимости от настоек IDA Pro бестиповые операнды могут отображаться другим цветом (по умолчанию красным).

Определить имеет ли некий элемент кода непосредственный операнд или нет можно анализом бита FF IMMD флагов. Если он установлен - элемент кода имеет непосредственный операнд, и, соответственно, наоборот. Значение бита FF IMMD не зависит от типа непосредственного операнда - чем бы он ни был: смещением, константой, базовым адресом сегмента или имел тип void, - флаг FF IMMD указывает на сам факт наличия (отсутствия) непосредственного операнда, но никак не связан с его типом.

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

В некоторых случаях IDA Pro позволяет автоматически отличить смещения от констант:

a) используя информацию о перемещаемых элементах (fixup info) IDA Pro может автоматически преобразовать бестиповые операнды в базовые адреса сегментов и смещения

b) в 32-разрядном сегменте, инструкция, имеющая непосредственный операнд, содержащий значение 0x10000 и выше, автоматически преобразуется в смещение, если это разрешено настойками

c) то же, что и в пункте b но для данных

d) непосредственный операнд инструкции push, следующей за инструкцией, заносящий в стек базовый адрес сегмента, автоматически преобразуется в смещение, если это разрешено настройками

e) непосредственный операнд, копируемый инструкций MOV в один из регистров общего назначения, автоматически преобразуется в смещение, если он предшествует инструкции MOV, заносящий в один из сегментных регистров базовый адрес сегмента

f) непосредственный операнд, копируемый инструкций MOV в ячейку памяти независимо от способа ее адресации, автоматически преобразуется в смещение, если он предшествует инструкции MOV, заносящий в ячейку памяти базовый адрес сегмента.

Авто-анализатор IDA Pro непрерывно совершенствуется, и новые версии становятся способными автоматически распознать смещения все в большем и большем числе случаев, - однако, вместе с этим увеличивается и процент ложных срабатываний, поэтому, окончательная доводка дизассемблируемого листинга ложится на плечи пользователя.



представление первого слева операнда

флаг

представление

FF 0VOID

0x00000000

тип void

FF 0NUMH

0x00100000

шестнадцатеричное представление

FF 0NUMD

0x00200000

десятичное представление

FF 0CHAR

0x00300000

символьное представление

FF 0SEG

0x00400000

представление в виде базового адреса сегмента

FF 0OFF

0x00500000

представление в виде смещения в сегменте

FF 0NUMB

0x00600000

бинарное представление

FF 0NUMO

0x00700000

восьмеричное представление

FF 0ENUM

0x00800000

представление в виде перечисления

FF 0FOP

0x00900000

пользовательское представление

FF 0STRO

0x00A00000

представление в виде смещения в структуре

FF 0STK

0x00B00000

представление в виде стековой переменной

представление второго слева операнда

флаг

представление

FF 1VOID

0x00000000

тип void

FF 1NUMH

0x00100000

шестнадцатеричное представление

FF 1NUMD

0x00200000

десятичное представление

FF 1CHAR

0x00300000

символьное представление

FF 1SEG

0x00400000

представление в виде базового адреса сегмента

FF 1OFF

0x00500000

представление в виде смещения в сегменте

FF 1NUMB

0x00600000

бинарное представление

FF 1NUMO

0x00700000

восьмеричное представление

FF 1ENUM

0x00800000

представление в виде перечисления

FF 1FOP

0x00900000

пользовательское представление

FF 1STRO

0x00A00000

представление в виде смещения в структуре

FF 1STK

0x00B00000

представление в виде стековой переменной

Таблица 13 возможные представления непосредственных операндов элементов типа данные и код

Сводная таблица функций

функции, изменяющие отображение операндов

название функции

краткое описание

success OpBinary(long ea,int n)

отображает операнд (операнды) в двоичном виде

success OpOctal(long ea,int n)

отображает операнд (операнды) в восьмеричном виде

success OpDecimal(long ea,int n)

отображает операнд (операнды) в десятичном виде

success OpHex(long ea,int n)

отображает операнд (операнды) в шестнадцатеричном виде

success OpChr (long ea,int n)

отображает операнд (операнды) в символьном виде

success OpNumber(long ea,int n)

отображает операнд (операнды) в систем исчисления принятой по умолчанию

success OpOff (long ea,int n,long base)

отображает операнд (операнды) в виде смещения, отсчитываемого относительно начала сегмента



success OpOffEx(long ea,int n,long reftype,long target,long base,long tdelta)

отображает операнд (операнды) в виде смещения, отсчитываемого относительно любого адреса, принадлежащего сегменту

success OpSeg(long ea,int n)

отображает операнд (операнды) в виде имени сегмента, базовый адрес которого равен значению операнда

success OpAlt(long ea,long n,char str)

отображает операнд (операнды) в виде символьной строки, заданной пользователем

success OpSign(long ea,int n)

отображает операнд (операнды) в знаковой или целочисленной форме (функция работает как триггер)

success OpStkvar(long ea,int n)

отображает непосредственное значение, использующее для базовой адресации в виде имени локальной переменной

функции, возвращающие операнды

название функции

краткое описание

char GetOpnd(long ea,long n)

возвращает операнд в символьном представлении

long GetOpType(long ea, long n)

возвращает тип операнда

long GetOperandValue (long ea,long n)

возвращает значение операнда

char AltOp (long ea,long n)

функции, о

название функции

long FindVoid(long ea, long

flag)

long FindImmediate (long ea, long flag, long value);

возвращает операнд, определенный пользователем

беспечивающие поиск операндов

краткое описание

возвращает линейный адрес очередного операнда неопределенного типа

возвращает линейный адрес очередного элемента с операндами, имеющими указанное значение

char Demangle (char name, long disable mask)

возвращает незамангленное имя метки

success OpBinary(long ea,int n)

Функция отображает операнд (операнды) в двоичном виде, добавляя в его конце суффикс b.

Пример использования:

seg000:0000

a) исходные данные

ax,41h

OpBinary(SegByName("seg0 0 0"),1);

b) вызов функцию OpBinary для преобразования второго слева операнда в двоичный вид.

seg000:0000 mov ax, 1000001b

c) результат - второй слева операнд преобразован в двоичный вид

??? #верстальщику - change table



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 [ 39 ] 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140