Анимация
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

seg000:0F72*

seg000:0E5Fw seg000:0F72

; DATA XREF

; приемник

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

Dr R Чтение (Read)

Любая инструкция, производящая прямое чтение ячейки. Например:

seg000:0D08 mov ax, word 0 F72 ; источник

seg000:0F72*word 0 F72 dw 0 ; DATA XREF:

seg000:0D08r

seg000:0F72 ; приемник

При этом инструкции, выполняющие цикл операций чтение - вычисление - запись, IDA всегда относит к типу dr w, а не dr r

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

Операнд

Пояснения

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

From

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

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

Dreftype

void del dref(long From,long To);

Функция позволяет удалять перекрестную ссылку на данные. Для этого необходимо знать линейные адреса ее источника и приемника. Например:

seg000:2331

seg000:2 934*word 0 2 934

seg000:2331w seg000:2934

Del dref(0x2331,9x2934); seg000:2331

seg000:2 934*word 0 2 934

seg000:2934

mov dw 0

word 0 2934, ax ;

источник

; DATA XREF:

приемник

mov word 0 2934, ax dw 0

К сожалению, нет никакой возможности узнать о результате успешности операции, поскольку функция возвращает тип void.



Часто путают источник и приемник местами, что приводит к ошибкам. Необходимо запомнить, что IDA всегда создает комментарий к перекрестной ссылке возле ее приемника, а не источника.

Поэтому, что бы удалить указанную перекрестную ссылку необходимо воспользоваться следующим кодом:

Del dref(0x2331,9x2934);

Разумеется, что эта функция не пригодна для удаления перекрестных ссылок на

код.

Операнд

Пояснения

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

From

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

long Dfirst (long From);

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

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

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

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

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

seg000:2331

seg000:2 934*word 0 2 934

seg000:2331w seg000:2934

Message("0x%X \n", Dfirst(0x12331)

dw 0

word 0 2934, ax ;

источник

; DATA XREF:

приемник

0x12934

Операнд

Пояснения

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

From

Пояснения

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

Return

long Dnext (long From,long current);

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

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



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

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

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

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

seg000:2331 mov

seg000:26C1 cmp

seg000:277B cmp

seg000:2934* word 0 2934 dw 0

seg000:2331w

seg000:2934*

seg000:26C1r

seg000:2934*

seg000:277Br seg000:2934

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

; DATA XREF:

; приемник

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

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



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