Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

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)  To (Target)

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

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

seg000:0475 jnz loc_0_47A

seg000:0477 mov cx, 4

seg000:047A

seg000:047A loc_0_47A: ; CODE XREF: seg000:0475j

seg000:047A sub bx, 10h

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

Подведя курсор к метке ‘loc_0_47A’ и нажав на Enter, можно перейти к приемнику. А что бы вновь вернуться к источнику, – достаточно кликнуть по перекрестной ссылке.

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

Например:

seg000:0C4A cmp ah, 4Dh ; 'M'

seg000:0C4D jnz loc_0_C5A

seg000:0C4F cmp byte_0_F76, 9

seg000:0C54 ja loc_0_C5A

seg000:0C56 inc byte_0_F76

seg000:0C5A loc_0_C5A: ; CODE XREF: seg000:0C4Dj

seg000:0C5A ; seg000:0C54j

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

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

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

Определение

Пояснения

Уточнение

Легенда

fl_CF

16

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

Call Far

P

fl_CN

17

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

Call Near

p

fl_JF

18

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

Jump Far

J

fl_JN

19

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

Jump Near

j

fl_US

20

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

User specified

u

fl_F

21

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

Ordinary flow

^

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

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

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

Однако, заметим, что тип перекрестных ссылок – понятие чисто условное и субъективное. Он был введен лишь затем, что бы в удобно читаемой форме предоставить пользователю дополнительную информацию о ссылке, облегчая ему работу по изучению программ.

IDA не следит за корректностью типов ссылок, - забота эта лежит исключительно на плечах кода, создающего ссылки. Ничто не помешает нам создать и вовсе бессмысленную ссылку, – например:

seg000:0C29 mov dx, word ptr byte_0_F76

seg000:0C2D call sub_0_EF8

seg000:0C30 call sub_0_F45

seg000:0C33 jb loc_0_C69 ; CODE XREF: seg000:0C29J

Очевидно, что инструкция mov не может изменять порядок выполнения кода, однако, IDA безболезненно позволяет создавать перекрестную ссылку с таким источником под типом «межсегментный переход»

Заметим, что в зависимости от некоторых настоек, при создании перекрестных ссылок типа «вызов процедуры» IDA может автоматически создавать процедуру на месте приемника, даже если сама ссылка ошибочная.

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

Заметим, что IDA позволяет создавать перекрестные ссылки, указывающие на середину инструкции. Они выделяются красным цветом и располагаются перед указанной инструкцией. Аналогично адрес округляется и при всех попытках перехода.

Операнд

Пояснения

From

Адрес источника перекрестной ссылки

To

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

flowtype

Тип перекрестной ссылки (смотри таблицу, приведенную выше)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]