Иногда бывает, такие случаи, что один участок памяти (т.е переменная) используется в разных местах, для разных вещей. Но это нам не всегда нужно, например когда мы разрабатывает различные моды для GTA Vice City в виде плагинов. Теперь для примера, сейчас будет наша задача, поменять иконки оружия размеры, но не просто поменять, а задать тут же высоту и ширину, по разному. Теперь откроем базу для GTA Vice City в IDA pro, об этой программе, вкратце рассказывалось в предыдущих статьях. После нажмем кнопку “G” и вобьем адрес 005586F5 и попадем на нужное нам место. Здесь я выделил то, что нам надо будет заменять:
IDA pro GTA Vice CityТут я выделил именно то, что нам придется подменить на свои адреса, в нашем случае это будет так
0x05586F5 + 2
0x0558706 + 2
Так как D9, 05 – это сами команды процессора по этому смешаемся на 2, нам лишь, нужно будет подменить их параметр а он же и есть адрес. Что-бы долго не думать с областью памяти, с которой будем делать операции записи и чтения, захватим сразу такой участок:
Что-бы быстро вычислить размер всей памяти, сколько нам надо указать для изменения атрибутов, поступим так
( конечный адрес (55870C) – начальный адрес (05586F5) = размер всего 0x17), вот и наш размер в hex 0x17, для таких расчетов, вы можете спокойно использовать стандартный калькулятор в режиме программист, об этом я уже говорил ранее. Ну и еще, глянем само значение подминаемого адреса, просто сделав клик по “fhudiconWeaponSize”, но у вас оно будет называться по другому, вы можете также кстати его назвать. После того как сделаем клик мы увидим такую картину:
Там где я выделил красным маркером, это и есть тот самый наш адрес переменной, где как видно хранится значение которое равно 64.0. Это 4 байтовый тип float и есть размер иконки вооружения. Теперь напишем для практики код на C++ нашего плагина:
#include "stdafx.h"
//Объявляем наши переменные
//Тут же сразу инициализируем их значениями
float WpnIconHeight = 30.0;
float WpnIconWidth = 50.0;
//Это наша процедура, которая заменить адреса
//Затем все делаем как было написано в статье
void Replace_varIconSize(){
DWORD _old;
VirtualProtect((LPVOID)0x05586F5, 0x17, PAGE_READWRITE, &_old);
*(DWORD*)(0x05586F5 + 2) = (DWORD)&WpnIconWidth; //Здесь мы записываем адрес переменной WpnIconWidth
*(DWORD*)(0x0558706 + 2) = (DWORD)&WpnIconHeight; //Сперва получаем адрес с помощью & этого и приводим его с помощью (DWORD)
VirtualProtect((LPVOID)0x05586F5, 0x17, _old, &_old);
};
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//Тут идет вызов нашей процедуры, как игра запустится
Replace_varIconSize();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Если все было сделано, правильно то в игре эта иконка будет выглядит так:
Как видно, иконка согласно заданных значений, изменила размеры. Имейте введу, что теперь после замены, переменных, вы просто можете потом к ним обращаться как к своим родным:
WpnIconHeight = 64.0;
WpnIconWidth = 64.0;
Когда вам, будет это нужно. Ну и конечно же, пример исходника прилагается:
Скачать пример [22,54 Kb] (cкачиваний: 41)