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

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

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

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

Например:

seg000:002B 11 02 dw 211h

seg000:002D ; -----------------------------------------

seg000:002D E8 AD 00 call sub_0_DD ; CODE XREF: seg000:0395p

seg000:002D ; seg000:22F5p

seg000:0030 BE BA 02 mov si, 2BAh

seg000:0033 E8 A7 00 call sub_0_DD

seg000:0036 C3 retn

DelCodeXref(0x10395,0x1002D,1);

DelCodeXref(0x122F5,0x1002D,1);

seg000:002B 11 02 dw 211h

seg000:002D E8 db 0E8h

seg000:002E AD db 0ADh

seg000:002F 00 db 0

seg000:0030 BE db 0BEh

seg000:0031 BA db 0BAh

seg000:0032 02 db 2

seg000:0033 E8 db 0E8h

seg000:0034 A7 db 0A7h

seg000:0035 00 db 0

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

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 pop es

seg000:0150 pop ds

DelCodeXref(0x1013B,0x1014F,0);

DelCodeXref(0x10146,0x1014F,1);

seg000:014C stosb

seg000:014D loop loc_0_143 ; 

seg000:014F

seg000:014F loc_0_14F: ; 

seg000:014F pop es

seg000:0150 pop ds

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

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

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

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

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

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

DelCodeXref(0x1014F,0x1014D,1);

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

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

seg000:014C stosb

seg000:014D loop loc_0_143

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

seg000:014F unk_0_14F db 7 ;

seg000:0150 db 1Fh ;

seg000:0151 db 0C7h ; ¦

seg000:0152 db 5 ;

seg000:0153 db 29h ; )

seg000:0154 db 0 ;

seg000:0155 db 0C7h ; ¦

seg000:0156 db 45h ; E

seg000:0157 db 1 ;

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

Операнд

Пояснения

From

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

To

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

undef

==1

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

==0

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

Return:

Пояснения

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

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