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

Директивы

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

0

атрибуты

ячейка

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

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

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

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

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

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

смещение

длина

значение

0x0

0x4

сигнатура “Va4” – “Virtual Array version 4”

0x4

0x2 (Word)

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

0x6

0x2 (Word)

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

0x8

0x4 (long)

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

0xC

0x4 (long)

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

0x10

0x4 (long)

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

+0x4

0x4 (long)

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

+0x4

0x4 (long)

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

+0x4

0x4 (long)

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

...

...

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

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

00000000: 56 61 34 00 02 00 03 00 │ 66 06 01 00 78 06 01 00 Va4 ☻ ♥ f♠☺ x♠☺

00000010: 98 39 00 00 77 07 01 00 │ 89 07 01 00 DC 5D 00 00 Ш9 w•☺ Й•☺ ▄]

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

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

00 02: два непрерывных адресных пространства 0x10666 – 0x10677 и 0x10777 и 0x10788

00 03: три страницы виртуальной памяти израсходовано (размер страницы 4 кб).

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

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

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

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

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

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

По смещению 0x003998 (помним об обратном порядке байтов) в файле “tutor.id1” находится следующее содержимое:

00003998: 68 21 00 00│45 01 00 00│4C 01 00 00│4C 01 00 00 H! ell

000039A8: 4F 01 00 00│0C 01 00 00│00 01 00 00│69 01 00 00 o,☺ ☺ I

000039B8: 64 01 00 00│61 01 00 00│00 01 00 00│70 01 00 00 DA☺ ☺ P

000039C8: 52 01 00 00│4F 01 00 00│21 01 00 00│20 01 00 00 ro!☺ ☺

000039D8: 0D 01 00 00│FF 01 00 00│00 00 00 00│00 00 00 00 ♪☺  ☺

Это и есть флаги виртуальной памяти, содержащие, ячейки и атрибуты виртуальной памяти, читая которые через каждый четвертый байт, можно разобрать “Hello, IDA Pro!”

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