Так теперь мы поняли, для того что-бы из нашего плагина, записать значение в память нужно сделать так:
*(BYTE*)адрес = значение; //для 1 байта, целого значения
*(WORD*)адрес = значение; //для 2 байтов, целого значения
*(int*)адрес = значение; //для 4 байтов, целого значения
*(float*)адрес = значение; //для 4 байтов, вещественного значения
Для того что-бы считывать значения из памяти GTA Vice City в нашем плагине, то можно поступить так:
переменная = *(BYTE*)адрес; //для 1 байта, целого значения
переменная = *(WORD*)адрес; //для 2 байтов, целого значения
переменная = *(int*)адрес; //для 4 байтов, целого значения
переменная = *(float*)адрес; //для 4 байтов, вещественного значения
Думаю если вы разбираетесь в C++, то все будет вам понятно но все же разберем, как работает данный код. Так возьмем для примера запись в 1 байт BYTE. Изначально как мы помним из всех известных правил, выражение выполняется в скобке первым значит наш тип это типизированный указатель на BYTE, выглядит так (BYTE*) тут же мы его разыменовываем при чем по адресу и затем записываем в него значение. Для того что-бы понять весь этот процесс визуально, возьмем для примера, участок памяти 005CCB19.
Если мы будем использовать такой код
“*(BYTE*)адрес“, не важно для записи или чтения, то мы захватим такую область в памяти:
Если
“*(WORD*)адрес” то захватим эти адреса 005CCB19 и 005CCB1A:
Наконец если же
“*(int*)адрес” то мы захватим аж 4 адреса, так как тип 4 байта 005CCB19, 005CCB1A, 005CCB1B, 005CCB1C:
Вообщем теперь более понятно, что обхватываемый участок записи, зависит от размера типа.
Ну вот собственно и все, мы научились теперь записывать и считывать свои значения в памяти GTA Vice City все достаточно просто. Напомню что VirtualProtect функция нужна будет, перед записью там, где стоит защита от записи. Перед записью и чтением, не забудь-те вызывать эту функцию, Об этой функции информация есть в интернете.
Скачать пример ASI [7,29 Kb] (cкачиваний: 38)