Анимация
JavaScript


Главная  Библионтека 

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

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

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

use32

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

аргумент

пояснения

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

use32

=use32

пояснения

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

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

return

=return

пояснения

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

ошибка



Родственные функции: 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(0x10 03,saRelWord));

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

segment word private

use16

seg000:0003 seg000

>1

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

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

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

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

определение

пояснения

saAbs

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

saRelByte

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

saRelWord

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

saRelPara

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

saRelPage

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

saRelDble

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

saRel4K

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

saGroup

Segment group

saRel32Bytes

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

saRel64Bytes

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

saRelQword

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

Не поддерживается стандартным линкером LINK.



Таблица 5

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

аргумент

пояснения

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

alignment

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

return

=return

пояснения

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

ошибка

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

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

success SegComb(long segea,long comb)

Функция управляет объединением сегментов, помещая в ассемблерный листинг атрибут комбинирования (private, public, common, at, stack).

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

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

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

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

SegCreate(0x10 0 0,0x2 0 0 0,0x10 0,0,0,scPub);

a) создаем новый сегмент с атрибутом комбинирования public

seg000:0000 seg000 segment at 100h public

b) сегмент успешно создан, атрибут комбинирования выделен жирным шрифтом

SegComb(0x10000,scStack);

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

seg000:0000 seg000

segment at 100h stack

d) атрибут комбинирования изменен

определение

пояснения

scPriv

Атрибут private. Не может быть соединен ни с одним другим сегментом

scPub

Атрибут public. Может быть объединен с другими сегментами с учетом требуемого выравнивания

scPub2

Атрибут, определенный Microsoft, то же самое, что и scPub .

scStack

Атрибут stack. Может быть объединен с public сегментами, но с выравниваем в один байт.

scCommon

Атрибут common.

scPub3

Атрибут, определенный Microsoft, то же самое, что и scPub .

Таблица 6

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



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