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

char GetInputFile ()

Возвращает имя дизассемблируемого файла

long GetLongPrm (long offset);

long GetShortPrm(long offset);

long GetCharPrm (long offset);

success SetLongPrm (long offset,long value);

success SetShortPrm(long offset,long value);

success SetCharPrm (long offset,long value);

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

Это может показаться излишне сложным, но на самом деле все они сводятся к простому чтению \ записи непрерывного фрагмента памяти, в котором IDA и хранит свои настройки.

Три функции чтения GetLongPrm, GetShortPrm, GetCharPrm отличаются только возвращаемым значением. Первая возвращает длинное целое, вторая короткое целое и последняя строку.

В каком-то смысле все они взаимозаменяемы. Т.е. можно использовать GetLongPrm для чтения короткого целого, если потом «врачую» маскировать старшие биты возращенного значения.

Обратите внимание, что GetCharPrm возвращает не строку, оканчивающуюся нулем, а только один байт.

Чтение же всей строки целиком приходится осуществлять пошагово в цикле байт за байтом. Или можно воспользоваться GetLongPrm, читая строку по четыре байта за раз (это удобнее да и быстрее).

offset это смещение внутри структуры, в которой IDA и хранит настойки. Ниже это будет подробно описано. А пока обратим внимание на то, что IDA не запрещает передавать функции произвольное смещение внутри структуры.

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

НАСТОЙКИ IDA

Первые три байта хранят в себе слово IDA. Хотя это и не сообщается в документации, но нетрудно убедится, что это именно так и есть.

Message("%s%s\n",

GetShortPrm(O),

GetCharPrm(2)

INF VERSION

Содержит, переменную типа Short хранящую версию базы IDA. Например:

Message("%x \n",



GetShortPrm(INF VERSION)

INF PROCNAME

Хранит восьмисимвольное имя выбранного типа процессора дизассемблируемого текста. Для процессоров серии 80x86 предусмотрены следующие соответствия:

Intel 8086

8086

Intel 80286 real

80286r

Intel 80286 protected

80286p

Intel 80386 real

80386r

Intel 80386 protected

80386p

Intel 80486 real

80486r

Intel 80486 protected

80486p

Intel Pentium real with MMX

80586r

Intel Pentium protected with MMX

80586p

Intel Pentium Pro (P6) with MMX

80686p

Intel Pentium II

p262

AMD K6-2 with 3DNow!

K62p3

Intel Pentium III

p3ntel

Наиболее разумным (и быстрым) способом извлечения этого поля, вероятно, окажется чтение его с помощью GetLongPrm как показано ниже:

Message("%s%s \n", GetLongPrm(INF PROCNAME), GetLongPrm(INF PROCNAME+4)

p3ntel

ПРИМЕЧАНИЕ: Это поле может только считываться. Все попытки его модификации посредством SetXXXPrm будут проигнорированы.

INF LFLAGS

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

LFLG PC FPP (0x1)

Декодировать инструкции арифметического сопроцессора.

LFLG PC FLAT (0x2)

Плоская модель памяти

плавающей запятой для



Обратите внимание, что изменение последнего параметра может повлечь за собой непредсказуемую работу дизассемблера и привести к неверному анализу исследуемого файла!

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

auto a;

a=GetCharPrm(INF LFLAGS); Message("%x \n",a); if (a & LFLG PC FPP)

Message ("Decode FPP \n"); if (a & LFLG PC FLAT)

Message ("FLAT MODEL \n");

Decode FPP

INF DEMNAMES

Однобайтовое поле, определяющие каким образом IDA будет «заманглять» имена. Безболезненно может как считываться, так и модифицироваться.

DEMNAM CMNT (0);

Отображать замангленные имена как комментарии. Например:

SetCharPrm(INF DEMNAMES,DEMNAFM CMNT);

.text:00403E79 ?sputc@streambuf@@QAEHH@Z proc near ; streambuf::sputc(int)

DEMNAM NAME (1)

Заманглять в имена. Например:

SetCharPrm(INF DEMNAMES,DEMNAFM NAME);

.text:004 03E7 9 public: int thiscall streambuf::sputc(int) proc

near

DEMNAM NONE (2)

Не заманглять и представлять имена как есть.

SetCharPrm(INF DEMNAMES,DEMNAFM NONE);

.text:00403E79 ?sputc@streambuf@@QAEHH@Z proc near

При установке нового значения IDA автоматически начнет реанализ и внесет все изменения в дизассемблируемый текст.



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