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

адресу ea. Если указанный адрес не существует, функция возвращает 0хFF, сигнализируя об ошибке, такое же значение возвратится и в том случае если ячейка имеет не инициализированное значение.

Поэтому, до вызова функции Byte следует убедиться, что ячейка действительно существует и имеет определенное значение. Проверить это можно, проанализировав младший бит поля атрибутов, определенный в файле <idc.idc> константой FF INV, - если он не равен нулю, то все окей:

if (FF INV & GetFlags(ea))) value=Byte(ea);

else ячейка не существует или имеет неиницилизированное значение

В файле <idc.idc> определены два макроса hasValue(F) и isLoaded(ea), выполняющие такие проверки. Макрос hasValue(F) ожидает флаг виртуальной памяти, а isLoaded(ea) линейный адрес ячейки, т.е.:

if(hasValue(GetFlags(ea))) value=Byte(ea);

else ячейка не существует или имеет неиницилизированное значение

if(isLoaded(ea)) value=Byte(ea);

else ячейка не существует или имеет неиницилизированное значение

Альтернативой функции Byte служит вызов GetFlags с последующей маскировкой старших 24-бит, содержащих поле атрибутов. Маской может служить определенная в файле <idc.idc> константа MS VAL или непосредственное значение - 0xFF. Это может выглядеть так: value = (MS VAL & GetFlags(ea)).

Для увеличения производительности скрипта можно использовать макрос byteValue(F), определенный в файле <idc.idc>, передавая ему значение флагов, ранее полученное для выполнения проверки существования ячейки:"F=GetFlags(ea); if (hasValue(F)) value=byteValue(F); " - это позволяет избавиться от вызова функции Byte, экономя тем самым некоторое количество процессорного времени.

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

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

0:00010000

48h ;

0:00010001

65h ;

0:00010002

6Ch ;

0:00010003

6Ch ;

0:00010004

6Fh ;

0:00010005

2Ch ;

0:00010006

20h ;

0:00010007

49h ;

0:00010008

44h ;

0:00010009

41h ;

0:0001000A

20h ;

0:0001000B

50h ;

0:0001000C

72h ;

0:0001000D

6Fh ;

0:0001000E

21h ;

0:0001000F

20h ;

0:00010010

0Dh ;

0:00010011

0Ah ;

a) исходные данные - требуется вывести на консоль содержимое отображаемых



ячеек памяти

auto a; Message(">");

for (a=0x10000;a<0x10011;a++)

Message("%c",Byte(a));

Message("\n");

b) последовательный вызов Byte для каждой ячейки

> Hello, IDA Pro!

c) результат

Другие примеры использования функции Byte можно найти в главе «Первые шаги с IDA Pro» и в файле "memcpy.idc", входящим в комплект поставки IDA.

??? #Верстальщику - change table

аргумент

пояснения

линейный адрес ячейки виртуальной памяти

return

=return

пояснения

содержимое байта ячейки виртуальной памяти

==0xFF

ошибка

Родственные функции: Word, Dword Интерактивный аналог: нет

long Word (long ea)

Функция возвращает значение слова (одно слово равно двум байтам) виртуальной памяти, расположенного по адресу ea. При попытке чтения байта, расположенного по несуществующему адресу, равно как и имеющего неопределенное значение, функция возвращает значение 0xFF, сигнализируя об ошибке. Наглядно продемонстрировать работу функции позволяет следующий пример:

0:00010000

48h ;

0:00010001

65h ;

0:00010002

6Ch ;

0:00010003

6Ch ;

0:00010004

6Fh ;

0:00010005

2Ch ;

0:00010006

20h ;

0:00010007

49h ;

0:00010008

44h ;

0:00010009

41h ;

0:0001000A

20h ;

0:0001000B

50h ;

0:0001000C

72h ;

0:0001000D

6Fh ;

0:0001000E

21h ;

0:0001000F

20h ;

0:00010010

0Dh ;

0:00010011

0Ah ;

Message(">%X\n", Word

(0x10000));



>6548

Message(">%X\n", Word (0x0)); >FFFF

Message(">%X\n", Word (0x10011));

>FF0A

Message(">%X\n", Word (0xFFFF));

>48FF

В первом случае существуют оба адреса (т.е. 0x10000 и 0x10001) и функция отрабатывает успешно; во втором - ни существует ни одного из них - ни 0x0, ни 0x1, в результате чего возвращается 0xFFFF.

Но попытка прочитать слово, расположенное по адресу 0x10011, приводит к тому, что в младшем байте возвращается значение соответствующей ячейки, а в старшем -0xFF! Аналогично и в последнем примере - несуществующий младший байт дает 0xFF, в то время как старший читается успешно.

Поэтому, до вызова функции Word следует убедиться, что обе ячейка действительно существуют и имеют определенные значение. Проверить это можно, проанализировав младший бит поля атрибутов каждой из ячеек - если он не равен нулю, то все окей. О том как это сделать подробно рассказано в описании функции Byte.

??? #верстальщику - change table

аргумент

пояснения

линейный адрес ячейки виртуальной памяти

return

==return

пояснения

содержимое слова виртуальной памяти

ошибка

Родственные функции: Byte, Dword. Интерактивный аналог: нет

long Dword (long ea)

Функция возвращает значение двойного слова виртуальной памяти по указанному В остальном она полностью аналогична функции Word. ??? #верстальщику - change table

адресу.

аргумент

пояснение

линейный адрес ячейки виртуальной памяти

return

==return

Пояснения

содержимое двойного слова виртуальной памяти

==(FF)

ошибка

Родственные функции: Byte, Word Интерактивный аналог: нет



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