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

Хранение перекрестных ссылок

Как хранятся перекрестные ссылки внутри IDA скрыто от пользователя. Достоверно известно лишь то, что хранятся они достаточно эффективно. А детали реализации недокументированны и могут меняться от версии к версии.

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

Первый из них – источник, который «одним концом» ассоциирован с линейным адресом, по которому он расположен, а другим указывает на адрес приемника. Аналогично и с приемником. Он так же состоит из двух концов.

То есть перекрестная ссылка это «двуполый» объект и этим и объясняться идентичный набор функций для работы с ее источником и приемников, а во-вторых, скорость доступа к источнику и приемнику одинакова. Это было бы не так, если бы в узле дерева хранилась структура (from, to) и тогда бы для поиска каждого приемника пришлось бы просматривать все дерево

Это не относится к ссылкам на следующую команду, которые хранятся во флагах и организованы совсем по-другому. На каждую ссылку расходуется всего один бит(!). Если он установлен, то, следовательно, ссылка на следующую команду присутствует и наоборот.

Адрес же ссылки определяется длиной инструкции, которая численно совпадает с длиной объекта. Подробнее об этом можно прочитать в главе «Объекты в IDA»

Однако, необходимо еще раз уточнить, что все эти подробности могут и не соответствовать действительности в какой-то конкретной версии IDA. Кроме того, с течением времени алгоритмы могут быть пересмотрены и изменены на другие, более эффективные.

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

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

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

МЕТОДЫ

Функция

Назначение

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.

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