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

Long RfirstB (long To);

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

Для понимания этого, рекомендуется прочесть описания функций AddCodeXref, DelCodeXref, Rfirst, Rnext.

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

Например:

seg000:013B jz loc_0_14F ;  источник

seg000:013D mov ds, ax

seg000:013F mov ax, cs

seg000:0141 mov es, ax

seg000:0143 lodsb

seg000:0144 cmp al, 21h ; '!'

seg000:0146 jb loc_0_14F ;  источник

seg000:0148 cmp al, 7Ah ; 'z'

seg000:014A ja loc_0_14F ;  источник

seg000:014C stosb

seg000:014D loop loc_0_143 ;  источник

seg000:014F

seg000:014F loc_0_14F: ; CODE XREF: seg000:013Bj

seg000:014F ; seg000:0146j ...

seg000:014F ;  приемник

seg000:014F pop es

Источник по адресу seg000:0x14D помечен не случайно. Он, разумеется, не имеет никакого отношения к операнду loc_0_143, а представляет собой перекрестную ссылку на следующую команду.

Реализация этой функции повторяет особенность реализации Rfirst. Действительно, рассмотрим список источников перекрестных ссылок, который IDA сформировала по адресу seg000:0x14F – {0x1013B, 0x10146, 0x1014A, 0x1014C}.

Вполне естественно ожидать, что вызов RfirstB должен был бы вернуть первый – самый наименьший из них.

Однако же, вместо него возвращается источник ссылка на следующую инструкцию, то есть 0x1014A. Покажем это ниже:

Message(“0x%X \n”,

RfirstB(0x1014F)

);

0x1014A

Как получить действительно первый элемент источника списка можно прочитать в описании функции RnextB

Операнд

Пояснения

To

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

Return

Пояснения

Источник ссылки на следующую инструкцию или если ее нет, то первый адрес в списке.

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

Long RnextB (long To,long current);

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

Для более глубокого понимания принципов работы рекомендуется ознакомиться с описанием функций AddCodeXref, DelCodeXref, Rnext, RfirstB.

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

Например:

seg000:013B jz loc_0_14F ;  источник

seg000:013D mov ds, ax

seg000:013F mov ax, cs

seg000:0141 mov es, ax

seg000:0143 lodsb

seg000:0144 cmp al, 21h ; '!'

seg000:0146 jb loc_0_14F ;  источник

seg000:0148 cmp al, 7Ah ; 'z'

seg000:014A ja loc_0_14F ;  источник

seg000:014C stosb

seg000:014D loop loc_0_143 ;  источник

seg000:014F

seg000:014F loc_0_14F: ; CODE XREF: seg000:013Bj

seg000:014F ; seg000:0146j ...

seg000:014F ;  приемник

seg000:014F pop es

Реализация этой функции повторяет особенность реализации Rnext. Не смотря на то, что в idc.idc утверждается будто бы эта функция «видит» тип перекрестных ссылок, указывающих на следующую команду, в действительности этого не происходит. И выделенный красным цветом адрес источника функция не вернет никогда. {0x1013B, 0x10146, 0x1014A, 0x1014C}.

Поскольку RnextB хранит текущий адрес не во внутренней переменной, а в передаваемом параметре, то существует возможность, модифицируя его, управлять работой функции.

Так, например, RnextB(ScreenEA(), 0) гарантированно вернет следующий за ним адрес, то есть 0x1013B, а пройти весь список (за исключением ссылок на следующую инструкцию) можно с помощью следующего кода:

auto a;

a=0;

for (;;)

{

a=RnextB(ScreenEA(),a);

if (a==-1) break;

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

}

0x1013B

0x10146

0x1014C

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

auto a;

a=0;

for (;;)

{

a=RnextB(ScreenEA(),a);

if (a==-1) break;

if (a>RfirstB(ScreenEA())

Message(“0x%X \n”,

RfirstB(ScreenEA()

);

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

}

0x1013B

0x10146

0x1014A

0x1014C

Функция возвращает ошибку BADADDR, если список исчерпан, (то есть текущий адрес наибольший в списке) или не существует.

Операнд

Пояснения

To

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

Current

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

Return

Пояснения

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

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

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