Анимация
JavaScript
|
Главная Библионтека if(isLoaded(ea)) значение ячейки определенно, можно читать; else значение ячейки не определено либо ячейка не существует" Замечание: макрос byteValue(F), определенный в файле <idc.idc>, при правильном употреблении позволяет сократить количество вызов GetFlags, а, следовательно, увеличить производительность программы. Вызывать его следует так: F = GetFlags(ea); if (hasValue(F)) val = byteValue(F); Использование функции Byte обычно требует двух вызов GetFlags - один раз для проверки значения ячейки, второй - для ее чтения. Если же ячейка заведомо существует и гарантировано содержит инициализированное значение, проверку можно опустить - в этом случае макрос byteValue не будет иметь никаких преимуществ перед функцией Byte. Пример использования: auto a; Message(">"); for (a=0x10666;a<0x10676;a++) if (isLoaded(a)) Message("%c",Byte(a)); else Message("!OmMBKA!\n"); >Hello, IDA Pro! Модификация ячеек виртуальной памяти осуществляется функциями PatchByte (long ea, long value), PatchWord (long ea, long value) и PatchDword (long ea, long value) записывающих байт, слово и двойное слово соответственно. Попытка модификации несуществующей ячейки виртуальной памяти заканчивается провалом. Следующий пример меняет регистр всех символов на противоположный:
противоположный - требуется заменить регистр всех символов на auto a; for(a=0x10666;a<0x10674;a+ PatchByte(a, Byte(a) 0x20); b) скрипт, меняющий регистр всех символов на противоположный, посредством вызова функции PatchByte :00010666 db 68h ; h :00010667 db 45h ; E :00010668 db 4Ch ; L :00010669 db 4Ch ; L 0:0001066A db 4Fh ; O :0001066B db 0Ch ; :0001066C db 0 ; 0:0001066D db 69h ; i ):0001066E db 64h ; d :0001066F db 61h ; a 0:00010670 db 0 ; :00010671 db 70h ; p :00010672 db 52h ; R 0:00010673 db 4Fh ; O 0:00010674 db 21h ; ! :00010675 db 20h ; :00010676 db 0Dh ; 0:00010677 db 0FFh ; c) результат - регистр всех символов изменен на противоположный Пара функций NextAddr(long ea) и PrevAddr(long ea) позволяют трассировать адресное пространство виртуальной памяти, «проходясь» по цепочке «включенных» адресов. Функция NextAddr(long ea) возвращает первый «включенный» адрес, следующий за "ea", соответственно PrevAddr(long ea) возвращает первый «включенный» адрес, предшествующий "ea". Пример использования: auto a; a=0; while(1) { a=NextAddr(a); if (aBADADD) break; Message("0:%08X\tdb %x;",a,Byte(a)); if (Byte(a)>0x20) Message("%c",Byte(a)); Message("\n"); a) скрипт, демонстрирующий трассировку адресов 0:00010666odb 68;h 0:00010667odb 45;E 0:00010668odb 4c;L 0:00010669odb 4c;L 0:0001066Aodb 4f;O 0:0001066Bodb c; 0:0001066Codb 0; 0:0001066Dodb 69;i 0:0001066Eodb 64;d 0:0001066Fodb 61;a 0:00010670odb 0; 0:00010671odb 70;p 0:00010672odb 52;R 0:00010673odb 4f;O 0:00010674odb 21;! 0:00010675odb 20; 0:00010676odb d; 0:00010677odb ff; b) результат - отображены только существующие адреса Сводная таблица функций ??? #Верстальщику ChangeTable
long Byte (long ea) Функция возвращает значение байта виртуальной памяти, расположенного по 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 |