Анимация
JavaScript
|
Главная Библионтека представляется весьма нетривиальной задачкой. Поэтому, не лишние возложить эту работу на плечи 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 позволяет создавать перекрестные ссылки, указывающие на середину инструкции. Они выделяются красным цветом и располагаются перед указанной инструкцией. Аналогично адрес округляется и при всех попытках перехода.
Обратите внимание, что функция не возвращает никакого значения, по которому можно было бы судить об успешности завершения операции. Вместо этого функция может при необходимости выводить пояснения в окно сообщений, но это не поможет в определении ошибки автономным скриптам. 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.
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 |