Вы неверно истолковываете то, что Cheat Engine показывает вам.
В вашем коде 0x707B6D0 + 0x80 + 0x78 + 0x98 + 0x50 + 0x18
равно 0x707B8C8
, что НИКОГДА даже близко к значению 0x0EC1A3F0
, которого вы пытаетесь достичь.
Вместо этого вам нужно сделать следующее:
Сначала прочитайте указатель, который хранится по базовому адресу 0x707B6D0
(значение чтения 0x128BFBB0
).
Затем добавьте 0x18
к этому указателю (0x128BFBB0 + 0x18 = 0x128BFBC8
) и прочитайте новый указатель по этому адресу (значение считано 0x128564D0
).
Затем добавьте 0x50
к этому указателю (0x128564D0 + 0x50 = 0x12856520
) и прочитайте новый указатель по этому адресу (считанное значение 0x0F2EC940
).
Затем добавьте 0x98
к этому указателю (0x0F2EC940 + 0x98 = 0x0F2EC9D8
) и прочитайте новый указатель по этому адресу (считанное значение 0x0F2EB2B0
).
Затем добавьте 0x78
к этому указателю (0x0F2EB2B0 + 0x78 = 0x0F2EB328
) и считайте новый указатель по этому адресу (считываемое значение 0x0EC1A370
).
Затем добавьте 0x80
к этому указателю (0x0EC1A370 + 0x80 = 0x0EC1A3F0
) и запишите свои данные по этому адресу.
Попробуйте что-то вроде этого:
#include <iostream>
#include <stdexcept>
#include <memory>
#include <windows.h>
DWORD_PTR readPointerFromProc(HANDLE hProc, DWORD_PTR baseAddr)
{
DWORD ptr;
if (!ReadProcessMemory(hProc, reinterpret_cast<LPVOID>(baseAddr), &ptr, sizeof(ptr), NULL);
throw std::runtime_error("Cannot read from process !");
return ptr;
}
void WriteIntToProc(HANDLE hProc, DWORD_PTR baseAddr, int value)
{
if (!WriteProcessMemory(hProc, reinterpret_cast<LPVOID>(baseAddr), &value, sizeof(value), NULL);
throw std::runtime_error("Cannot write to process !");
}
struct HandleDeleter
{
typedef HANDLE pointer;
void operator()(HANDLE handle) const { CloseHandle(handle); }
};
int main()
{
int newValue = 10;
try
{
HWND hwnd = FindWindowA(NULL, "RESIDENT EVIL 2");
if (!hwnd)
throw std::runtime_error("Process window not found !");
DWORD pId = 0;
GetWindowThreadProcessId(hwnd, &pId);
HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pId);
if (!hProc)
throw std::runtime_error("Cannot open process !");
std::unique_ptr<HANDLE, HandleDeleter> hProc_deleter(hProc);
DWORD_PTR ptr = readPointerFromProc(hProc, 0x707B6D0);
ptr = readPointerFromProc(hProc, ptr + 0x18);
ptr = readPointerFromProc(hProc, ptr + 0x50);
ptr = readPointerFromProc(hProc, ptr + 0x98);
ptr = readPointerFromProc(hProc, ptr + 0x78);
writeIntToProc(hProc, ptr + 0x80, newValue);
}
catch (const std::exception &e)
{
std::cerr << e.what() << std::endl;
return 0;
}
std::cout << "Success !" << std::endl;
return 0;
}