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

Success SegAddrng(long ea,long use32)

Функция изменяет разрядность сегмента, определяя каким образом будет дизассемблироваться машинные инструкции.

На платформе Intel 386+ префикс 0x66 перед инструкцией в 16-разрядном сегменте указывает на использование 32-битных операндов и, соответственно, в 32-разрядном сегменте наоборот. Изменение адресации так же затрагивает интерпретацию префикса предопределения адреса - 0x67, видов адресации и т.д.

Неверный выбор разрядности сегмента приводит к некорректному дизассемблированию – появлению бессмысленного «мусора», бессвязных инструкций.

IDA определяет разрядность сегмента на основе информации, содержащейся в заголовках файлов. При загрузке бинарных файлов, равно как и MS-DOS exe файлов разрядность созданных сегментов по умолчанию равна нулю. Если IDA неправильно определила разрядность одного или нескольких сегментов, ее следует исправить вручную.

Внимание: изменение разрядности сегмента уничтожает все результаты дизассемблирования – метки, функции, переменные и т.д.

Аргумент ea задает любой линейный адрес, принадлежащий сегменту. Если передать адрес не принадлежащий никакому сегменту, функция возвратит ошибку.

Нулевое значение аргумента use32 указывает на 16-битовую разрядность сегмента и приводит к помещению в ассемблерный листинг атрибута размера сегмента use16; в противном случае сегмент считается 32-разрядным, а атрибут размера сегмента – use32.

Независимо от разрядности сегмента, IDA всегда выражает смещения 32-битовыми значениями и допустимо создания 16-разрядного сегмента размером более 64 килобайт, однако, следует помнить, что в дальнейшем такой «большой» сегмент не сможет быть ассемблирован.

Функция не учитывает выбранный тип процессора и допускает использование 32-разрядного режима даже с 8086 (!) процессором.

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

SegCreate(0x1000,0x2000,0x100,0,0,0);

a) Создание 16-разрядного сегмента

seg000:0000 seg000 segment at 100h private '' use16

b) Сегмент успешно создан. Атрибут размера сегмента выделен жирным шрифтом.

SegAddrng(0x1000,1);

c) Вызов функции SegAddrng для изменения разрядности сегмента

seg000:00000000 seg000 segment at 100h private '' use32

e) Разрядность сегмента успешно изменена

??? #верстальщику – change table

аргумент

пояснения

ea

линейный адрес, принадлежащий сегменту

use32

=use32

пояснения

==0

16-разрядный сегмент

==1

32-разрядный сегмент

return

=return

пояснения

==1

успешное завершение операции

==0

ошибка

Родственные функции: SegCreate

Интерактивный аналог: “~View\Segments”, <Ctrl-E>; <Alt-S>

Success SegAlign(long ea,long alignment)

Функция управляет выравниванием сегмента, помещая в ассемблерный текст соответствующий атрибут вырывания (byte, word, dword, para, page, mempage). Подробнее о каждом из этих атрибутов можно прочитать в документации, прилагаемой к используемому линкеру.

Никакого влияния на дизассемблируемый образ файла функция не оказывает и не выравнивает сегмент в виртуальной памяти. Это подтверждает следующий эксперимент:

SegCreate(0x1003,0x2000,0x100,0,0,0);

a) создание нового сегмента с адресом начала равным 0x1003

seg000:0003 seg000 segment at 100h private '' use16

b) сегмент создан; смещение первого байта в сегменте равно трем

Message(">1%x\n",SegAlign(0x1003,saRelWord));

c) вызов функции SegAlign для выравнивания сегмента по границе слова

seg000:0003 seg000 segment word private '' use16

>1

d) результат – функция поместила в ассемблерный текст атрибут выравнивания ‘word’ (он выделена жирным шрифтом) и сигнализировала об успешном завершении. Но линейный адрес начала сегмента не был изменен (он выделен жирным шрифтом)!

Атрибут выравнивания возымеет действие только на стадии компоновки объективного файла, расположив сегмент по адресу, кратным двум. Это приведет к несоответствию смещений в дизассемблируемом и целевом файле, что, скорее всего, вызовет невозможность корректного выполнения откомпилированной программы. Для выравнивания сегмента в виртуальной памяти следует воспользоваться функцией SegBounds для перемещения его начала по заданному адресу.

Аргумент ea задает любой линейный адрес, принадлежащий сегменту. Если передать адрес не принадлежащий никакому сегменту, функция возвратит ошибку.

Аргумент alignment представляет собой атрибут выравнивания сегмента и может принимать одно из значений, перечисленных в таблице ???

определение

#

пояснения

saAbs

0

Безусловное выравнивание

saRelByte

1

Выравнивание по границе байта (8 бит)

saRelWord

2

Выравнивание по границе слова (16 бит)

saRelPara

3

Выравнивание по границе параграфа (16 байт)

saRelPage

4

Выравнивание по границе страницы (256-байт для чипов Intel)

saRelDble

5

Выравнивание по границе двойного слова (4 байта)

saRel4K

6

Выравнивание по границе страницы (4 килобайта для PharLap OMF)8

saGroup

7

Segment group

saRel32Bytes

8

Выравнивание по границе 32 байта

saRel64Bytes

9

Выравнивание по границе 64 байта

saRelQword

10

Выравнивание по границе 8 байт

Таблица 5

??? #верстальщику – change table

аргумент

пояснения

ea

линейный адрес, принадлежащий сегменту

alignment

кратность выравнивания (смотри определения в таблице выше)

return

=return

пояснения

==1

успешное завершение операции

==0

ошибка

Родственные функции: SegCreate

Интерактивный аналог: “~View\Segments”, <Ctrl-E>; <Alt-S>

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