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

dseg:03A0 pop cx dseg:03A1 retn

dseg:03A0 pop cx

dseg:03A1 retn

AF PROCPTR

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

Например:

AF PROCPTR ==1

AF PROCPTR==0

.data:004085E0 dd offset sub 0 405AAC

.data:004085E0 dd 405AACh

.text:00405AAC sub 0 405AAC proc near .text:00405AAC push ebp .text:00405AAD mov ebp, esp

.text:00405AAC db 55h

.text:00405AAD db 8Bh .text:00405AAE db OECh

Данный метод не безгрешен и в некоторых случаях может приводить в к ошибкам (тем более возможно предположить умышленное противодействие автора дизассемблируемого текста против IDA) поэтому иногда его приходится отключать.

AF JFUNC

Установка этого флага приведет к тому, что IDA будет переименовывать функции, состоящие из одной только команды jmp somewhere в j somewhere. Это заметно улучшает читабельность листинга и ускоряет анализ алгоритма его работы.

AF JFUNC == 1

AF JFUNC==0

seg000 segOOO

seg000

22DD j MyJmpTrg proc near 2 2DD jmp short MyJmpTrg 22DD j MyJmpTrg endp

seg000 segOOO

seg000

22DD sub 0 22DD proc near 2 2DD jmp short MyJmpTrg 22DD sub 0 22DD endp

AF NULLSUB

Установка этого флага приведет к тому, что IDA будет переименовывать «пустые», то есть состоящие только из одной инструкции возврата, процедуры в nullsub xx.

Это облегчает читабельность и восприятие листинга, а так же ускоряет анализ исследуемого текста дизассемблера.

AF NULLSUB == 1

AF NULLSUB == 0

seg000:22DF nullsub 1 proc near

seg000:22DF retn

s 22DF nullsub 1 endp

seg000 segOOO seg000

22DF sub 0 22DF proc near

22DF retn 22DF sub 0 22DF endp

AF LVAR

Механизм отслеживания текущего значения регистра SP (ESP) дает возможность поддержки локальных переменных. То есть тех, что лежат в стеке с отрицательным смещением относительно BP (EBP).

Это становится невероятно полезным при дизассемблировании кода,



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

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

AF LVAR == 1

AF LVAR == 0

.text:0040112A mov ecx, [esp+40h+var 1С]

.text:0040112A mov ecx, [esp+24h]

AF TRACE

Установка этого флага заставляет IDA отслеживать значение регистра указателя стека в каждой точке кода. Главным образом это необходимо для поддержки локальных переменных (см. AF LVAR)

AF PROCPTR ==1

AF PROCPTR==0

dseg:187A off 0 187A dw offset loc 0 B45

dseg:187A word 0 187A dw 0B45

dseg:0B45 mov dx, 183Ch

dseg:0B45 mov dx, 183Ch

AF ASCII

IDA может автоматически создавать строки, если элемент на который указывает ссылка состоит более чем из четырех символом ASCII для 16-сегмента (и шестнадцати символов в остальных случаях).

Стиль строки определяется настойками о которых будет сказано ниже.

AF IMMOFF

Этот флаг имеет смысл только для 32-разрядных сегментов. Если он установлен, то IDA будет преобразовывать 32-разрядные операнды в смещения. Для этого необходимо, что бы операнд был больше минимально возможного адреса загрузки 0x10000.

Значительно облегчает дизассемблирование 32-разрядных приложений, автоматически корректно распознавая большинство смещений и указателей. Поскольку большинство приложений редко оперируют подобными величинами, то вероятность ложных срабатываний (то есть ошибочного преобразования константы в смещение) относительно невелика.

AF IMMOFF == 1

AF IMMOFF == 0

.text:00401000 push offset aHeloSailor .text:00401005 mov ecx, offset ord 0 408900

.text:004 01000 push 408040h .text:004 01005 mov ecx, 408900h

AF DREFOFF

Если этот флаг установлен, то IDA будет автоматически пытаться преобразовать в смещения все двойные слова, содержащие ссылки из 32-разрядных сегментов.

Преобразование в общем случае осуществляется успешно, если содержимое двойного слова больше, чем 0x10000



AF DREFOFF == 1

AF DREFOFF==0

.data:00408330 off 0 408330 dd offset unk 0 408980 ; DATA XREF: .text:00404758o

.data:00408330 dword 0 408330 dd 408980h

Поясним этот пример. Допустим, в 32-сегменте кода встретится следующая инструкция:

.text:00404758 mov eax, 408330h

Если флаг AF IMMOFF (см. выше) установлен, то константа 0x408440 будет автоматически преобразована в смещение, так как 0x408440 > 0x10000. По этому смещению находится следущая ячейка:

.data:00408330 dword 0 4 0 8 33 0 dd 408980h

Поскольку 0x408980 больше 0x10000, то, скорее всего, оно представляет собой смещение, в которое и может быть преобразовано, если флаг AF DREFOFF будет установлен.

AF FINAL

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

Правила, по которым происходит это преобразование, не документированы и меняются от версии к версии. В идеале IDA должна была бы практически во всех случаях «угадать» чем является каждый элемент - данными или инструкцией. Однако, на практике она часто допускает ошибки, особенно com файлах, где данные и код могут быть сложным образом перемешаны.

Для win32 файлов с раздельными сегментами кода и данных, эта проблема отсутствует.

Рекомендуется сбрасывать этот флаг (по умолчанию он установлен). И вот почему - рассмотрите пример, приведенный ниже. Очевидно, что по адресу seg000:210D расположены строки:

seg000:210D aDir db ..,0

seg000:2110 aMask db *.*,0

Но IDA, не найдя на них ссылок (поскольку невозможно для 16-разрядных приложений отличить смещения от констант) превратила их в малоосмысленный массив.

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

ЗАМЕЧАНИЕ: для некоторых типов файлов (например, PE) значение этого флага в ряде случаев игнорируется и остаются unexplored байты.

AF FINAL == 1

AF FINAL :

== 0

seg000:210D db 2 dup(2Eh), 0, 2Ah, 2Eh, 2Ah, 0

seg000

:210D

seg000

:210E

seg000

:210F

segOOO

:2110

seg000

:2111

seg000

:2112

seg000

:2113



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