Описание функций встроенного языка
Скачать 2.86 Mb.
|
Замечание: подробнее о поддержке локальных переменных можно Функция возвращает операнд в строковом виде, т.е. том виде, в каком дизассемблер отображает его на экране. Пример использования: seg000:0000 mov ax, 9 a) исходные данные – требуется получить операнды в том виде, в котором они 134 отображены на экране. Message(“>%s,%s\n”,GetOpnd(SegByName(“seg000”),0), GetOpnd(SegByName(“seg000”),1)); b) вызов функции GetOpnd для получения операндов в том виде, в котором они отображены на экране >ax, 0 c) результат ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд n ==1 второй слева операнд =return пояснения ==1 операция выполнена успешно return ==0 ошибка Родственные функции: GetOpType, GetOperandValue Интерактивный аналог: нет char AltOp (long ea,long n) Функция возвращает операнд, определенный пользователем (см. описание функции OpAlt). seg000:0000 mov Регистр AX, 9 a) исходные данные Message(“>%s\n”,AltOp(SegByName(“seg000”),1)); b) вызов функции AltOp для получения операнда, опеределенного пользователем >Регистр AX c) результат – получен операнд, определенный пользователем ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд n ==1 второй слева операнд =return пояснения ==1 операция выполнена успешно return ==0 ошибка Родственные функции: OpAlt Интерактивный аналог: нет 135 long GetOpType (long ea,long n) Функция возвращает тип операнда (см. таблицу ???), принадлежащему элементу кода (не данных!). Тип операнда, за исключением типов определенных для всех процессоров, зависит от выбранного микропроцессора. Тип операнда определяется не его представлением на экране, а инструкциями, в состав которых он входит. Так, например, при попытке определения второго слева операнда конструкции “mov dx,offset MyLabel” функция вернет тип непосредственное значение, несмотря на то, что он представлен в виде смещения. Общие для всех процессоров # тип операнда 1 регистр общего назначения 2 ячейка памяти 3 базовый регистр + [индексный] 4 базовый регистр + [индексный] + смещение 5 непосредственное значение 6 непосредственный far-адрес 7 непосредственный near-адрес Intel 80x86 # тип операнда 8 386+ трассировочный регистр 9 386+ отладочный регистр 10 386+ контрольный регистр 11 Регистр FPP (сопроцессора) 12 MMX регистр 8051 # тип операнда 8 9 10 бит 80196 # тип операнда 8 9 [внутренняя память] 10 смещение[внутренняя память] ARM # тип операнда 8 регистр сдвига 9 MLA-операнд 10 регистр (для LDM/STM) 11 CDP 12 регистр сопроцессора LDC/STC Power PC # тип операнда 8 регистр указателя стека 9 регистры плавающей запятой 10 SH & MB & ME поле 11 CR бит TMS320C5 # тип операнда 8 спарка регистров (A1:A0..B15:B14) 136 Z8 # тип операнда 8 @внутренняя память 9 @Rx Z80 # тип операнда 8 условие Таблица 15 Пример использования: seg000:0000 mov ax, 9 a) исходные данные – требуется определить тип обоих операндов Message(“>%x, %x\n”,GetOpType(SegByName(“seg000”),0), GetOpType(SegByName(“seg000”),1)); b) вызов функции GetOpType для определения типов операндов >1,5 с) результат – по таблице ??? определяем тип операндов – регистр общего назначения и непосредственное значение соответственно. ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд n ==1 второй слева, третий (если он есть) и все остальные операнды =return пояснения >1 тип операнда (см. таблицу ???) ==0 элемент не имеет операндов return ==BADADDR ошибка Родственные функции: GetOpnd, GetOperandValue Интерактивный аналог: нет longGetOperandValue(long ea,long n) Функция возвращает значение непосредственного операнда, принадлежащему элементу кода (не данных!), т.е. типу #5 (см. описание функции GetOpType). Пример использования: seg000:0000 mov ax, 9 a) исходные данные – требуется получить значение непосредственного операнда Message(“>%x\n”,GetOperandValue(SegByName(“seg000”),1)); b) вызов функции GetOperandValue для получения значения непосредственного операнда 137 >9 с) результат – значение непосредственного операнда ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд n ==1 второй слева операнд =return пояснения ==1 операция выполнена успешно return ==0 ошибка Родственные функции: GetOpnd, GetOpType Интерактивный аналог: нет long FindVoid (long ea,long flag) Функция ищет ближайший к переданному ей линейному адресу ea операнд типа “void”, возвращая в случае успешного завершения поиска адрес головы элемента кода, которому он принадлежит. В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим). Переданный функции линейный адрес в этот диапазон поиска не входит и не обязательно должен принадлежать какому-нибудь сегменту. Аргумент flag задает направление поиска – если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот. Пример использования: seg000:0100 mov ax, 9 seg000:0103 mov dx, 133h a) исходные данные – требуется получить линейный адрес элемента, содержащего операнд типа “void” Message(“>%s\n”,atoa(FindVoid(0,1))); b) вызов функции FindVoid – адрес начала поиска равен нулю, единичное значение флага направление указывает вести поиск с увеличением адресов >seg000:0103 результат – линейный адрес элемента, содержащего операнд типа void, найден ??? #Верстальщику – change table аргумент пояснения ea линейный адрес начала поиска, не обязательно принадлежащий какому-нибудь сегменту =flag пояснения ==1 прямое направление поиска flag ==0 обратное направление поиска =return пояснения return !=BADADDR линейный адрес элемента, которому принадлежит найденный операнд 138 ==BADADDR ошибка Родственные функции: FindImmediate Интерактивный аналог:”Nabigate\Search for\Next void”; Функция ищет ближайший к переданному ей линейному адресу ea операнд типа константа со значением равным value. В случае успешного поиска возвращается адрес головы элемента кода, которому этот операнд принадлежит. В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим). Переданный функции линейный адрес в этот диапазон поиска не входит и не обязательно должен принадлежать какому-нибудь сегменту. Аргумент flag задает направление поиска – если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот. Пример использования: seg000:0100 mov ax, 9 seg000:0103 mov dx, 133h a) исходные данные – требуется получить линейный адрес элемента, содержащего операнд типа константа, значение которой равно 9 Message(“>%s\n”,atoa(FindImmediate(0,1,9))); b) вызов функции FindImmediate – адрес начала поиска равен нулю, единичное значение флага направление указывает вести поиск с увеличением адресов. >seg000:0100 результат – линейный адрес элемента, содержащего операнд типа константа, значение которой равно 9 ??? #Верстальщику – change table аргумент пояснения ea линейный адрес начала поиска, не обязательно принадлежащий какому-нибудь сегменту =flag пояснения ==1 прямое направление поиска flag ==0 обратное направление поиска value искомое значение константы =return пояснения !=BADADDR линейный адрес элемента, которому принадлежит найденный операнд return ==BADADDR ошибка Родственные функции: FindVoid Интерактивный аналог:”Nabigate\Search for\Immediate”; 139 ОБЪЕКТЫ #Definition С каждым элементом (бестиповым байтом) могут быть связаны три объекта – метка, перекрестная ссылка и комментарий. IDA поддерживает два типа меток – метки, определенные пользователем и метки, автоматически сгенерированные IDA, а так же четыре типа комментариев – постоянный комментарий, отображаемый справа от элемента и отделяемый от него знаком «точка с запятой» (обычный ассемблерный комментарий), повторяемый комментарий, отображаемый справа от комментируемого элемента и возле всех ссылок на данный элемент, и два вида многострочных комментариев предваряющих и замыкающих комментируемый элемент. О перекрестных ссылках подробно рассказано в главе «Перекрестные ссылки». Каждый элемент может иметь не более одной метки и до четырех комментариев различного типа одновременно. Метки и комментарии хранятся в отдельном виртуальном массиве, проиндексированным линейными адресами, а на наличие связанных с элементом (бестиповым байтом) объектом указывают флаги (см. таблицу 16) В принципе без флагов, ссылающихся на объекты можно было бы и обойтись, но тогда бы пришлось при отображении каждой ячейки просматривать все виртуальные массивы на предмет поиска объектов, ассоциированных с данным линейными адресом, что отрицательно сказалось бы на производительности дизассемблера. Напротив, перенос этой информации в флаги позволяет ускорить работу – обращение к виртуальному массиву происходит только в тех случаях, когда с ячейкой заведомо связан какой-то объект Разрушение элемента не вызывает автоматического уничтожение связанных с ним объектов – каждый объект должен быть удален по отдельности соответствующими функциями. константа # пояснения FF_COMM 0x00000800 комментарий FF_REF 0x00001000 перекрестная ссылка FF_LINE 0x00002000 много строчечный комментарий FF_NAME 0x00004000 метка, определенное пользователем FF_LABL 0x00008000 метка, автоматически сгенерированное IDA FF_FLOW 0x00010000 перекрестная ссылка с предыдущей инструкции FF_VAR 0x00080000 переменная Таблица 16 Флаги, указывающие на наличие связанных объектов Сводная таблица функций функции, создающие и уничтожающие объекты имя функции краткое описание success MakeName (long ea, char name) создает метку success JmpTable (long jmpea, long tableea, long nitems, long is32bit) создает таблицу переходов success MakeComm (long ea, char comment) создает постоянный комментарий success MakeRptCmt (long ea, char comment) создает повторяемый комментарий 140 void ExtLinA (long ea,long n, char line) создает строку комментария перед элементом void ExtLinB (long ea,long n, char line); создает строку комментария за элементом void DelExtLnA (long ea, long n) удаляет строку комментария перед элементом void DelExtLnB (long ea, long n) удаляет строку комментария за элементом void MakeVar(long ea) помечает элемент, флажком «переменная» функции, возвращающие элементы имя функции краткое описание char Name (long ea) возвращает имя метки, при необходимости выполняя замену недопустимых символов char GetTrueName (long ea) возвращает имя метки char Comment (long ea) возвращает постоянный комментарий char RptCmt (long ea) возвращает повторяемый комментарий char LineA (long ea,long num); возвращает строку комментария, стоящего до элемента char LineB (long ea,long num); возвращает строку комментария, стоящего за элементом функции, поиска объектов имя функции краткое описание long LocByName (char name) возвращает линейный адрес метки с заданным именем success MakeName(long ea,char name) Функция создает метку, расположенную по линейному адресу ea, с именем name. Переданный линейный адрес должен быть либо адресом головы элемента любого вида, либо адресом бестипового байта; в противном случае функция возвратит ошибку. Имя метки должно состоять только из допустимых символов, перечень которых для каждой платформы содержится в поле “NameChars” конфигурационного файла <ida.cfg>. платформа перечень символов, допустимых в именах меток "$?@" 9 “_0123456789" PC "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; "$_@?!" 10 "0123456789<>" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" Java "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" 11 "абвгдежзийклмнопрстуфхцчшщъыьэюя"; "$_0123456789" TMS320C6 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "_0123456789." PowerPC "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz” 9 Служебные символы ассемблера 10 Символы, определенные только для специальных режимов Java-ассемблера 11 Национальные (российские символы) 141 Таблица 17 перечень символов, допустимых в именах меток Если по указанному адресу расположена уже существующая метка, в результате работы функции она будет переименована. Удалить метку можно, переименовав ее, в пустую строку. Удаление возможно только в том случае, если во всем дизассемблируемом тексте на данную метку нет ни одной ссылки, в противном случае IDA Pro тут же создаст новое автогенерирумое (dummy) имя. Замечание: “MakeName” помимо переименования меток, так же изменяет имена функций, если ей передать адрес начала функции (см. главу «Функции») Пример использования: seg000:0000 mov ah, 9 a) исходные данные – требуется создать метку с именем “NoName” по адресу seg000:000 MakeName(SegByName(“seg000”),”NoName”); b) вызов функции MakeName для создания метки seg000:0000 NoName mov ah, 9 c) результат – метка успешно создана ??? #Верстальщику – change table аргумент пояснения ea линейный адрес головы элемента любового вида или бестипового байта name имя метки =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: GetTrueName Интерактивный аналог: “Edit\Name” Функция создает комментарий comment, размещая его справа от элемента, расположенного по линейному адресу ea. Переданный линейный адрес должен быть либо адресом головы элемента любого вида, либо адресом бестипового байта; в противном случае функция возвратит ошибку. Комментарий автоматически отделяется от элемента символом «точка с запятой» и в самой строке комментария его указывать не нужно. Величина отступа задается настойками IDA (см. главу «Глобальные настойки»). Строка комментария может содержать как символы латиницы, так и символы кириллицы, однако, нормальное отображение кириллицы возможно только в той ипостаси IDA, в которой они были созданы. Удалить комментарий можно задав в качестве нового пустую строку. Удаляются в том числе, и некоторые комментарии, автоматически создаваемые IDA. Функция поддерживает спецификатор переноса строки '\n', автоматически создавая новую строку и перенося на нее хвост комментария. 142 Пример использования: seg000:0000 mov ah, 9 a) исходные данные – требуется вставить комментарий MakeComm(0x1275C,"Функция 0x9 – печать строки"); b) вызов функции MakeComm для вставки комментария seg000:0000 mov ah, 9 ; Функция 0x9 – печать строки c) результат – вставленный комментарий ??? #Верстальщику – change table аргумент пояснения ea линейный адрес головы элемента любого вида или бестипового байта comment строка комментария =return пояснения ==1 успешное завершение операции return =0 ошибка Родственные функции: MakeRptCmt, ExrLinA, ExtLinB Интерактивный аналог: “Edit\Comments\Enter comment”; <:> success MakeRptCmt(long ea,char comment) Функция создает повторяемый комментарий comment, размещая его справа от элемента, расположенного по линейному адресу ea. Переданный линейный адрес должен быть либо адресом головы элемента любого вида, либо адресом бестипового байта; в противном случае функция возвратит ошибку. Комментарий автоматически отделяется от элемента символом «точка с запятой» и в самой строке комментария его указывать не нужно. Величина отступа задается настойками IDA (см. главу «Глобальные настойки»). Строка комментария может содержать как символы латиницы, так и символы кириллицы, однако, нормальное отображение кириллицы возможно только в той ипостаси IDA, в которой они были созданы. Удалить комментарий можно задав в качестве нового пустую строку. Функция поддерживает спецификатор переноса строки '\n', автоматически создавая новую строку и перенося на нее хвост комментария. Отличие повторяемого комментария от постоянное заключается в том, что повторяемый комментарий автоматически отображается около всех элементов, ссылающихся на элемент, помеченный повторяемым комментарием. Замечание: повторяемый комментарий может оказаться очень полезным на начальной стадии анализа программы, когда осмысленные имена переменным и функциям дать еще затруднительно, но какие-то мысли по поводу их назначения уже имеются, которые и можно высказать в комментарии, автоматически повторяемом возле всех ссылок на эту переменную (функцию), облегчая тем самым исследование кода. Пример использования: seg000:0100 mov ah, 9 143 seg000:0102 mov dx, offset aHello seg000:0105 int 21h ; seg000:0107 retn seg000:0107 ; ────────────────────────────────────────────────────────────────────────── seg000:0108 aHello db 'Hello,',0 ; DATA XREF: seg000:0102↑o seg000:0108 ; a) исходные данные – требуется вставить комментарий к метке aHello, автоматически повторяемый возле всех инструкций, ссылающихся на эту метку. MakeRptCmt(SegByName(“seg000”)+0x108,”Это повторяемый комментарий”); b) вызов функции MakeRptCmt для создания повторяемого комментария seg000:0100 mov ah, 9 seg000:0102 mov dx, offset aHello ; |