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

0001000E 0001000F 00010010 00010011

db 21h

db 20h

db 0Dh

db 0Ah

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

Для интерактивного создания сегмента достаточно в меню "View" выбрать пункт "Segments" и дождавшись появления списка существующих сегментов (в данном случае -пустого), нажать клавишу <Iinsert> и надлежащим образом заполнить соответствующие поля появившегося диалога. Если предварительно выделить некоторую область курсорными клавишами, удерживая <Shift>, IDA автоматически подставит линейные адреса ее начала и конца в поля адреса начала и адреса конца сегмента соответственно (см. рисунок 17)

Рисунок 17 "0x020" Создание сегмента по выделенной области

Если поле «Segment Name» оставить пустым, IDA присвоит имя сегменту самостоятельно.

По умолчанию базовый адрес равен наибольшему возможному значению, т.е.

Startea

BASEdef = 0x10 , при этом offsetdef = Startea AND 0xF, где offsetdef -- смещение первого

байта в сегменте. Очевидно, что offsetdef < 0xF.

Например, если дозагрузить бинарный файл (~File\Load file\Additional binary file), скажем, Crypt.com, по виртуальному адресу 0x20100 и, выделив его, попытаться создать сегмент, IDA по умолчанию выберет базовый адрес, равный 0x2010, в результате чего смещение первого байта в сегменте будет равно 0x0, а не 0x100! Следует очень внимательно относится к значением, предлагаемым по умолчанию - они не всегда соответствуют требуемым.

В действительности, базовый адрес должен быть равен 0x2000, тогда после создания сегмента экран дизассемблера будет выглядеть так:

Name Start seg000 00000000 seg001 00000100

Program Segmentation

End Align Base Type Cls 32es ss ds fs gs

000012 byte 1000 pub N FFFF FFFF FFFF FFFF FFFF 00010000 00010 00013C byte 2000 pub N FFFF FFFF FFFF FFFF FFFF 00020100 00020

Рисунок 18

Для изменения свойств сегмента достаточно подвести к нему курсор и нажать клавишу <Ctrl-E>. Появится диалоговое окно следующего вида:

Change segment attributes

Segment name Segment class Start address End address

seg001

0x20100 0x2013C

(•) 16-bit segment ( ) 32-bit segment

Combination д (public)



[X] Move adjacent segments [ ] Disable addresses

Alignment (byte)

F1 - Help

Рисунок 19

Интерактивно можно изменять все характеристики и атрибуты сегмента за исключением его базового адреса. На модификацию адресов начала и конца сегмента

наложены некоторые ограничения: (BASE * 0x10) < Startea > Endea, т.е. адрес начала должен быть больше либо равен базовому адресу, умноженному на шестнадцать, а адрес конца сегмента должен быть по крайней мере на единицу превышать адрес начала.

При изменении границ одного из смежных сегментов, IDA автоматически расширит или сузит другой сегмент, если флаг "Move adjacent segments" установлен. Графически это можно изобразить так:


seg000

seg001


seg000 seg001


seg000

«ничейная память» seg001

Рисунок 20 Изменение границ сегментов

??? #Художнику - перерисовать, сохраняя наклон штриховки. Крайняя левая картинка должна изображать как границу сегментов тянут вверх - можно нарисовать привязанную нитку и поднимающую ее руку.

На рисунке (10.a) показано уменьшение нижней границы сегмента seg000, к концу которого вплотную примыкает сегмент seg001. Если флажок "Move adjacent segment" взведен, IDA автоматически изменит адрес начала сегмента "seg001" как показано на рисунке 10.b; напротив сброс этого флажка приведет к тому, что между сегментами образуется дыра «ничейной памяти», изображенная на рисунке 10.c

Установка флажка "Disable addresses" автоматически уничтожит «дыру», удалив принадлежащие ей адреса памяти, вместе с их содержимым. Внимание! Эта операция необратима и вернуть утерянные данные обратно уже не удаться!

