Анимация
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

...четный линейный адрес

return MyGetHead(ea-1);

Недостатком такого подхода является его потенциальная несовместимость с последующими версиями IDA Pro, но обойтись для решения проблемы одними лишь высокоуровневыми функциями, встроенными в IDA, не получается.

Задача могла бы быть решена при помощи вызовов функций ItemSize и ItemEnd, предназначенных для вычисления длины и адреса конца элемента соответственно, очевидно, адрес начала элемента равен ItemEnd(ea) - ItemSize(ea), но ItemSize возвращает не размер элемента, а смещение до его конца!

Ниже приведен другой вариант реализации функции MyGetItemHeadEA, вместо низкоуровневых манипуляций с флагами, использующий вызов PrevHead, однако, полностью отказаться от обращений к флагам не удается - приходится вызывать макрос isTail, определенный в файле <idc.idc> для проверки не является ли переданный адрес адресом головы элемента.

static MyGetltemHeadE(ea)

if (!GetFlags(ea)) return -1; ошибка

if (!isTail(GetFlags(ea)

return ea; return PrevHead(ea,0);

голова

Пара функций NextNotTail и PrevNotTail возвращают адрес следующего (предыдущего) элемента или бестипового байта. В полностью дизассемблированной программе не должно быть ни одного бестипового байта, но они могут присутствовать на промежуточной стадии анализа - все ячейки, на которые IDA не смогла распознать ни одной ссылки, она оставляет бестиповыми байтами, которые надлежит перевести в элементы кода или данных пользователю.

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

функции, возвращающие основные характеристики элементов

имя функции

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

long ItemSize (long ea)

возвращает расстояние до конца элемента (не его размер!)

long ItemEnd (long ea)

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

функции трассировки элементов

имя функции

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

long NextHead (long ea)

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

long NextHead (long ea, long maxea)

long PrevHead (long ea)

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

long PrevHead (long ea, long minea)

long NextNotTail (long ea)

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

long PrevNotTail (long ea)

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



long ItemSize(long ea)

В контекстной помощи IDA сообщается, что эта функция определяет размер элемента, как и следует из ее названия. На самом же деле она возвращает расстояние в байтах до конца элемента, что доказывает следующий эксперимент:

seg000:0000 aHelloldaPro db Hello,IDA Pro! seg000:000E a1234 db 1234

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

auto a,b;

a=SegByName("seg000"); for(b=0;b<0x12;b++)

Message(">ea:%X -%c-> %d\n",a+b,Byte(a+b),ItemSize(a+b));

b) скрипт, последовательно передающий функции различные адреса от начала объекта

>ea:

1000

>

>ea:

1001

>

>ea:

1002

>

>ea:

1003

>

>ea:

1004

>

>ea:

1005

>

>ea:

1006

>

>ea:

1007

>

>ea:

1008

>

>ea:

1009

>

>ea:

100A

>

>ea:

100B

>

>ea:

100C

>

>ea:

100D

>

>ea:

100E

>

>ea:

100F

>

>ea:

1010

>

>ea:

1011

>

c) результат: функция ItemSize возвращает расстояние до конца объекта в байтах

Минимальное значение, возвращаемое функцией, равно единице. Это же значение возвращается при возникновении ошибки - если функции передать адрес, не принадлежащий ни одному элементу.

Альтернативная реализация функции ItemSize содержится в файле "kpnc.idc", находящимся на диске, прилагаемом к этой книге. Ее исходный код приведен ниже (см. MyGetItemSize)

static MyGetItemHeadEA(ea)

if (GetFlags(ea) & FF DAT) голова

return ea; if (GetFlags(ea) & FF TAIL) хвост return PrevHead(ea,0);

если не голова и не хвост - ошибка

return -1;



static yGetItemSize(ea)

if (GetFlags(ea) & MS CLS) элемент? return ItemEnd(ea) - MyGetltemHeadE(ea)

return -1;

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

seg000:0000 aHelloldaPro seg000:000E a1234 a) исходные данные

db Hello,IDA Pro! db 1234

auto a,b;

a=SegByName("seg000");

for(b=0;b<0x12;b++)

Message(">ea:%X -%c-> %d\n",a+b,Byte(a+b),MyGetItemSize(a+b));

b) скрипт, последовательно передающий функции MyGetItemSize различные адреса от начала объекта

Замечание: перед исполнением скрипта файл "kpnc.idc" должен быть загружен в память. Это можно осуществить нажатием клавиши <F2>

>ea:

1000

>

>ea:

1001

>

>ea:

1002

>

>ea:

1003

>

>ea:

1004

>

>ea:

1005

>

>ea:

1006

>

>ea:

1007

>

>ea:

1008

>

>ea:

1009

>

>ea:

100A

>

>ea:

100B

>

>ea:

100C

>

>ea:

100D

>

>ea:

100E

>

>ea:

100F

>

>ea:

1010

>

>ea:

1011

>

c) результат - корректное выполнение функции ??? #Верстальщику - Change Table

аргумент

пояснение

линейный адрес, принадлежащий элементу

return

=return

Пояснения

расстояние до конца элемента в байтах (не его размер!)

ошибка

Родственные функции: нет



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