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

Long Dfirst (long From);

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

Подробнее о перекрестных ссылках было рассказано в описании функция AddCodeXref, add_dref.

Хотя это не очевидно, источник может иметь несколько перекрестных ссылок. Например, когда используется инструкция, наподобие mov ax,[BX].

Если указан неверный источник, (то есть линейный адрес, не содержащий перекрестных ссылок) или источник перекрестной ссылки данных, то функция возвратит ошибку BADADDR

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

seg000:2331 mov word_0_2934, ax ;  источник

seg000:2934*word_0_2934 dw 0 ; DATA XREF: seg000:2331w

seg000:2934 ;  приемник

Message(“0x%X \n”,

Dfirst(0x12331)

);

0x12934

Операнд

Пояснения

From

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

Return

Пояснения

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

Long Dnext (long From,long current);

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

Для понимания того, как работает данная функция, рекомендуется прочесть описания функций AddCodeXref, add_dref, Dfirst.

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

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

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

Поясним это на примере:

seg000:2331 mov word_0_2934, ax ;  источник

seg000:26C1 cmp ax, word_0_2934 ;  источник

seg000:277B cmp dx, word_0_2934 ;  источник

seg000:2934* word_0_2934 dw 0 ; DATA XREF: seg000:2331w

seg000:2934* ; seg000:26C1r

seg000:2934* ; seg000:277Br

seg000:2934 ;  приемник

IDA сформирует по линейному адресу 0x12934 следующий список приемников: {0x12331, 0x126С1, 0x1277B} Вот эти адреса и будут возвращаться при прохождении списка функцией Dnext.

Не обязательно начинать первый вызов с Dfirst (смотри описание выше). Как уже упоминалось, Dnext хранит указатель на текущую ссылку не во внутренней скрытой переменной, а принимает его как параметр.

Таким образом, это дает нам возможность легко манипулировать ее значением, управляя поведением функции.

Вообще не понятно, зачем понадобилось вводить Dfirst. Ведь первую перекрестную ссылку можно найти с помощью Dnext – и это будет следующая ссылка за нулем.

Очевидно, что Dnext(0x12934,0) вернет 0x12331 – первую перекрестную ссылку в списке. Следовательно, Dnext(X, 0) идентична Dfirst.

Вывести на экран адреса всех источников перекрестных ссылок поможет следующий код:

auto a;

a=0;

for (;;)

{

a=Dnext(ScreenEA(),a);

if (a==-1) break;

Message("0x%X \n",a);

}

Операнд

Пояснения

Form

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

Current

Текущий адрес

Return

Пояснения

Следующий адрес в списке

-1 если список исчерпан или отсутствует источник

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