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

«Операнды») будут изменять представление всех элементов массива одновременно, но никак не выборочно.

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

Важно понять - массив в 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 предоставляет возможность выборочной работы с их операндами (если они есть) - см. главу «Операнды».

Навигатор по функуциям

Группа функций MakeByte, MakeWord, MakeDword, MakeQword, MakeFloat, MakeDouble, MakePackedReal, MakeTbyte предназначена для преобразования цепочки бестиповых байт (или уже существующего элемента данных) в элемент данных типа байт, слово, двойное слово, четвертное слово, float, double, PackedReal и восьмерное слово соответственно.

Интерактивный аналог первый трех функций пункт "Data" меню "~Edi" (или «горячая клавиша "D"»>, циклично преобразующий тип элемента, находящегося под курсором в байт, слово и двойное слово. При необходимости в эту последовательность можно включить и другие типы данных, вызвав диалог "Setup data types" из меню "Options" («горячая клавиша - "Alt-D"»).

Функция MakeStr преобразует цепочку бестиповых байт в ASCII-строку заданной длины или попытается определить ее автоматически. Автоматически распознаются длины следующих типов строк- ASCIIZ-строк, заканчивающихся символом нуля; PASCAL-строк,



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

a) первый нечитабельный ASCII-символ.

b) неинициализированный байт

c) голова элемента кода или данных

d) конец сегмента

Функция MakeArray создает массив состоящий из данных одного типа - байтов, слов, двойных слов, четверных слов, двойных слов в формате float, четверных слов в формате double, packed real, tbyte. Бестиповые байты могут стать частью массива любого типа. Строки не могут быть элементами никакого массива.

Тип массива определяется типом его первого элемента. Все остальные элементы массива на момент его создания должны быть представлены бестиповыми байтами, -последовательность типизированных данных не может быть преобразована в массив.

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

Функция Align помещает в ассемблерный файл директиву выравнивания align и исключает из дизассемблируемого листинга байты, используемые для выравнивания.

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

a) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты;

b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса

Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование.

Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки.

Функция MakeUnkn разрушает элемент, заданный любым принадлежащим ему адресом, превращая его содержимое в бестиповые байты. Объекты, связанные с элементом (например, метки, комментарии) при этом не уничтожаются.

Сводная таблица функций

функции создания нов1х элементов, преобразования и уничтожения элементов

имя функции

каткое описание

success MakeByte(long ea) success MakeWord(long ea) success MakeDword(long ea)

success MakeQword(long ea)

success MakeFloat(long ea)

success MakeDouble(long ea)

success MakePackReal(long ea)

создает (преобразует) ячейку в байт

создает (преобразует) ячейку в слово (2 байта)

создает (преобразует) ячейку в двойное слово (4

байта)

создает (преобразует) ячейку в четвертное слово (8 байт)

создает (преобразует) ячейку в тип float (представление с плавающей запятой 4 байта) создает (преобразует) ячейку в тип Double (представление с плавающей запятой 8 байт) создает (преобразует) ячейку в тип PackReal (от 10 до 12 байт)



success MakeTbyte(long ea)

создает (преобразует) ячейку в тип Tbyte (10 байт)

success MakeStr (long ea,long endea) success MakeArray (long ea,long nitems) success MakeAlign(long ea,long count,long align)

создает ASCII строку создает массив

создает директиву выравнивания

long MakeCode(long ea)

дизассемблирует одну (или больше) инструкций

void MakeUnkn (long ea,long expand);

уничтожает элемент

функции возвращающие свойства элементов

имя функции

краткое описание

char GetMnem (long ea)

возвращает мнемонику инструкции в символьном виде

функции, поиска элементов

имя функции

краткое описание

long FindCode(long ea, long flag)

long FindData(long ea,long flag)

long FindUnexplored(long ea,long flag)

long FindExplored(long ea, long flag);

возвращает линейный адрес ближайшего элемента кода

возвращает линейный адрес ближайшего элемента данных

возвращает линейный адрес ближайшего бестипового байта

возвращает линейный адрес ближайшего элемента

success MakeByte(long ea)

Функция создает по переданному ей линейному адресу ea элемент данных типа

байт.

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

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

Наличие неинициализированных байт в создаваемом или преобразуемом элементе не является препятствием для выполнения этой функции.

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

1.эксперимент

seg000:0000

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

db ? ; unexplored

Message(">%x\n",MakeByte(SegByName("seg000")));

b) вызываем функцию MakeByte для создания нового элемента данных типа байт, передавая ей адрес бестипового байта

seg000:0000 db ?

>1

c) результат - элемент данных типа байт успешно создан

Замечение: в ассемблерном листинге бестиповые байты помечаются комментарием "unexplored" (или ASCII кодом содержимого), сигнализирующим о неисследованости данной ячейки. В полностью дизассемблированной программе не должно остаться ни одного неисследованого байта - тип каждой ячейки должен быть задан явно.



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