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

void AddCodeXref(long From,long To,long flowtype);

Создает перекрестную ссылку типа code

long DelCodeXref(long From,long To,int undef)

Удаляет перекрестную ссылку типа code

long Rfirst (long From);

Функция возвращает линейный адрес приемника первой перекрестной ссылки указанного источника

long Rnext (long From,long current);

Эта функция возвращает линейный адрес приемника очередной перекрестной ссылки в списке.

long RfirstB (long To);

Функция возвращает адрес следующего источника в списке перекрестных ссылок, расположенного по указанному приемнику

long RnextB (long To,long current)

Функция возвращает адрес следующего источника в списке перекрестных ссылок, расположенного по указанному приемнику

long Rfirst0 (long From);

Функция возвращает линейный адрес приемника перекрестной ссылки для заданного источника

long Rnext0 (long From,long current);

Эта функция по идее (а точнее следуя из сказанного в файле idc.idc) должна отличатся от Rnext только отсутствием доступа к перекрестным ссылкам на следующую инструкцию. Однако из-за ошибок реализации функции Rnext она «не видит» такой тип ссылок и это делает обе функции полностью идентичными.

long RfirstB0(long To);

Функция возвращает линейный адрес источника перекрестной ссылки для заданного приемника.

long RnextB0 (long To,long current);

Эта функция по идее (а точнее следуя из сказанного в файле idc.idc) должна отличатся от RnextB только отсутствием доступа к перекрестным ссылкам на следующую инструкцию.

void add dref(long From,long To,long drefType);

Добавляет перекрестую ссылку типа data

void del dref(long From,long To);

Удаляет перекрестную ссылку типа data

long Dfirst (long From);

Функция возвращает линейный адрес приемника первой перекрестной ссылки



указанного источника

long Dnext (long From,long current);

Эта функция возвращает линейный адрес приемника очередной перекрестной ссылки в списке.

long DfirstB (long To);

Функция возвращает линейный адрес первого источника для указанного списка приемников

long DnextB (long To,long current);

Функция возвращает адрес следующего источника в списке перекрестных ссылок, расположенного по указанному приемнику.

long XrefType(void);

Эта функция возвращает тип перекрестной ссылки, которая была возвращена последним вызовом функций Rfirst, Rnext, RfirstB, RnextB, Dfirst, Dnext, DfirstB, DnextB.

void AddCodeXref(long From,long To,long flowtype);

Функция создает кодовую перекрестную ссылку. IDA содержит мощный механизм, эмулирующий выполнение инструкций процессора и отслеживающий не только прямые, но даже косвенные ссылки.

Начиная с версии 3.74, она значительно превосходит в этом даже SOURCER, до этого лидирующий среди других дизассемблеров в умении восстанавливать перекрестные ссылки.

Перекрестные ссылки действительно очень облегчают анализ исследуемой программы. Допустим, встречается в тексте стока

Seg000:0123 DB Hello, World!,0Dh,0Ah,0

Как узнать - какой код ее выводит? Для этого, очевидно, нужно найти ссылку на смещение 0x123. Это IDA и делает автоматически. Благодаря перекрестным ссылкам можно трассировать исполнение программы, что позволяет лучше понять ее структуру.

IDA поддерживает два типа ссылок - на код и на данные. AddCodeXref, как нетрудно догадаться добавляет новую перекрестную ссылку на код, то есть инструкцию, изменяющую линейное исполнение программы.

Структура ссылок следующая:

From (Source) То (Target)

Источник - это 32-битный линейный адрес начала инструкции, вызывающей изменение линейного исполнения кода, а приемник - это линейный адрес начала инструкции, на которую выполняется такой переход.

IDA отображает перекрестные ссылки в виде комментариев исключительно возле инструкции приемника.

seg000:0475 seg000:0477 seg000:047A

jnz mov

loc 0 47A cx, 4



seg000:047A loc 0 4 7A:

seg000:0475j

seg000:047A

; CODE XREF:

bx, 10h

В приведенном выше примере показана перекрестная ссылка From == 0x475, To == 0x47A. Каким-то особым образом отмечать источник нет необходимости, поскольку он предполагается очевидным (в данном случае адрес указан в непосредственном операнде).

Подведя курсор к метке loc 0 47A и нажав на Enter, можно перейти к приемнику. А что бы вновь вернуться к источнику, - достаточно кликнуть по перекрестной ссылке.

Разумеется, что на один и тот же приемник может ссылаться более одного источника.

Например:

seg000:0C4A cmp

seg000:0C4D jnz

seg000:0C4F cmp

seg000:0C54 ja

seg000:0C56 inc

seg000:0C5A loc 0 C5A:

seg000:0C4Dj

seg000:0C5A

ah, 4Dh ; M

loc 0 C5A byte 0 F76, 9 loc 0 C5A byte 0 F76

; CODE XREF: ; seg000:0C54j

Немного не очевидно, но IDA поддерживает мульти - источники. Однако, действительно, возможно такое условное ветвление, что в зависимости от операнда приемник может варьироваться.

Например, широко распространенная команда JMP BX, используемая многими компиляторами объективно-ориентированных языков, да и в моделях Маркова, например, то же.

Тип ссылки указывается в постфиксе. В данном случае это j, что обозначает близкий (NEAR) условный или безусловный переход. IDA поддерживает четыре основных типа ссылок, которые перечислены в приведенной ниже таблице.

Определение

Пояснения

Уточнение

Легенда

fl CF

Межсегментный вызов процедуры

Call Far

fl CN

Внутрисегментный вызов процедуры

Call Near

fl JF

Межсегментный переход

Jump Far

fl JN

Внутрисегментный переход

Jump Near

fl US

Определяется пользователем

User specified

fl F

Следующая инструкция

Ordinary flow

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

Когда другие хранятся в базе Btree, значение Ordinary flow извлекается из флагов ячеек виртуальной памяти.

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



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