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

Элемемены #Defenition

С каждым адресом виртуальной памяти связано 32-разрядное поле флагов (см. главу «Виртуальная память»). Флаги хранят содержимое ячейки, описывают ее представление и указывают на наличие связанных с ней объектов.

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

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

Связанные объект: флаги указывают на наличие на наличие связанных с ячейкой объектов – меток, имен, комментариев и т.д. Сами объекты хранятся в отдельном виртуальном массиве, проиндексированного линейными адресами. В принципе без флагов, ссылающихся на объекты можно было бы и обойтись, но тогда бы пришлось при отображении каждой ячейки просматривать все виртуальные массивы на предмет поиска объектов, ассоциированных с данным линейными адресом, что отрицательно сказалось бы на производительности дизассемблера. Напротив, перенос этой информации в флаги позволяет ускорить работу – обращение к виртуальному массиву происходит только в тех случаях, когда с ячейкой заведомо связан какой-то объект. (см. главу «Объекты»)

Размер машинных инструкций и типов данных различен, и это не дает возможности быстро определить к какой инструкции (переменной) принадлежит ячейка с таким-то линейным адресом. Можно провести следующую аналогию – текст со словами не отделенными друг от друга пробелами из произвольной точки читать невозможно, поскольку неизвестно чем является та или иная буква – началом слова или его серединой.

Образно говоря, при дизассемблировании IDA разбивает исследуемый файл на «слова», в терминологии разработчиков - элементы.

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

Первая ячейка элемента называется головой, а все, последующие за ней – хвостом. Элементы единичной длины состоят только из головы и не имеют хвоста.

Признаком головы является ненулевое значение бита FF_DATA (см. таблицу 10) поля флагов. Соответственно признаком хвоста является нулевое значение бита FF_DATA и ненулевое значение бита FF_TAIL.

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

Существуют элементы двух видов – элементы кода (CODE) и элементы данных.(DATE).

Вид элемента задается сочетанием дух битов FF_DATA и FF_TAIL следующим образом (см. таблицу 11) – если бит головы (FF_DATA) установлен, то значение бита хвоста (FF_TAIL) интерпретируется типом элемента – его единичное значение задает тип CODE, в противном случае – DATA; напротив, если бит головы сброшен, единичное значение бита FF_TAIL трактуется признаком хвоста элемента; если же оба бита FF_DATA и FF_TAIL сброшены – элемент считается неопределенным (unexplored), т.е. несуществующим.

бит

A

9

8

7

1

0

поле флагов

поле содержимого

обозначение

FF_DATA

FF_TAIL

FF_IVL

MS_VAL

назначение

Голова

голова

хвост

==1

==0

содержимое ячейки

тип элемента

признак хвоста

инициализи

рованный

байт

не

инициализи

рованный

байт

==0

==1

==1

DATA

CODE

маска

0x400

0x200

0x100

0xFF

Таблица 10 устройство элемента

FF_DATA

0

1

FF_TAIL

0

неопределенный элемент

FF_UNK

элемент данных, голова

FF_DATA

1

хвост элемента

FF_FAIL

элемент кода, голова

FF_CODE

Таблица 11 Определение типа элемента

Хвостовые флаги в двенадцати старших битах содержат смещения относительно начала и конца элемента. Флаги, расположенные по четному линейному адресу – относительно конца, а флаги расположенные по нечетному линейному адресу – относительно его начала.

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

Замечание: в файле <INCLUDE\Bytes.hpp>, входящим в IDA SDK определена функция, возвращающая значение хвостовых бит “inline ushort gettof(flags_t F) { return ushort((F & TL_TOFF) >> TL_TSFT); }

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

Элементы могут существовать только внутри сегментов – попытка создания элемента по адресу, не принадлежащему ни одному сегменту, обречена на провал.

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