如何使用 C++ 编写具有多级指针的进程内存?
Posted
技术标签:
【中文标题】如何使用 C++ 编写具有多级指针的进程内存?【英文标题】:How to write process memory with multilevel pointer with c++? 【发布时间】:2019-05-10 19:47:38 【问题描述】:我正在尝试为 RE2 作弊。我发现内存是带有欺骗引擎的指针扫描的。我的代码不工作:(
#include <iostream>
#include <windows.h>
using namespace std;
int main()
int newValue = 10 ;
HWND hwnd = FindWindowA(NULL, "RESIDENT EVIL 2");
if ( hwnd == NULL )
cout << endl << "Process handle not found !" << endl;
return 0 ;
else
DWORD pId;
GetWindowThreadProcessId(hwnd, &pId);
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
if(!hProc)
cerr << "Cannot open process !" << endl ;
else
int c = WriteProcessMemory(hProc, (LPVOID)0x707B6D0 + 0x80 + 0x78 + 0x98 + 0x50 + 0x18, &newValue, (DWORD)sizeof(newValue), NULL);
if (c>0)
clog << "yes" << endl ;
else
clog << "no" << endl ;
CloseHandle(hProc);
return 0;
【问题讨论】:
如果您需要,我可以将 .net 或 C# 发送给您。您是否正确获取客户名称?确保它不是动态的。 不起作用是什么意思?错误检查在哪里? 【参考方案1】:您误解了 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;
【讨论】:
【参考方案2】:您需要在每个偏移量之间取消引用,以便您遵循指针链。仅添加偏移量是不够的。
这是为您执行此操作的函数,请记住没有错误检查:
uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
uintptr_t addr = ptr;
for (unsigned int i = 0; i < offsets.size(); ++i)
ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
addr += offsets[i];
return addr;
调用函数如下所示:
uintptr_t ammoAddr = FindDMAAddy(hProcess, dynamicPtrBaseAddr, 0x374, 0x14, 0x0 );
它不会取消引用最后一个偏移量,这是理想的。
之后,使用该函数的返回值作为 lpBaseAddress 参数调用 WriteProcessMemory。
【讨论】:
以上是关于如何使用 C++ 编写具有多级指针的进程内存?的主要内容,如果未能解决你的问题,请参考以下文章
Linux中多个进程使用文件指针读取文件时是不是使用共享虚拟内存?