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

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

Более сложные скрипты как правило создаются в отдельном файле, загружаемый нажатием <F2> или заданием ключа "-Sfilename" в командной строке, причем между "-S" и именем файла не должно присутствовать символа пробела.

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

Рисунок 11 0x017 IDAC: Область вывода результатов работы скрипта «консоль» Рисунок 12 0x018 IDAG: Область вывода результатов работы скрипта «консоль»

Функции, объявление функций, аргументы функции, возвращаемое значение

IDA поддерживает функции двух типов - встроенные (build-in) функции и функции, определяемые пользователем. Объявление пользовательских функций происходит следующим образом - перед именем функции указывается ключевое слово "static", а за именем в круглых скобках через запятую перечисляются аргументы (если они есть) без указания их типа, например, так:

static MyFunc() static MyOtherFunc(x,y,s0)

тело функции; тело функции;

Ограничения: максимально допустимая длина имени функции равна 16 символам; возможность организовывать вложенные функции отсутствует.

Консоль не поддерживает объявления функций, сообщая при этом о синтаксической ошибке, функции могут быть объявлены только в idc-файлах.

Все функции, объявленные как "static" (т.е. все функции вообще, поскольку, локальные функции IDA не поддерживает) будучи однажды загруженными, резидентно остаются в памяти на протяжении всего сеанса работа с дизассемблером и в любой момент доступны для вызова из консоли или других программ.

Например, если создать idc-файл следующего содержания: «static Demo(s0) {Waming(s0);}», загрузить его нажатием <F2>, нажать <Shift-F2> для вызова консоли и набрать нечто наподобие "Demo("Heiio, ida!");" появится диалоговое окно, выводящее указанную строку на экран.

static-функции не могут быть выгружены из памяти, но могут перекрываться повторным объявлением. Встроенные в IDA функции перекрыть нельзя.

Если в тексте скрипта объявлена функция main(), она автоматически выполняется при его загрузке.

Возврат значения функции осуществляется посредством "return" с последующим указанием имени переменной или константы, например, так:

static MyFunc(x,y) staic MyOtherFunc()

return x-y; return "Hello, IDA Pro\\n";

Пустой "return", равно как и его отсутствие, возвращает нулевое значение (пустую

строку).



Объявление переменных, типы переменных, преобразования переменных

Для объявления переменных используется ключевое слово auto за которым последовательно перечисляются декларируемые переменные, отделенные друг от друга запятой. Инициализация при объявлении не поддерживается.

Например:

auto x; auto x,y,z;

a) верно

auto x=1;

b) неверно

Все переменные, объявленные таким образом, локальные; поддержка глобальных переменных, доступных всем функциям отсутствует. Вместо этого IDA поддерживает виртуальные массивы, доступные всем функциям всех загруженных скриптов одновременно (см. главу ??? «Виртуальные массивы»).

Имя переменной не должно совпадать ни с одним зарезервированным ключевым словом. Зарезервированные ключевые слова в IDA те же самые, что и в Си.

IDA поддерживает два типа переменных - переменные типа строка и переменные типа число.

Строковые переменные ограничены максимальной длиной в 255 символов и заканчиваются нулем. Над ними доступны три операции - присвоение, контекция (слияние) и сравнение.

Переменные типа число в свою очередь делятся на два подтипа: long - 32-разрядное знаковое целое и float - число с плавающей запятой до 25 разрядов. Над ними обоими доступны операции - присвоение, сравнение, сложение, вычитание, умножение, деление. Над целочисленными переменными доступны битовые операции -циклический сдвиг вправо и влево, битовое И, битовое НЕ, битовое ИЛИ, битовое НЕТ и битовое ИЛИ-ИСКЛЮЧАЮЩЕЕ-И.

Преобразования типов переменных осуществляются автоматически и просиходят в следующих случаях:

• если левая переменная - строка, то и правая переменная преобразуется в строку;

• если левая переменная - длинное целое, а правая - строка, правая переменная преобразуется в длинное целое;

• если одна из переменных имеет тип float, все остальные переменные преобразуются в тип float;

• если над переменной выполняются одна из битовых операций, она преобразуется в длинное целое

Преобразование «строка длинное целое» осуществляется по следующей схеме: если левая часть строки представляет собой число, записанное в десятичной нотации, результат преобразования равен этому числу, в противном случае - нулю.

Примеры:

auto s0,s1,s2,s3;

s0="1234"; s1="1234mystring","0x1234","MyString"; Message(">%d,%d,%d,%d\n",s0,s1,s2,s3);

>1234,1234,0,0



Преобразование «длинное целое строка» осуществляется путем дописывания завершающего нуля к преобразуемому значению. Примеры:

auto a,b;

a=0x21;b=0x222 32 42 5; Message(">%s,%s\n",a,b);

> !,%$#"

Преобразование «строка float» осуществляется аналогично преобразованию «строка длинное целое», включая дробную часть; если же преобразование невозможно, результат равен нулю.

Например:

auto s0,s1;

s0="1.1"; s1="MyString"; Message(">%f,%f\n",s0,s1);

> 1.1, 0.

Преобразование «float строка» в отличие от преобразования «длинное целое строка» осуществляет действительно корректное преобразование, сравните:

auto f; f="1.2";

Message(">%s\n",f);

auto a; a=0x21;

Message(">%s\n",a);

> 1.2

При сложении двух строковых переменных происходит их контакция (слияние); при вычитании одной строки из другой левый операнд игнорируется, а над каждым символом правого выполняется операция NEG (дополнение до нуля); при делении и умножении сток друг на друга они преобразуются к длинному целому. Операции вычитания, деления и умножения строк недокументированны и по-разному могут вести себя в зависимости от версии IDA. Рекомендуется воздержаться от использования их в собственных программах.

Смешивание операндов различных типов заставляет внимательно относиться к порядку расстановки их выражении - результат может зависеть от перемены мест слагаемых, например:

auto x,s0;x=1;s0="3h"; Message(">%x\n",x+s0);

auto x,s0;x=1;s0="3h"; Message(">%x\n",s0+x);

>4

>3

Пояснение: в первом случае левая переменная - длинное целое, поэтому, строка "3h" преобразуется к длинному целому, в результате чего получается: 1+3=4; во втором случае левая переменная - строка, поэтому, длинное целое #1 преобразуется к строке, в результате чего получается: "3h"+\x1 = "3h\x1", но затем "3h\x1" вновь преобразуется к длинному целому, ибо того требует спецификатор "%x", а "3h\x1" = #3. Так что от перемены мест слагаемых сумма меняется!

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

long ( переменная ) Преобразует переменную в длинное целое char ( переменная ) Преобразует переменную в строку



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