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

Long GetFixupTgtSel(long ea);

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

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

C0000000 ; Segment type: Pure code

C0000000 LCOD segment para public 'CODE' use32

C0000000 assume cs:LCOD

C0000000 ;org 0C0000000h

C0000000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing

C0000000 Service_Table_0 dd offset unkserv_0 ; DATA XREF: LCOD:C0000040

Message("0x%X, 0x%X \n",

GetNextFixupEA(0),

GetFixupTgtSel(GetNextFixupEA(0)

)

);

0xC0000000, 0x2

Операнд

Пояснения

ea

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

Return

Завершение

Пояснения

!=BADADDR

Селектор перемещаемого элемента

==BADADDR

Ошибка

Long GetFixupTgtOff(long ea);

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

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

C0000000 ; Segment type: Pure code

C0000000 LCOD segment para public 'CODE' use32

C0000000 assume cs:LCOD

C0000000 ;org 0C0000000h

C0000000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing

C0000000 Service_Table_0 dd offset unkserv_0 ; DATA XREF: LCOD:C0000040

Message("0x%X, 0x%X \n",

GetNextFixupEA(0),

GetFixupTgtOff(GetNextFixupEA(0)

)

);

0xC0000000, 0xC0003514

Операнд

Пояснения

ea

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

Return

Завершение

Пояснения

!=BADADDR

Смещение перемещаемого элемента

==BADADDR

Ошибка

Long GetFixupTgtDispl(long ea);

Функция возвращает displacement перемещаемого элемента, заданного линейным адресом. В настоящее время на платформе Intel практически не используется и подробнее описана в факультативном приложении к книге «Использование IDA на не-Intel платформах»

Операнд

Пояснения

ea

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

Return

Завершение

Пояснения

!=BADADDR

Displacement перемещаемого элемента

==BADADDR

Ошибка

Void SetFixup(long ea,long type,long targetsel,long targetoff,long displ);

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

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

Тип перемещаемого элемента может принимать одно из следующих значений:

FIXUP_MASK

0xF

FIXUP_BYTE

FIXUP_OFF8

Восьми битное смещение

FIXUP_OFF8

0

FIXUP_OFF16

1

16-битное смещение

FIXUP_SEG16

2

16-битный сегмент (селектор)

FIXUP_PTR32

3

32-битный длинный указатель (16-бит база; 16-бит селектор)

FIXUP_OFF32

4

32-битное смещение

FIXUP_PTR48

5

48-битный указатель (16-бит база; 32-бит смещение).

FIXUP_HI8

6

Старшие 8 бит 16-битного смещения

FIXUP_HI16

7

Старшие 16 бит 32-битного смещения

FIXUP_LOW8

8

Младшие 8 бит 16-битного смещения

FIXUP_LOW16

9

Младшие 16бит 32-битного смещения

FIXUP_REL

0x10

fixup is relative to the linear address specified in the 3d parameter to set_fixup()

FIXUP_SELFREL

0x0

elf-relative? - disallows the kernel to convert operands in the first pass- this fixup is used during output This type of fixups is not used anymore. Anyway you can use it for commenting purpose in the loader modules

FIXUP_EXTDEF

0x20

target is a location (otherwise - segment)

FIXUP_UNUSED

0x40

fixup is ignored by IDA disallows the kernel to convert operands- this fixup is not used during output

FIXUP_CREATED

0x80

fixup was not present in the input file

Следующие два аргумента задают селектор (сегмент) и смещение объекта, на который ссылается перемещаемый элемент.

Например:

seg000:0000 start proc near

seg000:0000 mov ax, seg dseg

seg000:0003 mov ds, ax

seg000:0005 assume ds:dseg

seg000:0005 mov ah, 9

seg000:0007 mov dx, 0Ch

seg000:000A int 21h ; DOS - PRINT STRING

seg000:000A ; DS:DX -> string terminated by "$"

seg000:000C mov ax, seg dseg

seg000:000F mov ds, ax

seg000:0011 mov ah, 9

seg000:0013 mov dx, 0Ch

seg000:0016 int 21h ; DOS - PRINT STRING

seg000:0016 ; DS:DX -> string terminated by "$"

seg000:0018 mov ah, 4Ch

seg000:001A int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)

seg000:001A start endp ; AL = exit code

seg000:001A

seg000:001A seg000 ends

seg000:001A

dseg:000C ; ---------------------------------------------------------------------------

dseg:000C

dseg:000C ; Segment type: Pure data

dseg:000C dseg segment para public 'DATA' use16

dseg:000C assume cs:dseg

dseg:000C ;org 0Ch

dseg:000C aHelloSailor db 'Hello,Sailor!',0Dh,0Ah,'$'

dseg:000C dseg ends

В приведенном выше коде перемещаемый элемент был создан вызовом:

SetFixup(0x10001, FIXUP_SEG16, 0, 0x1001, 0);

Операнд

Пояснения

ea

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

Type

Тип перемещаемого элемента

sel

Селектор

off

Смещение

Displ

Displacement

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