Анимация
JavaScript
|
Главная Библионтека dseg:03A0 pop cx dseg:03A1 retn dseg:03A0 pop cx dseg:03A1 retn AF PROCPTR Установка этого флага приведет к тому, что IDA будет проверять все перекрестные ссылки из 32-разрядного сегмента данных в сегмент кода. Если ссылка указывает на машинную инструкцию, то IDA автоматически преобразует ее в код и создаст на этом месте функцию. Например:
Данный метод не безгрешен и в некоторых случаях может приводить в к ошибкам (тем более возможно предположить умышленное противодействие автора дизассемблируемого текста против IDA) поэтому иногда его приходится отключать. AF JFUNC Установка этого флага приведет к тому, что IDA будет переименовывать функции, состоящие из одной только команды jmp somewhere в j somewhere. Это заметно улучшает читабельность листинга и ускоряет анализ алгоритма его работы.
AF NULLSUB Установка этого флага приведет к тому, что IDA будет переименовывать «пустые», то есть состоящие только из одной инструкции возврата, процедуры в nullsub xx. Это облегчает читабельность и восприятие листинга, а так же ускоряет анализ исследуемого текста дизассемблера.
AF LVAR Механизм отслеживания текущего значения регистра SP (ESP) дает возможность поддержки локальных переменных. То есть тех, что лежат в стеке с отрицательным смещением относительно BP (EBP). Это становится невероятно полезным при дизассемблировании кода, сгенерированного оптимизирующими компиляторами, которые уже не опираются на BP (EBP), а адресуют локальные переменные относительно стекового регистра ESP. Это приводит к тому, что невозможно понять к какой именно переменной обращается та или иная инструкция, до тех пор пока не будет вычислено значение указателя стека в конкретной точке кода. IDA взяла на себя эту рутину работу и поддерживает оба типа стековых переменных самостоятельно.
AF TRACE Установка этого флага заставляет IDA отслеживать значение регистра указателя стека в каждой точке кода. Главным образом это необходимо для поддержки локальных переменных (см. AF LVAR)
AF ASCII IDA может автоматически создавать строки, если элемент на который указывает ссылка состоит более чем из четырех символом ASCII для 16-сегмента (и шестнадцати символов в остальных случаях). Стиль строки определяется настойками о которых будет сказано ниже. AF IMMOFF Этот флаг имеет смысл только для 32-разрядных сегментов. Если он установлен, то IDA будет преобразовывать 32-разрядные операнды в смещения. Для этого необходимо, что бы операнд был больше минимально возможного адреса загрузки 0x10000. Значительно облегчает дизассемблирование 32-разрядных приложений, автоматически корректно распознавая большинство смещений и указателей. Поскольку большинство приложений редко оперируют подобными величинами, то вероятность ложных срабатываний (то есть ошибочного преобразования константы в смещение) относительно невелика.
AF DREFOFF Если этот флаг установлен, то IDA будет автоматически пытаться преобразовать в смещения все двойные слова, содержащие ссылки из 32-разрядных сегментов. Преобразование в общем случае осуществляется успешно, если содержимое двойного слова больше, чем 0x10000
Поясним этот пример. Допустим, в 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 байты.
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 |