Главная страница

Описание функций встроенного языка


Скачать 2.86 Mb.
НазваниеОписание функций встроенного языка
Анкорobraz_mihlenia_-_dizassembler_IDA
Дата29.09.2022
Размер2.86 Mb.
Формат файлаpdf
Имя файлаobraz_mihlenia_-_dizassembler_IDA.pdf
ТипСправочник
#704305
страница37 из 39
1   ...   31   32   33   34   35   36   37   38   39

ЗАМЕЧАНИЕ: все же часть инструкций IDA не помечает, как , хотя их
отказываются ассемблировать распространенные ассемблеры.
Например, команду 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 файлов)

409
"rom" "z80" (для *.ROM файлов)
"class" "java"
"cls" "java"
"s19" "6811"
"*" "metapc"
1   ...   31   32   33   34   35   36   37   38   39


написать администратору сайта