Описание функций встроенного языка
Скачать 2.86 Mb.
|
Замечание: линейный адрес начала следующего элемента будет возвращен даже в том случае, если элемент находится в другом сегменте. ??? #Верстальщику – Change Table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу =return пояснения !=BADADDR линейный адрес головы следующего элемента return ==BADADDR ошибка Родственные функции: PrevHead Интерактивный аналог: нет long NextHead(long ea, long maxea) (версия IDA 4.0 и старше) В версии 4.0 прототип функции NextHead(long ea) (см. ее описание) был изменен, добавлением еще одного аргумента – maxea, ограничивающего диапазон адресов, доступных функции. Функция возвращает адрес головы следующего элемента, при условии, что он меньше, чем maxea, т.е. отвечает следующему условию ea < return value < maxea . Изменение прототипа повлекло за собой неработоспособность всех ранее созданных скриптов, использующих эту функцию и необходимости внесения в них исправлений – замены NextHead(ea) на NextHead(ea, BADADDR). Замечание: ограничение максимального адреса облегчает написание скриптов, работающих с выделенными регионами (см. описание функций SelStart и SelEnd) ??? #Верстальщику – Change Table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу maxea значение на единицу превышающее наибольший адрес, доступный функции =return пояснения !=BADADDR линейный адрес головы следующего элемента return ==BADADDR ошибка Родственные функции: PrevHead 92 Интерактивный аналог: нет long PrevHead(long ea) (версия IDA 3.85 и младше) Функция возвращает линейный адрес предыдущей головы элемента (не головы предыдущего элемента!). Если указать на хвост элемента, функция возвратит адрес его головы. Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать. Пример использования: seg000:0000 aHelloIdaPro db 'Hello,IDA Pro!' seg000:000E a1234 db '1234' a) исходные данные Message(“>%s\n”,atoa(PrevHead(SegByName(“seg000”)+0x2))); b) вызываем функцию PrevHead, передавая ей адрес принадлежащий элементу “Hello, IDA Pro!”. >seg000:000E c) результат – функция вернула адрес предыдущей головы элемента (этого элемента) ??? #Верстальщику – Change table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу =return пояснения !=BADADDR линейный адрес предыдущей головы элемента (не головы предыдущего элемента!) return ==BADADDR ошибка Родственные функции: NextHead Интерактивный аналог: нет long PrevHead(long ea, long minea) (версия IDA 4.0 и старше) В версии 4.0 прототип функции PrevHead(long ea) (см. ее описание) был изменен, добавлением еще одного аргумента – minea, ограничивающего диапазон адресов, доступных функции. Функция возвращает адрес предыдущей головы элемента, при условии, что он не меньше, чем minea, т.е. отвечает следующему условию minea ≥ return value > ea . Изменение прототипа повлекло за собой неработоспособность всех ранее созданных скриптов, использующих эту функцию и необходимости внесения в них исправлений – замены PrevHead(ea) на PrevHead(ea, 0). Замечание: ограничение максимального адреса облегчает написание скриптов, работающих с выделенными регионами (см. описание функций SelStart и SelEnd) 93 ??? #Верстальщику – Change Table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу minea минимальный адрес, доступный функции =return пояснение !=BADADDR линейный адрес предыдущей головы элемента (не головы предыдущего элемента!) return ==BADADDR ошибка Родственные функции: NextHead Интерактивный аналог: нет long NextNotTail(long ea) Функция возвращает линейный адрес головы следующего элемента или бестипового байта. Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать. Пример использования: seg000:0000 aHelloIdaPro db 'Hello,IDA Pro!' seg000:000E a1234 db '1234' a) исходные данные Message(“>%s\n”,atoa(NextNotTail(0))); b) вызываем функцию NextNotTail, передавая ей нулевой адрес. >seg000:0000 c) результат – функция вернула адрес головы первого элемента ??? #Верстальщику – Change table аргумент пояснение ea линейный адрес, не обязательно принадлежащий какому-то элементу =return пояснения !=BADADDR линейный адрес головы следующего элемента или бестипового байта return ==BADADDR ошибка Родственные функции: PrevNotTail Интерактивный аналог: нет long PrevNotTail(long ea) Функция возвращает линейный адрес головы предыдущего элемента (не предыдущей головы элемента!). Переданный функции линейный адрес ea не обязательно должен принадлежать какому-то элементу – он может даже вообще не существовать. Пример использования: 94 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 пояснения !=BADADDR линейный адрес головы предыдущего элемента return ==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 восьмерное слово 95 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 Функции трассировки элементов (см. главу «Элементы») будут возвращать только адреса начала массива и следующего за массивом элемента, но не адреса элементов самого массива! Аналогично, функции изменения представления операндов (см. главу 96 «Операнды») будут изменять представление всех элементов массива одновременно, но никак не выборочно. Поэтому, разумно объединять в массив данные лишь тогда, когда они имеют одинаковый тип, одинаковое представление и нет никакой необходимости в индивидуальной работе ни с одним элементом. В противном случае создание массива доставит больше неудобств, чем пользы. Важно понять – массив в 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-строк, 97 начинающихся с байта, содержащего длину строки и DELPHI-строк, начинающиеся со слова (двойного слова), содержащего длину строки. Если строка не принадлежит ни к одному из этих трех типов, концом строки считается: а) первый нечитабельный ASCII-символ. b) неинициализированный байт c) голова элемента кода или данных d) конец сегмента Функция MakeArray создает массив состоящий из данных одного типа – байтов, слов, двойных слов, четверных слов, двойных слов в формате float, четверных слов в формате double, packed real, tbyte. Бестиповые байты могут стать частью массива любого типа. Строки не могут быть элементами никакого массива. Тип массива определяется типом его первого элемента. Все остальные элементы массива на момент его создания должны быть представлены бестиповыми байтами, - последовательность типизированных данных не может быть преобразована в массив. Элементы массива записываются в строку, отделяясь друг от друга знаком запятой. Если два или более подряд идущих элемента имеют одно и то же значение (в том числе и неинициализированное) для сокращения ассемблерного листинга используется конструкция “DUP”. Функция Align помещает в ассемблерный файл директиву выравнивания align и исключает из дизассемблируемого листинга байты, используемые для выравнивания. Функция MakeCode создает по указанному адресу элемент кода, выполняя дизассемблирование первой машинной инструкции. Если это возможно, автоматически дизассемблируется и другие инструкции. Это происходит в следующих случаях: а) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты; b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование. Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки. Функция MakeUnkn разрушает элемент, заданный любым принадлежащим ему адресом, превращая его содержимое в бестиповые байты. Объекты, связанные с элементом (например, метки, комментарии) при этом не уничтожаются. Сводная таблица функций функции создания новых элементов, преобразования и уничтожения элементов имя функции каткое описание success MakeByte(long ea) создает (преобразует) ячейку в байт success MakeWord(long ea) создает (преобразует) ячейку в слово (2 байта) success MakeDword(long ea) создает (преобразует) ячейку в двойное слово (4 байта) success MakeQword(long ea) создает (преобразует) ячейку в четвертное слово (8 байт) success MakeFloat(long ea) создает (преобразует) ячейку в тип float (представление с плавающей запятой 4 байта) success MakeDouble(long ea) создает (преобразует) ячейку в тип Double (представление с плавающей запятой 8 байт) success MakePackReal(long ea) создает (преобразует) ячейку в тип PackReal (от 10 до 12 байт) 98 success MakeTbyte(long ea) создает (преобразует) ячейку в тип Tbyte (10 байт) success MakeStr (long ea,long endea) создает ASCII строку success MakeArray (long ea,long nitems) создает массив success MakeAlign(long ea,long count,long align) создает директиву выравнивания 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 db ? ; unexplored a) исходные данные Message(“>%x\n”,MakeByte(SegByName(“seg000”))); b) вызываем функцию MakeByte для создания нового элемента данных типа байт, передавая ей адрес бестипового байта seg000:0000 db ? >1 с) результат – элемент данных типа байт успешно создан Замечение: в ассемблерном листинге бестиповые байты помечаются комментарием “unexplored” (или ASCII кодом содержимого), сигнализирующим о неисследованости данной ячейки. В полностью дизассемблированной программе не должно остаться ни одного неисследованого байта – тип каждой ячейки должен быть задан явно. |