Описание функций встроенного языка
Скачать 2.86 Mb.
|
отказываются ассемблировать распространенные ассемблеры. Например, команду JMP FAR segment:offset IDA, в отличие от большинства ассемблеров, не считает не правильной. В результате чего приходится вручную менять ее в листинге на последовательность: DB 0Eah DW offset 399 DW segment INF_PREFFLAG Это однобайтовое поле хранит флаг, задающий формат вывода префикса на экран. Имеет смысл только когда вывод префиксов разрешен, (то есть флаг INF_SHOWPREF установлен). Флаг представляет собой возможные комбинации из трех битов. При этом бит PREF_FNCOFF имеет приоритет над PREF_SEGADR. То есть, комбинация (PREF_FNCOFF | PREF_SEGADR) равносильна PREF_FNCOFF. Однако, это не документировано и возможно в последующих версиях IDA будет вести себя иначе. Интерактивно это можно изменить с помощью следующих опций диалога настойки: - Options \ Text representation \ Segment addresses - Options \ Text representation \ Function offsets - Options \ Text representation \ Display stack pointer Флаг значение Пояснение Пример PREF_SEGADR 0x01 Представлять префикс в виде сегментного адреса seg000:2190 PREF_FNCOFF 0x02 Представлять префикс в виде смещения внутри функции Sub_0_22DD+1B Seg000:2190 008 PREF_STACK 0x04 Завершать префикс указателем стека Sub_0_22DD+1B 008 INF_PACKBASE Это однобайтовое поле хранит тип упаковки базы IDA, предлагаемый по умолчанию при выходе из дизассемблера. INF_PACKBASE == 0 INF_PACKBASE == 1 INF_PACKBASE == 2 SetCharPrm(INF_PACKBASE,0); SetCharPrm(INF_PACKBASE,1); SetCharPrm(INF_PACKBASE,2); ЗАМЕЧАНИЕ: оба типа упаковки обладают слабым сжатием, поэтому при возникновении потребности в дисковом пространстве или передачи базы по 400 коммуникационным каналам рекомендуется ее упаковать с помощью любого подходящего архиватора (например, zip, arj) при этом выигрыш может быть более, чем десятикратный. INF_ASCIIFLAGS Это однобайтовое беззнаковое поле задает стиль автогенерируемых строковых имен (или вообще запрещает создание таковых) Представляет собой комбинацию следующих битов. ASCF_GEN Если этот флаг установлен, то IDA автоматически генерирует имена для всех ASCII строк, состоящее из читабельных символов этой строки. Так, например, встретив строку «Hello, Word» IDA создаст имя “aHello_Word”. В противном случае что-то наподобие «asc_0_206». Разумеется, что генерация осмысленных имен улучшает читабельность листинга и ускоряет анализ. По умолчанию IDA ведет себя именно так. Если по какой-то причине возникнет желание отключить эту возможность, то можно воспользоваться функцией SetCharPrm(INF_ASCIIFLAG,0) или интерактивно через « Options \ ASCII string options \ Generate names» SetCharPrm(INF_ASCIIFLAG,1); SetCharPrm(INF_ASCIIFLAG,0); seg000:2192 a123456789abcde db '123456789ABCDEFG',0 seg000:2192 db '123456789ABCDEFG',0 ASCF_AUTO Этот флаг, будучи установленным, приводит к тому, что IDA будет помечать все создаваемые имена, как ‘autogenerated’. Это приведет к отображению их другим цветом и автоматическому удалению при преобразовании имени к ‘unexplored’. По умолчанию флаг установлен. Если возникнет необходимость его изменить, то это можно сделать с помощью функции SetCharPrm(INF_ASCIIFLAGS,!ASCF_AUTO) или интерактивно «Options \ ASCII string options \ Mark as autogenerated» ASCF_AUTO == 1 ASCF_AUTO == 0 seg000:2192 db 31h ; 1 seg000:2193 db 32h ; 2 seg000:2194 db 33h ; 3 seg000:2195 db 34h ; 4 seg000:2196 db 35h ; 5 seg000:2197 db 36h ; 6 seg000:2198 db 37h ; 7 seg000:2199 db 38h ; 8 seg000:219A db 39h ; 9 seg000:219B db 41h ; A seg000:219C db 42h ; B seg000:219D db 43h ; C seg000:219E db 44h ; D seg000:219F db 45h ; E seg000:21A0 db 46h ; F seg000:21A1 db 47h ; G seg000:21A2 db 0 ; seg000:2192 db 31h ; 1 seg000:2193 db 32h ; 2 seg000:2194 db 33h ; 3 seg000:2195 db 34h ; 4 seg000:2196 db 35h ; 5 seg000:2197 db 36h ; 6 seg000:2198 db 37h ; 7 seg000:2199 db 38h ; 8 seg000:219A db 39h ; 9 seg000:219B db 41h ; A seg000:219C db 42h ; B seg000:219D db 43h ; C seg000:219E db 44h ; D seg000:219F db 45h ; E seg000:21A0 db 46h ; F seg000:21A1 db 47h ; G seg000:21A2 db 0 ; Создается имя seg000:2192 a123456789abcde db '123456789ABCDEFG',0 seg000:2192 a123456789abcde db '123456789ABCDEFG',0 401 Преобразуем регион в unexplored seg000:2192 db 31h ; 1 seg000:2193 db 32h ; 2 seg000:2194 db 33h ; 3 seg000:2195 db 34h ; 4 seg000:2196 db 35h ; 5 seg000:2197 db 36h ; 6 seg000:2198 db 37h ; 7 seg000:2199 db 38h ; 8 seg000:219A db 39h ; 9 seg000:219B db 41h ; A seg000:219C db 42h ; B seg000:219D db 43h ; C seg000:219E db 44h ; D seg000:219F db 45h ; E seg000:21A0 db 46h ; F seg000:21A1 db 47h ; G seg000:21A2 db 0 ; seg000:2192 a123456789abcde db 31h ; 1 seg000:2193 db 32h ; 2 seg000:2194 db 33h ; 3 seg000:2195 db 34h ; 4 seg000:2196 db 35h ; 5 seg000:2197 db 36h ; 6 seg000:2198 db 37h ; 7 seg000:2199 db 38h ; 8 seg000:219A db 39h ; 9 seg000:219B db 41h ; A seg000:219C db 42h ; B seg000:219D db 43h ; C seg000:219E db 44h ; D seg000:219F db 45h ; E seg000:21A0 db 46h ; F seg000:21A1 db 47h ; G seg000:21A2 db 0 ; ASCF_SERIAL Если этот флаг будет установлен, то IDA будет генерировать следующие (в терминологии IDA последовательные) имена ‘pref0’,’pref1’,’pref2’… где ‘pref’ – префикс имени, который для строк по умолчанию равен ‘a’ По умолчанию этот флаг сброшен, но если возникнет необходимость, то его можно установить с помощью функции SetCharPrm( или же интерактивно «Options \ ASCII string options\ Generate serial names» ASCF_SERIAL == 1 ASCF_SERIAL == 0 SetCharPrm(INF_ASCIIFLAGS, ASCF_SERIAL); SetCharPrm(INF_ASCIIFLAGS, !ASCF_SERIAL); seg000:2192 a0 db '123456789ABCDEFG',0 seg000:2192 a123456789abcde db '123456789ABCDEFG',0 INF_LISTNAMES Это однобайтовое беззнаковое поле содержит атрибуты имен, автоматически включаемых в Список Имен (Name List). LN_NORMAL 0x01 Имя без атрибутов (по умолчанию) LN_PUBLIC 0x02 Имя с атрибутом public LN_AUTO 0x04 Автогенерируемое имя LN_WEAK 0x08 Имя с атрибутом weak 402 INF_START_SS Это длинное поле хранит значение регистра SS при запуске программы. Для того, что бы его получить IDA прибегает к эмуляции загрузки и действует в соответствии с исследуемым типом файла и декларированным правилам загрузки его операционной системой. Однако, это не гарантирует, что полученное значение будет тождественно действительному. Впрочем, такая точность на практике и не трубятся. В крайнем случае можно принудительно указать требуемый базовый адрес загрузки или изменить непосредственно само значение INF_START_SS. Пример: Message(“0x%x \n”,GetLongPrm(INF_START_SS)); 0x1000 SetLongPrm(INF_START_SS,0); Message(“0x%x \n”,GetLongPrm(INF_START_SS)); 0 INF_START_CS Это длинное поле хранит значение регистра CS при запуске программы. Для того, что бы его получить IDA прибегает к эмуляции загрузки и действует в соответствии с исследуемым типом файла и декларированным правилам загрузки его операционной системой. Пример: Message(“0x%x \n”,GetLongPrm(INF_START_CS)); 0x1000 INF_MAIN В файле определений IDC.IDC сообщается, что это длинное поле содержит адрес процедуры main(), однако, при попытке его чтения всегда возвращается ошибка BADADDR. Например: Message(“0x%X \n”,GetLongPem(INF_MAIN)); 0xFFFFFFFF INF_SHORT_DN Это длинное поле хранит короткую форму вывода «замангленных» имен. Назначение отдельных битов не описано в файле ‘idc.idc’, в котором содержится ссылка на ‘demangle.hpp’, входящий в состав IDA SDK. ФЛАГ БИТ ЗНАЧЕНИЕ MNG_DEFNEAR 0x00000000 Подавлять в именах ключевое слово near MNG_DEFFAR 0x00000002 Подавлять в именах ключевое слово far MNG_DEFHUGE 0x00000004 Подавлять в именах ключевое слово huge MNG_DEFNONE 0x00000006 Выводить все MNG_NODEFINIT 0x00000008 Подавлять вывод всёго, кроме основного имени MNG_NOUNDERSCORE 0x00000010 Подавлять вывод подчерков для __ccall, __pascal... MNG_NOTYPE 0x00000020 Подавлять вывод типа параметров MNG_NORETTYPE 0x00000040 Подавлять вывод типа взращаемого функцией значения MNG_NOBASEDT 0x00000080 Подавлять вывод базовых типов 403 MNG_NOCALLC 0x00000100 Подавлять вывод слов __pascal\__ccall и подобных MNG_NOPOSTFC 0x00000200 Подавлять вывод постфиксного const MNG_NOSCTYP 0x00000400 Подавлять вывод ключевых слов public\private\protected MNG_NOTHROW 0x00000800 Подавлять вывод описания throw MNG_NOSTVIR 0x00001000 Подавлять вывод ключевых слов static и virtual MNG_NOECSU 0x00002000 Подавлять вывод ключевых слов class\struct\union\enum MNG_NOCSVOL 0x00004000 Всюду подавлять вывод ключевых слов const и volatile MNG_NOCLOSUR 0x00008000 Подавлять вывод __closure (для компиляторов Borlnand) MNG_SHORT_S 0x00010000 Выводить signed (int) в формате s(int) MNG_SHORT_U 0x00020000 Выводить unsigned (int) в формате u(int) MNG_ZPT_SPACE 0x00040000 Выводить пробел после запятой в аргументах функций MNG_IGN_ANYWAY 0x00080000 Игнорировать постфикс '_nn' в конце строки MNG_IGN_JMP 0x00100000 Игнорировать префикс 'j_' в начале строки MNG_MOVE_JMP 0x00200000 Сохранять префикс 'j_' в размангленных именах Подробнее об этом можно найти в описании функции Demangle. INF_LONG_DN Это длинное поле хранит полный формат вывода «замангленных» имен. Представляет собой комбинацию флагов, назначение которых описано выше. INF_DATATYPES Это длинное поле хранит разрешенные к использованию типы данных, то есть такие, что будут поочередно перебираться, скажем, при нажатии ‘D’. Файл IDC.IDC не содержит расшифровки отдельных битов этого поля, но в интерактивно диалоге настойки (Options \ Setup date types ) типы данных перечислены в порядке следования флагов в этом поле! БИТ ЗНАЧЕНИЕ 0x1 Байт 0x2 Слово 0x4 Двойное слово 0x8 Float 0x10 Четвертное слово 0x20 Double 404 0x40 Tbyte 0x80 Упакованное real Пример использования: Message("%b \n", GetLongPrm(INF_DATATYPES)); 111 INF_STRTYPE Это длинное поле хранит текущий стиль ASCII – строк. Первый байт представляет собой один из следующих флагов. ФЛАГ ЗНАЧЕНИЕ 0 Строка не претворена полем длины Стиль Pascal – строка предваряется байтом длины ASCSTR_PASCAL .data:00408040 aHeloSailor db 0Сh, 'Helo,Sailor!' Стиль WinPascal – строка предваряется словом длины ASCSTR_LEN2 .data:00408040 aHeloSailor dw 0Сh, db 'Helo,Sailor!' Стиль UNICODE ASCSTR_UNICODE `H`,0,`e`,0,`l`,0,`o`,0,`,`,0,`S`,0,`a`,0,`i`,0,`l`,0,`o`,0,`r`,0,`!` Стиль Delphi – 4 байта на длину ASCSTR_LEN4 .data:00408040 aHeloSailor dw 0Сh, dw 0, db 'Helo,Sailor!' Если первый байт не равен нулю, то, значит, впереди строки находится поле, определяющие его длину. Иначе используется символ конца строки. Его определяют второй и третий байт поля INF_STRTYPE. Если второй символ будет равен ‘\0’, то он будет проигнорирован. Поэтому если необходимо задать два типа завершающих символов (например, ноль и ‘$’), то ‘\0’ следует указывать первым из них. Пример: Message(“%x \n”,GetLongPrm(INF_STRTTYPE)); 0 SetLongPrm(INF_STRTTYPE,’$’>>0x10); INF_AF2 Это длинное беззнаковое поле хранит дополнительные флаги анализатора. ФЛАГ БИТ ЗНАЧЕНИЕ AF2_JUMPTBL 0x1 Выявлять и создавать таблицы переходов AF2_DODATA 0x2 Сворачивать сегмент данных в последнем проходе AF2_HFLIRT 0x4 Автоматически скрывать стандартные библиотечные функции (этот флаг не описан в файле IDC.IDC) 405 success SetPrcsr (char processor); Функция позволяет изменить тип процессора, отличный от выбранного при загрузке дизассемблируемого файла. Однако возможности динамической смены процессора несколько ограничены. Допустим выбор лишь в границах текущей линейки (серии) микропроцессоров. Это объясняется тем, что на стадии загрузки происходят неустранимые средствами последующих уровней изменения и настройки на конкретный процессор. (Большей частью это относится к невозможности IDA перезагружать микропроцессорные модули, отвечающие за дизассемблирование. Такой модуль может быть загружен один только раз и на весь сеанс работы окажутся доступными лишь поддерживаемые им типы микропроцессоров) Для линейки Intel в силу их полной обратной совместимости, динамический выбор модели процессора некритичен, поскольку можно выбрать самого позднего из доступных представителей, и можно быть уверенным, что все команды будут дизассемблированы. Аналогичный результат можно получить, выбрав тип «meta pc», включающий в себя команды всех моделей микропроцессоров. Рассмотрим работу этой функции на следующей примере. Загрузим для дизассемблирования бинарный или com-файл (для которого IDA по умолчанию выбирает 8086 микропроцессор), но содержащий инструкции более поздних моделей. Разумеется, они окажутся не дизассемблированными и результат работы IDA может выглядеть, например, так: seg000:02E9 mov ax, ds:413h seg000:02EC db 0C1h ; - seg000:02ED db 0E0h ; р seg000:02EE db 6 ; seg000:02EF cmp ax, 0A000h SetPrcsr (“metapc”); seg000:02E9 mov ax, ds:413h seg000:02EC shl ax, 6 seg000:02EF cmp ax, 0A000h Смена типа процессора, привела к тому, что IDA заново проанализировала изучаемый файл и автоматически дизассемблировала интересующие нас инструкции. Разумеется, что обратная смена на 8086 модель приведет к тому, что листинг будет приведен к первоначальному виду При этом IDA может так же изменять целевой ассемблер, поэтому рекомендуется на всякий случай удостоверится в приемлемости ее выбора, вызвав диалог «Options \ Target Assembler» Впрочем, для линии IBM PC он имеется в единственном числе – «Generic for Intel 80x86» и беспокоиться нет никакой необходимости. 406 Операнд processor может принимать следующие значения, перечисленные ниже в таблице. К регистру функция не чувствительна, поэтому ‘metapc’ и ‘MetaPC’ задают один и то же тип процессора. Отбивка слева указывает, что объединяемые ее микропроцессоры могут динамически выбираться во время дизассемблирования файла. Операнд Процессор Серия 8086 Intel 8086 80286r Intel 80286 real mode 80286p Intel 80286 protected mode 80386r Intel 80386 real mode 80386p Intel 80386 protected mode 80486r Intel 80486 real mode 80486p Intel 80486 protected mode 80586r Intel Pentium & MMX real mode 80586p Intel Pentium & MMX prot mode 80686p Intel Pentium Pro & MMX k62 AMD K6-2 with 3DNow! p2 Intel Pentium II p3 Intel Pentium III athlon AMD K7 metapc Дизассемблировать все инструкции IBM PC Линейка IBM PC 8085 Intel 8085 z80 Zilog 80 Линейка Zilog 80 z8 Zilog 8 Линейка Zilog 8 860xr Intel 860 XR 860xp Intel 860 XP Линейка Intel 860 8051 Intel 8051 Линейка Intel 51 80196 Intel 80196 Линейка Intel 80196 m6502 6502 m65c02 65c02 Линейка 65xx line 64180 Hitachi HD64180 pdp11 DEC PDP/11 Линейка PDP line 68000 Motorola MC68000 68010 Motorola MC68010 68020 Motorola MC68020 68030 Motorola MC68030 68040 Motorola MC68040 68330 Motorola CPU32 (68330) 68882 Motorola MC68020 with MC68882 68851 Motorola MC68020 with MC68851 68020EX Motorola MC68020 with both Линейка Motorola 680x0 6800 Motorola MC6800 6801 Motorola MC6801 6803 Motorola MC6803 6301 Hitachi HD 6301 6303 Hitachi HD 6303 6805 Motorola MC6805 6808 Motorola MC6808 6809 Motorola MC6809 Линейка Motorola 8bit 407 6811 Motorola MC6811 java java Серия Java ppc PowerPC Линейка PowerPC arm710a ARM 7xx серия arm То же самое, что и arm710a armb ARM big endian Линейка ARM tms320c2 TMS320C2x серия Серия TMS 16bit адресации tms320c5 TMS320C5x серия tms320c6 TMS320C6x серия Линейка TMS VLIW l sh3 Hitachi SH3 (little endian) sh3b Hitachi SH3 (big endian) sh4 Hitachi SH4 (little endian) sh4b Hitachi SH4 (big endian) Hitachi SH line avr ATMEL AVR Серия ATMEL mipsl MIPS little endian mipsb MIPS big endian mipsr MIPS & RSP Линейка MIPS: R2000, 3000, R4000,R4200, R4300, 4400, R4600,R8000, R10000 h8300 H8/300x in normal mode h8300a H8/300x in advanced mode h8s300 H8S in normal mode h8s300a H8S in advanced mode Hitachi H8 line pic16cxx Michrochip PIC Серия микроконтроллеров Все вышесказанное остается верным и для интерактивного выбора типа процессора посредством команды меню «Options \ Processor type» При попытке смены типа процессора IDA может выдать ошибку, например:«The processor type "metapc" isn't included in the standard version of IDA Pro. Please check our web site for information about ordering additional processor modules» Это обозначает, что необходимый для дизассемблирования модуль отсутствует или не найден. Его можно получить, обратившись к вашему поставщику IDA или на сайте разработчика IDA (www.idapro.com) Поскольку для DOS, OS\2 и Windows версий дизассемблера используются разные модули, то вполне возможно, что один из них отсутствует или поврежден, когда остальные вполне работоспособны. Расшифровка расширений приводится ниже в таблице. расш Платформа d32 Процессорный модуль для OS\2 версии дизассемблера dll Процессорный модуль для MS-DOS версии дизассемблера 408 w32 Процессорный модуль для Windows 95\Windows NT версий дизассемблера Четвертая версия IDA в полной поставке, включает в себя следующие файлы: Файл Семейство процессоров ARM Семейство ARM (серия ARM 7xx) AVR Линейка чипов ATMEL AVR H8 Линейка чипов Hitachi H8 (H8/300x и H8S серии) I196 Микропроцессор Intel 80196 I51 Микропроцессор Intel 8051 I860 Микропроцессор Intel 860 XR JAVA Java Virtual Machine M65 Микропроцессоры серии 65xx Семейство 8-разрядных микропроцессоров фирмы Motorola (MC6800, MC6801, MC6803, MC6805, MC6808, MC6809, MC6811) MC8 Семейство 8-разрядных микропроцессоров фирмы Hitachi (HD 6301, HD 6303) MC68 Микропроцессоры серии Motorola 680x0 PC Микропроцессоры линейки IBM PC PDP11 DEC PDP-11 PIC Микроконтроллеры Microchip серий PIC16C5x PIC16Cxx PIC17Cxx Z8 Микропроцессоры линейки Zilog 8 Z80 Микропроцессоры линейки Zilog 80 Сравнивая эту таблицу с приведенным выше перечнем поддерживаемых IDA процессоров, можно заметить, что часть из них в поставку не входит. С другой стороны, если вам не нужно дизассемблировать ничего, кроме программ для IBM PC, то все остальные модули можно удалить, освободив немного дискового пространства. Если в заголовке загружаемого файла отсутствует информация о типе процессора, то IDA выбирает его, руководствуясь расширением. Соответствия расширений и типов микропроцессора перечислены в фале IDA.CFG в секции DEFAULT_PROCESSOR: расширение Тип процессора "com" "8086" "exe" "metapc" "dll" "metapc" "drv" "metapc" "sys" "metapc" "bin" "metapc" "ovl" "metapc" "ovr" "metapc" "ov?" "metapc" "nlm" "metapc" "lan" "metapc" "dsk" "metapc" "obj" "metapc" "prc" "68000" (PalmPilot программы) "axf" "arm710a" "h68" "68000" (MC68000 для *.H68 файлов) "i51" "8051" (i8051 для *.I51 файлов) "sav" "pdp11" (PDP-11 для *.SAV файлов) |