Анимация
JavaScript
|
Главная Библионтека адресу 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 Пример использования:
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
Родственные функции: Word, Dword Интерактивный аналог: нет long Word (long ea) Функция возвращает значение слова (одно слово равно двум байтам) виртуальной памяти, расположенного по адресу ea. При попытке чтения байта, расположенного по несуществующему адресу, равно как и имеющего неопределенное значение, функция возвращает значение 0xFF, сигнализируя об ошибке. Наглядно продемонстрировать работу функции позволяет следующий пример:
>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
Родственные функции: Byte, Dword. Интерактивный аналог: нет long Dword (long ea) Функция возвращает значение двойного слова виртуальной памяти по указанному В остальном она полностью аналогична функции Word. ??? #верстальщику - change table адресу.
Родственные функции: 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 |