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

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

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

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

seg000:0C29 seg000:0C2D

seg000:0C30

seg000:0C33

seg000:0C29J

mov dx, word ptr byte 0 F76

call sub 0 EF8

call sub 0 F45

jb loc 0 C69 ; CODE XREF:

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

Заметим, что в зависимости от некоторых настоек, при создании перекрестных ссылок типа «вызов процедуры» IDA может автоматически создавать процедуру на месте приемника, даже если сама ссылка ошибочная.

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

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

Операнд

Пояснения

From

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

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

flowtype

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

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

long DelCodeXref(long From,long To,int undef);

Функция удаляет перекрестную ссылку типа code. Для этого необходимо знать ее источник (From) и приемник (To). Подробнее об этом можно прочитать в описании функции

AddCodeXref.

Имеется возможность автоматически помечать приемник (и все последующие инструкции) как undefined, если на них больше не указывает ни одной ссылки. Для этого флаг undef необходимо установить равным единице.

Например:

seg000:002B 11 02 seg000:002D

dw 211h

seg000:002D E8 AD 00 XREF: seg000:0395p

call sub 0 DD ; CODE



seg000:002D seg000:22F5p seg000:0030 BE BA 02

seg000:0033 E8 A7 00

seg000:0036 C3

call

retn

si, 2BAh sub 0 DD

DelCodeXref(0x10395,0x1002D,1); DelCodeXref(0x122F5,0x1002D,1);

seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000: seg000:

002B 11

002D E8

002E AD

002F 00

0030 BE

0031 BA

0032 02

0033 E8

0034 A7

0035 00

dw 211h

db 0E8h db 0ADh db 0 db 0BEh db 0BAh db 2 db 0E8h db 0A7h db 0

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

seg000:014C

seg000:014D

seg000:014F

seg000:014F loc 0 14F:

seg000:013Bj

seg000:014F

seg000:0146j

seg000:014F

seg000:0150

stosb loop

pop pop

loc 0 143

; CODE XREF:

DelCodeXref(0x1013B,0x1014F,0); DelCodeXref(0x10146,0x1014F,1);

seg000:014C

seg000:014D

seg000:014F

seg000:014F loc 0 14F:

seg000:014F

seg000:0150

stosb loop

pop pop

loc 0 143 ; =

На самом же деле мы удалили не все перекрестные ссылки. IDA поддерживает и при необходимости автоматически создает так называемую ссылку на следующую команду.

Однако они не отображается явно на экране, но, тем не менее, скрыто присутствует, увеличивая счетчик ссылок на единицу.

DelCodeXref проверяет значение счетчика, убеждается, что он больше нуля и не преобразует код в undefined.

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



То есть seg000:0x14F или 0x1014F, а источником линейный адрес начала предыдущей инструкции. В нашем случае это 0x1014D.

Теперь можно вызвать функцию DelCodeXref и удалить эту перекрестную ссылку.

DelCodeXref(0x1014F,0x1014D,1);

Это сработало! Счетчик перекрестных ссылок стал равен нулю, и IDA пометила приемник и нижележащий код, как undefined.

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

seg000:014C seg000:014D

seg000:014D ; --------

seg000:014F unk 0 14F

seg000:0150 seg000:0151 seg000:0152 seg000:0153 seg000:0154 seg000:0155 seg000:0156 seg000:0157

stosb

loop

loc 0 143

db 7 db 1Fh db 0C7h db 5 db 29h db 0 db 0C7h db 45h db 1

При этом функция возвратит единицу. Это сигнал того, что код успешно преобразован в undefined.

Операнд

Пояснения

From

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

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

undef

Преобразовывать код в undefined, когда на него не останется ссылок

Не преобразовывать код в undefined, когда на него не останется ссылок

Return:

Пояснения

==1 если код успешно преобразован в undefined

long Rfirst (long From);

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

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

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

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

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



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