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

Аналогично авто анализу функция может выполняться в фоновом режиме. Поэтому, в скриптах эта функция используется совместно с Wait(). К сожалению никаких других, более развитых средств синхронизации не предусмотрено.

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

AnalyseArea(0,0x30000) успешно выполнится, даже если наименьшим из существующих окажется адрес 0x10000.

AnalyseArea(0,BADADDR-1); выполнится успешно и для удобства может быть определено как макрос AnalyseAll и размещено в файле ida.idc

При нормальном завершении функция возвращает 1 и 0 если анализ был прерван пользователем по нажатию Ctrl-Break.

Операнд

пояснения

линейный адрес начала анализируемой области

линейный адрес конца анализируемой области

Return

==return

пояснения

Анализ был успешно завершен

Анализ был прерван, нажатием Ctrl-Break

void AutoMark (long ea,long queuetype);

void AutoMark2 (long start,long end,long queuetype);

Функции, позволяющие непосредственно управлять автоанализом. Пользователь может явно указать, как будет трактоваться тот или иной регион. Допустим, нам известно, что в приведенном ниже примере по адресу 0xE расположены данные, а не код.

Однако IDA не может «догадаться» до этого и дизассемблирует код не так, как мы этого ожидаем.

Разумеется, можно прибегнуть к ручному анализу, но это будет слишком утомительно. Гораздо проще использовать следующие команды:

seg000:

0004 unk 0 4

0B8h

seg000:

0005

seg000:

0006

seg000:

0007

0BAh

seg000:

0008

seg000:

0009

seg000:

000A

0CDh

seg000:

000B

seg000:

000C

seg000:

000D

seg000:

000E

0B4h

seg000:

000F

AutoMark(0x1000E,AU UNK); MakeCode(0x10004);

seg000:0004 seg000:0004 seg000:0007 seg000:000A seg000:000C seg000:000C

loc 0 4:

mov ax, 3D02h

mov dx, 3200h

int 21h

jnb near ptr unk 0 1



seg000:000E seg000:000F

db 0B4h ; 1 db 3Ch ; <

Как видно, «MakeCode» дошла до адреса 0xE и остановилась. Это очень удобный способ ограничить диапазон ее действия (конечного адреса MakeCode не имеет).

Кроме этого с помощью AutoMark можно создавать функции, применять библиотеки сигнатур и так далее. Действие определяется выбором параметра queuetype. Для него определены следующие константы:

определение

действите

AU UNK

не исследовать указанную область

AU CODE

преобразовать указанную область в код

AU PROC

создать функцию по указанному адресу

AU USED

реанализ

AU LIBF

применить сигнатуру FLIRT

AU FINAL

свернуть все неисследованные области

Для одного и того же адреса допустимо задавать более одного указания. IDA помещает все запросы в очередь, поэтому «затирания» не происходит. После анализа запросы удаляются из очереди, поэтому при реанализе следует их задать повторно.

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

Обращаться с этой функцией следует осторожно. Если тип запроса не будет соответствовать определенным константам, то IDA выдаст сообщение об ошибке и аварийно выйдет в операционную систему без сохранения результата работы.

Операнд

пояснения

линейный адрес

queuetype

Тип запроса (смотри таблицу выше)

long FindText (long ea,long flag,long y,long x,char str);

Эта очень полезная и мощная функция для глобального поиска подстроки во всем дизассемблируемом тексте. Сюда входят не только строковые выражения, но и символьное представление инструкций, имен, комментариев, меток и перекрестных ссылок. Словом, равносильно тому, как если бы мы вывели результат работы в дизассемблера в LST файл - отчета и искали бы в нем требуют подстроку.

Заметим, что чаще все же так и поступают потому что то FindText работает достаточно медленно и не поддерживает символы-джокеры, как, например hiew. Очень часто критерии поиска настолько сложны, что не могут быть реализованы через FindText. Поэтому приходится прибегать к созданию хитрых скриптов для весьма изощренного поиска.

Однако, в ряде случаев FindText все же хватает для повседневых задач и легче использовать несколько вызовов этой функции с разными параметрами, чем прибегать к нештатным средствам.

Младший бит флага задает направление поиска. Если он установлен, то поиск будет идти от младших адресов к старшим и наоборот.

Первый, считая от нуля, бит флагов указывает на чувствительность функции к регистру. Если он установлен, то заглавные и строчечные символы будут различаться.

Координаты x и y применимы только к многострочным комментариям (ExtLinA\ExtLinB) в остальных жу случаях они игнорируются и могут быть равны нулю.

srt задает подстроку поиска.



seg000:005A 88 04 seg000:005C 46

seg000:005D E2 E7

seg000:005F BE EC 01

seg000:0062 E8 78 00

mov inc loop mov

call

[si], al si

loc 0 46 si, 1ECh sub 0 DD

Message("%x \n", FindText(0x1005A,1,0,0,"loop")

1005D

В случае ошибки поиска функция возвращает константу BADADDR.

Операнд

пояснения

Линейный адрес

flag

==flag

Направление поиска

Поиск «вперед»

Поиск «назад»

Return

==return

Пояснения

!=BADADDR

Линейный адрес найденного текстового вхождения

==BADADDR

Ошибка

char Demangle(char name, long disable mask)

Функция «размангляет» переданное ей имя name в соответствии с заданными настойками disable mask (см. таблицу ).

Если функция не может разманглить имя, она возвращает пустую строку. IDA Pro поддерживает спецификации Watcom, Microsoft и Borlad. Перечни символов используемых для замангления имен содержатся в поле "MangleChars" конфигурационного файла <ida.cfg>

MangleChars =

"@$%?" "@$%";

watcom microsoft borland

Пример использования:

Message(">%s\n",Demangle("??1streambuf@@UAE@XZ", MNG DEFNONE));

a) вызов функции Demangle для «размангления» имени "??1streambuf@@UAE@XZ"

>public: virtual thiscall streambuf::~streambuf(void)

b) результат

флаг

пояснения

MNG NOPTRTYPE

0x00000001

не показывать ни far, ни near, ни huge

модификаторы

MNG DEFNEAR

0x00000000

не показывать near модификатор

MNG DEFFAR

0x00000002

не показывать far модификатор

MNG DEFHUGE

0x00000004

не показывать huge модификатор

MNG DEFNONE

0x00000006

показывать модификаторы near, far, huge (если установлен MNG NOPTRTYPE. модификаторы не



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