我为多人游戏做了一个非正式的补丁。默认情况下,游戏仅支持6种屏幕分辨率,但我找到了一种通过使用HEX编辑器编辑EXE文件来替换它们的方法。我的C ++启动程序将启动4个.EXE文件中的一个(一个是16x9,第二个是4x3,第三个是16:10等)。不幸的是,游戏会产生校验和,如果他们使用不同的.EXE文件,则不允许玩家互相加入。所以我必须替换RAM中生成的校验和。我成功地线路化并找到了我必须改变的东西,例如它的HEX: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);
它有效。不幸的是:(LPVOID)0x0517A69A和(LPVOID)0x0584B078每次开始游戏都不同。所以我想通过在hProcess中搜索指定的HEX(dabfe599)来获取LPVOID。有谁知道我该怎么做?
答案 0 :(得分:2)
传递给WriteProcessMemory()
的地址相对于正在写入的进程的基址。如果每次运行游戏时校验和的地址都会更改,则表示校验和正在堆内存中动态分配。因此,您要写入校验和的唯一方法是:
找到指向校验和内存的游戏指针变量(如果校验和是较大struct
或class
的一部分,则指向校验和的父项),读取值该指针,然后将其传递(可能根据需要将其偏移)到WriteProcessMemory()
。希望指针位于可预测的位置,否则您可能必须遵循从已知起始位置开始的整个指针链。
假设校验和总是 0xdabfe599
,并且0xdabfe599
没有出现在游戏内存中的任何其他位置,那么您可以扫描整个进程的整个内存(或者至少它的数据段)从头到尾使用ReadProcessMemory()
在循环中找到0xdabfe599
,然后你会知道你读取的地址,然后你可以写入它。