Для закрепления всего вышесказанного рекомендуется провести несколько простых экспериментов. Для начала попробуйте расшить границы сегмента "seg000" до адреса 0x20120 (или любого другого, принадлежащего сегменту "seg001"). Одним лишь изменением атрибутов сегмента "seg000" это сделать не удаться - IDA сообщит об ошибке "set segm end(10000) -> 20120: areas overlap" и, независимо от состояния флага "Move adjacent segment", прервет выполнение операции.

Причина в том, что автоматическое изменение границ работает с смежными и только с смежными сегментами, а "seg000" и "seg001" таковыми, очевидно, не являются,



поскольку адрес конца сегмента "seg000" равен 0x10012, а адрес начала "seg001" -

0x20100.

Выполнить поставленную задачу можно, по меньшей мере, двумя путями: первое -предварительно увеличить адрес начала сегмента "seg001" и повторить операцию; второе - увеличить адрес конца сегмента "seg000" до максимально возможного значения (т.е. 0x20100), добившись слияния сегментов, что даст возможность расширить "seg000" до требуемого адреса установкой флага "Move adjacent segment".

Последовательности нажатий клавиш для первого способа: переместить курсор в пределы сегмента "seg001" и нажать <Alt-S>, в поившемся диалоговом окне изменить значение поля "Start address" на 0x20120; затем переместится в границы сегмента "seg000", нажать <Alt-S> и изменить значение поля "End Address" на 0x20120". Задача выполнена.

Последовательности нажатий клавиш для второго способа: переместить курсор в пределы сегмента "seg000" и нажать <Alt-S>, в появившемся диалоговом окне изменить значение поля "End address" на 0x20100, затем повторено вызвав тот же диалог, распахнуть сегмент до требуемо адреса, изменив значение поля "End address" на 0x20120. Задача выполнена.

Программно изменить атрибуты сегмента можно вызовами функций SegCreate, SegBounds, SegRename, SegClass, SegAlign, SegComb, SegAddrng

Функция success SegBounds (long ea,long startea,long endea,long disable) принимает в качестве первого аргумента любой адрес, принадлежащий сегменту, startea, endea - новые адреса начала и конца сегмента соответственно, ненулевое значение флага disable удаляет виртуальную память освободившуюся при уменьшении сегмента (при расширение сегмента его значение игнорируется). Следует помнить, что startea > BEGIN ADDRES * 0x10, т.е. верхнее расширение сегмента жестко ограничено его базовым адресом.

Например, для восстановления сегмента "seg000" до его прежних размеров можно воспользоваться следующим кодом: "SegBounds(0x10000,0x10000,0x10012,1);"

Если базовый адрес создаваемого сегмента больше или равен 0x10000, IDA автоматически создает селектор для его адресации.

Например, результат выполнения "SegCreate(0x100000,0x100100,0x10000,0,0,0);" приведет к следующему:

[] Program Segmentation 3=[t]

Name Start End Align Base Type Cls 32es ss ds fs gs ▲

seg000 00000000 00000012 bye 1000 pub CODE

seg001 00000100 0000013C byte 2000 pub

seg002 000000lili 0 -t """ pub ,, ffff ffff --1-01Г1Г1Г1 00100100 ▼

3/3 ► 1

Базовый адрес сегмента "seg002" равен 0x1, но не смотря на это, смещение первого байта в сегменте равно 0x0, а не 0x1000000 - 0x1 * 0x10 = 0xFFFFF0. Причина в том, что 0x1 - это селектор, а не сегмент. Чтобы убедиться в этом достаточно просмотреть список селекторов, вызвать который можно нажатием "<Alt-V>,<L>":

[] Selectors =3= [ t ] =п

Sel Value ▲

0001 00010000

FFFF

FFFF

FFFF

FFFF

FFFF 00

010000

00010012

020100

0002013C

В отличие от базового адреса, значение селектора легко изменить, для чего достаточно выделить его курсором и нажать <Ctrl-E>. Появится диалоговое окно следующего содержания:

[]Define a selector у



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