Анимация
JavaScript
|
Главная Библионтека
указанного источника
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 поддерживает четыре основных типа ссылок, которые перечислены в приведенной ниже таблице.
Последний тип необходимо отметить особо. В контекстной помощи об этом нет никакого упоминания. Правда, заглянув в 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 |