Анимация
JavaScript


Главная  Библионтека 

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

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

long DfirstB (long To);

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

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

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

seg000:2331

seg000:26C1 seg000:277B

seg000:2934* word 0 2934

seg000:2331w

seg000:2934*

seg000:26C1r

seg000:2934*

seg000:277Br

mov word 0 2 934, ax ; источник

cmp ax, word 0 2 934 ; источник

cmp dx, word 0 2 934 ; источник

dw 0 ; DATA XREF:

Рассмотрим список источников перекрестных ссылок, который IDA сформировала по адресу seg000:0x2934 - {0x12331, 0x126С1, 0x1277B}.

Вызов DfirstB возвратит первый из них - с наименьшим линейным адресом.

Message("0x%X \n", BfirstB(0x12934)

0x12331

Операнд

Пояснения

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

Return

Пояснения

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

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

long DnextB (long To,long current);



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

Для более глубокого понимания принципов работы рекомендуется ознакомиться с описанием функций AddCodeXref, add dref, Dnext

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

Например:

seg000:2331 seg000:26C1 seg000:277B

seg000:2934* word 0 2934

seg000:2331w

seg000:2934*

seg000:26C1r

seg000:2934*

seg000:277Br

mov word 0 2934, ax ; источник

cmp ax, word 0 2 934 ; источник

cmp dx, word 0 2 934 ; источник

dw 0 ; DATA XREF:

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

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

auto a; a=0;

for (;;)

a=DnextB(ScreenEA(),a); if (a==-1) break; Message("0x%X \n",a);

0x12331 0x126C1 0x1277B

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

Операнд

Пояснения

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

Current

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

Return

Пояснения

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

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



long XrefType(void);

Эта функция возвращает тип перекрестной ссылки, которая была возвращена последним вызовом функций Rfirst, Rnext, RfirstB, RnextB, Dfirst, Dnext, DfirstB, DnextB.

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

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

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

Поэтому невозможно гарантированно определить тип перекрестной ссылки по возвращаемому функцией XrefType значению.

Например:

seg000:014C loc 0 14C: ; CODE XREF:

seg000:0148w

Rfirst(0x10148);

Message("0x%X \n", XrefType()

0x15

Функция вернула тип dr W, но это еще не дает возможности утверждать, что эта перекрестная ссылка указывает на данные.

Пояснения

Return

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

ТОЧКИ ВХОДА

АРХИТЕКТУРА ТОЧЕК ВХОДА

Поддержка точек входа (Entry Point) самый мало проработанный элемент архитектуры IDA. Причиной тому абсолютная ненужность их для пользователя. В большинстве случаев даже не требуется знать, что такое понятие есть и поддерживается

С одной стороны, вполне логично, что каждый файл имеет некоторую точку, с которой начинается его выполнение, причем эта точка может не совпадать с началом файла. Например, exe файл может начинать выполнение с любой своей точки (между прочим, возможно даже выходящей за границы файла, - но это относиться к недокументированным особенностям MS-DOS совместимых операционных систем и поэтому не будет больше заострять на этом внимания)

Адрес регистра (регистров) - указателя команд в момент передачи управления загруженному файлу и называется точкой входа.

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



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