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

Success SetReg (long ea,char reg,long value);

Функция устанавливает значение сегментных регистров. IDA автоматически отслеживает их значение (и изменение) и хранит его для каждой точки кода.

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

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

Все существующие ассемблеры поддерживают именно такой режим, но программистам иногда требуется установить сегментный регистр по произвольному адресу внутри сегмента (например, для организации плавающего кадра окна для преодоления 64 КБ барьера реального режима на сегмент) SetReg нормально принимает такие значения.

Например:

dseg:0000 start proc near

dseg:0000 mov ax, seg dseg

dseg:0003 mov ds, ax

dseg:0005 assume ds:dseg

dseg:0005 mov dx, offset aHelloSailor ;

dseg:0008 call WriteLn

dseg:000B mov ax, ds

dseg:000D inc ax

dseg:000E mov ds, ax

dseg:0010 assume ds:nothing

dseg:0010 mov dx, 2Fh ; '/'

dseg:0013 call WriteLn

dseg:0016 mov ah, 4Ch

dseg:0018 int 21h

dseg:0018 start endp

dseg:0020 aHelloSailor db 'Hello,Sailor',0Dh,0Ah,'$'

dseg:002F db '$$$$$$$$$$$$$$$$'

dseg:003F aHelloIda db 'Hello,IDA!',0Dh,0Ah,'$'

dseg:003F dseg ends

dseg:003F

dseg:003F

dseg:003F end start

Смещение 0x2F в строке dseg:0x10 на самом деле указывает на строку dseg:0x3F, т.к. перед этим значение DS было увеличено на единицу (один параграф равен шестнадцати байтам) Как «объяснить» это дизассемблеру?

Переведем курсор на строку ‘dseg:0x10’ и используем следующую команду:

SetReg (SreenEA (),”DS”, 0x1001);

Теперь если преобразовать операнд в смещение получиться следующее:

dseg:0010 loc_0_10: ; DATA XREF: start+10o

dseg:0010 mov dx, offset aHelloIda - offset loc_0_10 ; "Hello,IDA!\r\n$"

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

«offset aHelloIda - offset loc_0_10» будет работать только до тех пор, пока метка loc_o_10 будет расположена по смещению 0x10, и нам необходимо заменить ее константой 0x10. Для этого воспользуется, например, функций OpAlt.

SetReg изменяет значение сегментного регистра в каждой точке до следующего ‘ASSUME’ или конца сегмента.

Операнд

пояснения

‘ea’

линейный адрес

‘reg’

символьное название регистра. (“CS”,”DS”,”ES” и т.д.)

‘value’

значение регистра в параграфах

Return

==return

пояснения

==1

Операция была выполнена успешно

==0

Ошибка

Функция SetReg эквивалентна команде меню «~EDIT\Segments\Change segment register value».

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