您误解了 Cheat Engine 向您展示的内容。
在您的代码中,0x707B6D0 + 0x80 + 0x78 + 0x98 + 0x50 + 0x18
equals0x707B8C8
甚至与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;
}