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

savefile(a,0,0x103D9,0x200);

[ ] F:\lDAF\fi1eme = 23:28:03

00000000: 50 53 26 A0 10 00 BB EA 03 38 07 74 07 43 80 3F PS&а□.+ъ□8□t□CА?

I 00000010: 00 75 F6 43 5B 58 C3 44 45 49 46 58 43 42 4C 53 1 .uyc[X+DEIFXCBLS

Возможность сохранения отдельных фрагментов файла очень полезна и может стать основой для множества утилит (например, такой, что извлекает все текстовые строки, встретившиеся в программе в отдельный файл)

Кроме того, она пригодится, если необходимо сохранить модифицированный вызовами PatchByte файл на диск. Дело в том, что IDA не поддерживает экспорт ни во что другое, кроме com и MS-DOS EXE. И то, и другое, очевидно, давным-давно устарело. И поддержку формата популярных сегодня PE файлов придется реализовывать самостоятельно.

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

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

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

Операнд

Пояснения

handle

Обработчик открытого на запись файла

Позиция в файле, относительно его начла

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

Size

Число байт для записи

Return

Завершение

Пояснения

Функция завершилась неуспешно

Функция завершилась успешно

long fgetc

(long handle);

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

При неуспешном возращении возвращает ошибку BADADDR - иначе очередной считанный символ. Если не достигнут конец файла, то указатель увеличивается на единицу.

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

auto a a=fope while(

Messag fclose

("readme.txt","rt"

ch=fgetc(a))!=-1) (ch);

This patch allows you to permanently access the bonus track and bonus car without winning the tournaments.

Операнд Пояснения

Дескриптор открытого с правами на чтения файла

handle



Return

Завершение

Пояснения

Норма

Считанный символ

Ошибка

BADADDR

long fputc

(long byte,long handle);

Функция записывает один байт в файл. Файл должен быть предварительно открыт с правами на запись функцией fopen.

При неуспешной записи возвратит ошибку BADADDR, иначе ноль.

Операнд

Пояснения

byte

Записываемый символ

handle

Дескриптор открытого с правами на запись файла

Завершение

Пояснения

Return

Норма

Ошибка

BADADDR

long fprintf (long handle,char format,...);

Ближайший аналог известной функции sprintf, однако, вместо буфера результат копируется в файл. Очевидно, что файл должен быть предварительно открыт с правами на запись вызовом fopen.

Например:

auto a,s0;

s0=0x123;

a=fopen("CON","wt"); fprintf(a, "%x \n",s0);

Управляющие символы стандартные, и частично совместимые с printf и полностью совместимы со спецификаторами функции Message встроенного языка IDA.

Сф пояснение

десятичное длинное знаковое целое Пример:

Message("%d",0xF); 15

шестнадцатеричное длинное целое строчечными символами Пример:

Message("%x",10); a

шестнадцатеричное длинное целое заглавными символами Пример:

Message("%X",10); A

восьмеричное длинное знаковое целое Пример:

Message("%o",11);

%u десятичное длинное беззнаковое целое



Пример:

Message("%u",-1); 4294967295

десятичное с плавающей точной Пример:

Message("%f", 1000000); 1.e6

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

Message("%c",33); !

строковое значение Пример:

Message("%s","Hello, Word! \n"); Hello, Word!

вывод чисел в экспоненциальной форме Пример:

Пример:

Message("%e", 1000000); 1.e6

вывод чисел в экспоненциальной форме

ЗАМЕЧАНИЕ: В оригинале спецификатор %а заставляет функцию саму решать, в какой форме выводить число - с десятичной точкой или в экспоненциальной форме, из соображений здравомыслия и удобочитаемости. IDA всегда при задании этого спецификатора представляет числа в экспоненциальной форме.

вывод указателя (не поддерживается)

ЗАМЕЧАНИЕ: вместо спецификатора %p IDA использует %a, преобразующее линейный адрес в строковой сегментный, и автоматически подставляет имя сегмента.

Так, например, Message("%a \n", 0x10002) выдаст seg000:2. Обратите внимание, что таким способом нельзя узнать адрес переменной.

Пример:

auto a;

a="Hello! \n";

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

Возвращается ноль, а не указатель на переменную.

вывод десятичного целого всегда со знаком, не опуская плюс.

в оригинале - вывод шестнадцатеричного целого всегда со знаком, но ida воспринимает эту конструкцию точно так же как и x.

n длина выводимого десятичного числа, при необходимости дополняемая слева пробелами. Например:

Message("Число-%3d \n",1); Число- 1

Если выводимое число не укладывается в n позиций, то оно выводится целиком.

Например:

Message("Число-%3d \n",10000);

Число-10000

n длина выводимого шестнадцатеричного числа, при необходимости дополняемая слева пробелами. Например:



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