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

• float( переменная ) Преобразует переменную в тип float Например:

auto x,s0;x=1;s0="3h"; auto x,s0;x=1;s0="3h";

Message(">%d\n",long(s0)+x); Message(">%d\n",x+long(s0));

>4 >4

На этот раз от перемены мест слагаемых сумма не изменяется!

Директивы

IDA поддерживает следующие стандартные директивы препроцессора:

• #define

#undef #include

• #error

• #ifdef\#ifndef\#else\#endif

Внимание: консоль не поддерживает никаких директив препроцессора - их можно использовать только в IDC-файлах.

Замечание: для использования определений, констант, приводимых в этой книге по ходу описания функций, в исходный код скрипта необходимо включить директиву "#inclide <idc.idc>".

Вызов функций возможен и без включения файла <idc.idc> в исходный листинг - это необходимо только для использования определений, например, таких, как BADADDR.

До вызова консоли IDA самостоятельно подключает к ней этот файл, делая доступными все определения.

Предписания

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

• if, else;

• for;

• while, do, break, continue;

• return

Замечание: цикл "for (expr1; expr2; expr3 ) statement" в отличие от стандартного языка Си не поддерживает более одного счетчика.

Математические и битовые операторы

Поддерживаются следующие математические операторы - сложение: "+", вычитание: умножение: "*", деление "/", приращение на единицу "++". Операторы "+=" и "-=" не поддерживаются.



Поддерживаются следующие битовые операторы - битовое И: "&", битовое ИЛИ:"", битовое НЕТ: "!", битовое ИЛИ-ИСКЛЮЧАЮЩЕЕ-И:"".

Массивы

Встроенной языковой поддержки массивов, наподобие той, что присутствует в Си, у IDA нет.

ВИРТУАЛЬНАЯ ПАМЯТЬ

Архитектура виртуальной памяти

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

IDA использует плоскую 32-разрядную модель виртуальной памяти, предоставляя в распоряжение пользователя немногим менее четырех гигабайт адресного пространства. Наибольший возможный адрес равен 0xFF000000 и для удобства определен в файле <idc.idc> через константу MAXADDR. Попытка задания больших адресов приведет к ошибке.

Адресное пространство виртуальной памяти может быть разбито на один или более сегментов (см. главу «Сегменты и селекторы»), однако, подавляющее большинство встроенных функций IDA ожидают не сегментных, а линейных адресов.

Адресное пространство виртуальной памяти не непрерывно - в нем могут присутствовать «выключенные» адреса, попытка обращения к которым приведет к ошибке. IDA не предоставляет функций, позволяющих манипулировать «включением» -«выключением» адресов. Эта операция может быть выполнена только косвенно - адреса «включаются» при загрузке бинарного файла и создании нового сегмента, а выключаются при его удалении (см. описание функции SegCreate).

С каждым «включенным» адресом виртуальной памяти связана специальная структура данных, включающая в себя 8-разрядную ячейку виртуальной памяти и 24-разрядное поле атрибутов этой ячейки.

Атрибуты, в частности, указывают следует ли отображать ячейку как инструкцию или как данные, в каком виде следует представлять операнды и т.д. Назначение каждого бита атрибутов подробно описано в главах «Элементы», «Типы элементов», «Операнды» и «Объекты». Поле атрибутов доступно не только для косвенного (посредством вызова встроенных в IDA Функций), но и непосредственного чтения и изменения. Однако, разработчики IDA настоятельно рекомендуют избегать непосредственной модификации, поскольку, назначение тех или иных битов атрибутов в последующих версиях дизассемблера может измениться!

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

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

32 16 8

атрибуты

ячейка

Рисунок 13 Строение флага виртуальной памяти



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

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

Технические детали:

Виртуальное адресное пространство представляет собой совокупность индексов всех существующих элементов виртуального массива, а «выключенные» адреса являются отсутствующими индексами виртуального массива.

Виртуальный массив располагается в файле *.id1, формат заголовка которого приведен в таблице 1.

смещение

длина

значение

сигнатура "Va4" - "Virtual Array version 4"

0x2 (Word)

количество непрерывных регионов памяти

0x2 (Word)

количество страниц всего (одна страница равна 4 кб)

0x4 (long)

индекс (он же линейный адрес) первого кванта региона

0x4 (long)

индекс (он же линейный адрес) последнего кванта региона

0x10

0x4 (long)

смещение индекса первого кванта региона в файле *.id1

+0x4

0x4 (long)

индекс (он ж линейный адрес) первого кванта спецую1цего ретона

+0x4

0x4 (long)

индекс (он же линейный адрес) последнего кванта региона

+0x4

0x4 (long)

смение индекса первого кваа следую)щего региона в сфайле *.d1

Таблица 1 структура файла *.id1

Если открыть файл "tutor.id1" в любом шестнадцатеричном редакторе (внимание, это необходимо сделать до выхода из IDA, т.к. при выходе он будет автоматически удален), его начало должно выглядеть так:

00000000: 56 61 34 00 02 00 03 00 00000010: 98 39 00 00 77 07 01 00

66 06 01 00 78 06 01 00

89 07 01 00 DC 5D 00 00

Va4 О V f4© x4© П19 w® Й«© .]

??? #Художнику - используя файл 0x019 o выделить указанные ниже элементы графически (кружочком) со стрелочкой, указывающей на его отношение к нижеследующему описанию, причем левую часть (т.е. указание самого значения поля, отделенную двоеточием) затем удалить.

"Va4": 00 02: 0x10777 и 0x10788 00 03:

4 кб).

сигнатура, позволяющая распознать тип файла

два непрерывных адресных пространства 0x10666

0x10677 и

три страницы виртуальной памяти израсходовано (размер страницы

66 06 01 00: начальный адрес первого непрерывного регион виртуальной памяти

78 06 01 00: конечный адрес первого непрерывного региона виртуальной памяти

98 39 00 00: смещение, по которому хранится первый регион виртуальной памяти в этом файле



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