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

Long PrevNotTail(long ea)

Функция возвращает линейный адрес головы предыдущего элемента (не предыдущей головы элемента!). Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать.

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

seg000:0000 aHelloIdaPro db 'Hello,IDA Pro!'

seg000:000E a1234 db '1234'

a) исходные данные

Message(“>%s\n”,atoa(NextNotTail(BADADDR)));

b) вызываем функцию PrevNotTail, передавая ей значение BADADDR

>seg000:000E

c) результат – функция вернула адрес головы самого последнего из существующих элемента

Замечание: в отличие от функции NextNotTail, функция PrevNotTail игнорирует бестиповые байты.

??? #Верстальщику – Change table

аргумент

пояснение

ea

линейный адрес, не обязательно принадлежащий какому-то элементу

return

==return

пояснения

!=BADADDR

линейный адрес головы предыдущего элемента

==BADADDR

ошибка

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

Интерактивный аналог: нет

Типы элементов #Definition

Поле флагов головы элемента определяет является ли данный элемент элементом кода или элементом данных (см. главу «Элементы»), а так же уточняет его тип. Например, один и та же цепочка из четырех байт может быть двойным словом, типом float, ASCII-строкой, массивом байт или двойных слов и т.д.

Замечание: типотизация данных – одно из немаловажных достоинств IDA Pro, ощутимо повышающее качество дизассемблирования. В полностью дизассемблированной программе не должно быть ни одного байта данных неопределенного типа.

IDA Pro поддерживает следующие типы данных – байт, слово, двойное слово, четвертное слово, восьмерное слово, float, double, packed real, ASCII-строка, массив, состоящих из любых вышеперечисленных типов, а так же тип align – байты, использующиеся для выравнивания кода (данных) по кратным адресам (см. таблицу 12)

??? #Верстальщику – change table

константа

#

тип

FF_BYTE

0x00000000

байт

FF_WORD

0x10000000

слово

FF_DWRD

0x20000000

двойное слово

FF_QWRD

0x30000000

четвертное слово

FF_TBYT

0x40000000

восьмерное слово

FF_ASCI

0x50000000

ASCII-строка

FF_STRU

0x60000000

структура

FF_XTRN

0x70000000

внешние данные неизвестного размера

FF_FLOAT

0x80000000

float

FF_DOUBLE

0x90000000

double

FF_PACKREAL

0xA0000000

упакованное десятичное целое

FF_ALIGN

0xB0000000

директива выравнивания

Таблица 12 поддерживаемые типы данных

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

Если в результате преобразования, размер элемента уменьшается, его остаток преобразуется в один или несколько бестиповых байт.

Примеры:

seg000:0000 Var db 48h ; H

seg000:0001 db 65h ; e

seg000:0002 db 6Ch ; l

seg000:0003 db 6Ch ; l

seg000:0004 db 6Fh ; o

seg000:0005 Var2 db 2Ch

seg000:0006 db 20h ;

seg000:0007 db 49h ; I

seg000:0008 db 44h ; D

seg000:0009 db 41h ; A

seg000:000A db 20h ;

Бестиповая переменная “Var” может быть преобразована в байт, слово, двойное слово, float, ASCII-строку, но попытка преобразовать ее в четверное, восьмерное слово, double, packed real приведет к ошибке – поскольку тому препятствует элемент данных, расположенный по адресу “seg000:0005”. Если же его уничтожить, преобразование пройдет успешно. Аналогично:

seg000:0000 Var dw 6548h seg000:0000 Var dw 6548h

seg000:0002 db 6Ch seg000:0002 dw 6C6Ch

seg000:0003 db 6Ch

а) преобразование Var в двойное b) преобразование Var в двойное слово

слово возможно невозможно – требуется предварительно

уничтожить следующий за ним элемент

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

seg000:0000 db 6Ch, 6Fh, 2Ch, 20h, 49h, 44h, 41h, 20h, 50h, 72h, 6Fh

seg000:0000 db 21h, 0

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

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

Важно понять – массив в IDA Pro это один элемент, а не совокупность множества элементов другого типа.

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

Если требуется создать строку или массив большего размера, единственный выход – создать два (или более) массивов (строк), расположив их последовательно друг за другом.

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

seg000:0000 db 48h ; H seg000:0000 db 48h ; H

seg000:0001 db 65h ; e seg000:0001 align 2

seg000:0002 db 6Ch ; l seg000:0002 db 6Ch ; l

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

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

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

Строго говоря, элементы кода и данных не являются неделимым целым – IDA Pro предоставляет возможность выборочной работы с их операндами (если они есть) – см. главу «Операнды».

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