C++写进程内存()-如何获得正确的LpBaseAdvor?

C++写进程内存()-如何获得正确的LpBaseAdvor?,c++,winapi,C++,Winapi,我正在为多人游戏制作一个非官方补丁。游戏默认只支持6个屏幕分辨率,但我找到了一种方法,用十六进制编辑器编辑EXE文件来替换它们。我的C++启动程序将启动4个.exe文件中的一个,其中16x9,第二个,4x3,第三个16:10,等等。不幸的是,游戏会生成校验和,如果玩家使用不同的.EXE文件,则不允许玩家加入。所以我必须替换RAM中生成的校验和。我成功地进行了线切割,并找到了需要更改的内容,例如十六进制:dabfe599 我使用以下代码: HWND hWnd; DWORD dwID; HANDLE

我正在为多人游戏制作一个非官方补丁。游戏默认只支持6个屏幕分辨率,但我找到了一种方法,用十六进制编辑器编辑EXE文件来替换它们。我的C++启动程序将启动4个.exe文件中的一个,其中16x9,第二个,4x3,第三个16:10,等等。不幸的是,游戏会生成校验和,如果玩家使用不同的.EXE文件,则不允许玩家加入。所以我必须替换RAM中生成的校验和。我成功地进行了线切割,并找到了需要更改的内容,例如十六进制:dabfe599

我使用以下代码:

HWND hWnd;
DWORD dwID;
HANDLE hProcess;
hWnd = FindWindow(NULL, "GameName");
GetWindowThreadProcessId(hWnd, &dwID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, dwID);
int value = 0000;
WriteProcessMemory(hProcess, (LPVOID)0x0517A69A,
    (LPVOID)&value, sizeof(&value), NULL);
WriteProcessMemory(hProcess, (LPVOID)0x0584B078,
    (LPVOID)&value, sizeof(&value), NULL);
它是有效的。不幸的是:每次我开始游戏时,LPVOID0x0517A69A和LPVOID0x0584B078都是不同的。因此,我希望通过在hProcess中搜索指定的十六进制dabfe599来获得LPVOID。有人知道我该怎么做吗?

传递给WriteProcessMemory的地址与要写入的进程的基址有关。如果每次运行游戏时校验和的地址都发生变化,则表示校验和在堆内存中被动态分配。因此,写入校验和的唯一方法是:

如果校验和是更大结构或类的一部分,则查找指向校验和内存或指向校验和父级的游戏指针变量,读取该指针的值,然后根据需要传递该指针,可能会将其偏移以写入进程内存。希望该指针位于一个可预测的位置,否则您可能必须从一个已知的起始位置开始跟踪整个指针链

假设校验和始终为0xdabfe599,并且0xdabfe599不会出现在游戏内存中的任何其他位置,则可以使用循环中的ReadProcessMemory从头到尾扫描进程的整个内存或至少其数据段,直到找到0xdabfe599,然后你就会知道你读到的地址,这样你就可以写信给它了


使用ReadProcessMemory查找所需地址怎么样?顺便说一句,它应该是SizeOfValues如果游戏使用一些简单的校验和,比如xor,你可以在程序中搜索你不太关心的东西,比如文本字符串,然后修改它们,这样crc就会再次匹配。例如,如果将偏移量0xf100处的字节从原始值0更改为新值1,并且crc仅更改一位,则可以尝试将偏移量0xf200处的字节从x更改为x xor原始值0 xor新值1。谢谢您的回答。Werner,我试图在.exe文件中禁用/change/fake checkum,但它太复杂了,而且似乎更容易通过WriteProcessMemory进行修改。Alex,你能给我举个例子,如何通过ReadProcessMemory找到所需的地址吗?这要看情况而定。这些地址是什么?它们是加载的PE模块中的地址吗?或者它们在进程堆上?如果您熟悉游戏黑客,您可以使用与无限弹药/生命黑客相同的技术,通过使用访问校验和的程序中的原始指令代码,将校验和更改为您想要的任何值。只需将原始指令重定向到代码库并在那里进行修改。