Анимация
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

аргумент

пояснения

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

comb

Атрибут (смотри определения в таблице 6)

return

=return

Успешность завершения операции

Операция завершилась успешно

При выполнении операции произошла ошибка

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

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

success SegClass(long ea,char class)

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

Атрибут класса представляет собой текстовую строку, указывающую линкеру порядок следования сегментов. Если это не запрещено комбинаторным атрибутом (см. описание SegComb), линкер объединяет вместе сегменты с одинаковым именем. Рекомендуется назначать имена так, чтобы они отображали функциональное назначение сегментов, например, "CODE", "DATA", "STACK" и т.д. Общепринятые имена перечислены в таблице ???.

Замечание: большинство линкеров требуют, чтобы в объективном файле присутствовал хотя бы один сегмент с именем "CODE", в противном случае, они могут отказаться обрабатывать такой файл или обработают его неправильно.

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

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

a) создаем сегмент с атрибутом public

seg000:0000 seg000 segment at 100h public

b) сегмент создан, по умолчанию атрибут класса сегмента отсутствует

SegClass(0x1000,"MySegment");

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

seg000:0000 seg000 segment at 100h public MySegment

d) атрибут класса сегмента изменен (в тексте он выделен жирным шрифтом)

Класс

Пояснения

CODE

Pure code

Сегмент кода

DATA

Pure data

CONST

Pure data

Сегмент данных

Uninitialized data

Неиницилизированные данные

STACK

Uninitialized data

Сегмент стека

XTRN

Extern definitions segment

Таблица 7 Общепринятые наименования классов сегментов

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



аргумент

пояснения

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

class

класс сегмента

return

=return

Успешность завершения операции

Операция завершилась успешно

При выполнении операции произошла ошибка

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

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

success SegDefReg(long ea,char reg,long value)

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

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

Аргумент reg задает сегментный регистр в символьном представлении, например, "DS","ES","SS" и т.д. Строчечные и прописные символы не различаются. Тип процессора при назначении сегментного регистра учитывается.

Аргумент value содержит базовый адрес сегмента, загружаемый в регистр и выраженный в параграфах. Если сегмента с указанным базовым адресом не существует, регистр приобретает неопределенное ("nothing") значение.

В реализации этой функции допущена одна ошибка - независимо от успешности выполнения, возвращаемое значение никогда не сигнализирует об ошибке.

Пример использования (см. файл "assume.idb", содержащийся на диске, прилагаемом к книге): пусть имеется один сегмент кода ("seg00") и два сегмента данных ("seg001" и "seg002"), содержащих переменные "My666" и "My777" соответственно. По умолчанию значения сегментных регистров неопределенны и IDA не может определить к каким именно сегментам происходит обращения в командах "mov ax,ds:[0]" и "mov dx,es:[0]", поэтому, вынуждена оставить операнды в виде непосредственных смещений. (в тексте они выделены жирным шрифтом)

seg000:0000 seg000 segment byte public CODE

seg000:0000 assume cs:seg000

seg000:0000 assume es:nothing, ss:nothing, ds:nothing

seg000:0000 nov ax, ds:0

seg000:0003 mov dx, es:0

seg000:0003 seg000 ends

seg000:0003

seg001:0000 ;

seg001:0000

seg001:0000 ; Segment type: Pure data

seg001:0000 seg001 segment byte public DATA

seg001:0000 assume cs:seg001

seg001:0000 My666 dw 6666h

seg001:0000 seg001 ends

seg001:0000

seg002:0000 ;



seg002:0000

seg002:0000 ; Segment type: Pure data

seg002:0000 seg002 segment byte public DAT

seg002:0000 assume cs:seg002

seg002:0000 My777 dw 7777h

seg002:0000 seg002 ends

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

DefSegReg(SegByName("seg000"), "DS", SegByName("seg001")»4); DefSegReg(SegByName("seg000"), "ES", SegByName("seg002")»4);

В результате ее выполнения, IDA смогла отследить обращения к переменным, автоматически подставив их имена вместо смещений (в тексте они выделены жирным шрифтом). Поместив курсор в границы того или другого имени, нажатием клавиши <Enter> можно перейти к соответствующей ячейке памяти.

seg000:0000 seg000 segment byte public CODE

seg000:0000 assume cs:seg000

seg000:0000 assume es:seg002, ss:nothing, ds:seg001

seg000:0000 mov ax,

seg000:0003 mov dx, es:777

seg000:0003 seg000 ends

seg000:0003

seg001:0000 ;

seg001:0000

seg001:0000 ; Segment type: Pure data

seg001:0000 seg001 segment byte public DATA

seg001:0000 assume cs:seg001

seg001:0000 My666 dw 6666h ; DATA XREF: seg000:0000r

seg001:0000 seg001 ends

seg001:0000

seg002:0000 ;

seg002:0000

seg002:0000 ; Segment type: Pure data

seg002:0000 seg002 segment byte public DATA

seg002:0000 assume cs:seg002

seg002:0000 My777 dw 7777h ; DATA XREF: seg000:0003r

seg002:0000 seg002 ends

seg002:0000

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

аргумент

пояснение

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

сегментный регистр в строковом представлении (например, "DS")

базовый адрес сегмеа, загруемого в реги, выранный в параграфах

return

всегда единица

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

Интерактивный аналог: "~Edit\Segments\Change segment register value", <Alt-G>



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