gpt4 book ai didi

c++ - 从 ".exe"+ 偏移量读取内存?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:36 25 4
gpt4 key购买 nike

我正在使用 WinAPI 的 ReadProcessMemory() 从游戏中读取一些“隐藏”信息。

我已经使用 Cheat Engine 找出静态指针,但我不知道如何从中读取。Cheat Engine 给了我一个指向这样的东西的指针:"mygame.exe"+1C50

我是 WinAPI 的新手,如何将 "mygame.exe"+1C50 转换为可以使用 ReadProcessMemory() 读取的地址?

编辑: 我尝试简化问题,但我想我应该首先给出完整的代码。所以我在这里使用静态地址和多级指针,但我仍然坚持获取基地址或 w/e。

这是完整的代码和a picture of my cheat engine address :

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>

using namespace std;

HANDLE GetProcessHandle(const char *procName);

int main()
{
const char *procName = "prism3d.exe";
HANDLE hProc = GetProcessHandle(procName);
if (hProc) {

/* This works if I use the dynamic address (f.e. 0x02C2C4DC),
but it changes every time I restart the game.
I need to use the static address (prism3d.exe+A1C) to get
the dynamic address for my "nuke".
*/
float nuke;
ReadProcessMemory(hProc, (void*)0x02C2C4DC, &nuke, 4, 0);
cout << nuke;

}
CloseHandle(hProc);
return 0;
}

HANDLE GetProcessHandle(const char *procName)
{
HANDLE hProc = NULL;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(hSnapshot, &pe32)) {
do {
if (!strcmp(pe32.szExeFile, procName)) {
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
return hProc;
}

编辑 2:这是我尝试读取核弹值的方法,但它给我随机数,每次重新启动游戏时都不同(有时是 0,有时是 324324324,等等。 .):

if (hProc) [

DWORD baseAddr = (DWORD)GetModuleHandle(procName) + 0xA1C50; // also tried this with GetModuleHandle(NULL)
DWORD mainAddr;
ReadProcessMemory(hProc, (void*)(baseAddr + 0x111C), &mainAddr, 4, 0);

// Nuke
float nuke;
DWORD nukeAddr;
ReadProcessMemory(hProc, (void*)(mainAddr + 0x48), &nukeAddr, 4, 0);
ReadProcessMemory(hProc, (void*)nukeAddr, &nuke, 4, 0);
cout << nuke;
}

最佳答案

基本偏移量一般是模块在内存中的开始,你可以通过GetModuleHandle获取(返回的地址是PE在内存中的开始)。我说一般是因为一些约定定义了相对于代码部分开头的基数,然后您需要从 PE 中读取它。

您可以执行以下操作:

UINT_PTR addr = (UINT_PTR)GetModuleHandle("game.dll") + 0x1C50;
ReadProcessMemory(hProc,(void*)addr,pBuffer,nSize,&BytesRead);

只有当你在目标进程的地址空间中运行时(通过 dll 注入(inject)),以上才有效,要通过远程进程执行此操作(如你的示例所示),你需要枚举进程模块以获得您感兴趣的模块的有效句柄。

MSDN 有一个例子 here ,稍微重构一下,您可以创建一个函数来检查名称并返回 HMODULE 如果它匹配,转换它会给你模块基址。

关于c++ - 从 ".exe"+ 偏移量读取内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17964666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com