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

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)

записывающих байт, слово и двойное слово соответственно.

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

Следующий пример меняет регистр всех символов на противоположный:

0:00010666

0:00010667

0:00010668

0:00010669

0:0001066A

0:0001066B

0:0001066C

0:0001066D

0:0001066E

0:0001066F

0:00010670

0:00010671

0:00010672

0:00010673

0:00010674

; !

0:00010675

0:00010676

0:00010677

a) исходные

данные -

требуется

противоположный

- требуется заменить регистр всех символов на

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)

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

long Word(long ea)

возвращает содержимое ячеек виртуальной памяти, расположенных по адресам ea и ea+1, располагая их в младшем и старшем байте машинного слова соответственно.

long Dword(long ea)

возвращает содержимое ячеек виртуальной памяти, расположенных по адресам ea, ea+1, ea+2 и ea+3, располагая их в младших и старших байтах младшего и старшего слова соответственно

функции модифицирующие значение ячейки виртуальной памяти

имя функции

краткое описание

void PatchByte(long ea,long value)

записывает в ячейку виртуальной памяти, расположенную по адресу ea, значение value

void PatchWord(long ea,long value)

записывает в ячейки виртуальной памяти, расположенные по адресам ea и ea+1, младший и старший байт значения value соответственно

void PatchDword(long ea,long value)

записывает в ячейки виртуальной памяти, расположенные по адресам ea, ea+1, ea+2 и ea+3 младшие и старшие байты младшего и старшего слова соответственно

функции трассиру

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

имя функции

краткое описание

long NextAddr(long ea)

возвращает следующий линейный адрес, если он существует, в противном случае - ошибку

long PrevAddr(long ea)

возвращает предыдущий линейный адрес, если он существует, в противном случае - ошибку

функции поиска

имя функции

краткое описание

long FindBinary(long ea,long flag,char str)

функции, манипулирующие с флагами

имя функции

краткое описание

long GetFlags (long ea)

возращает значение флагов виртуальной памяти

long SetFlags(long ea, long flags)

задает новые значения флагов виртуальной памяти

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