孩子一直迷恋植物大战僵尸这款游戏,从一开始的水平不行,到后来经常看植物大战僵尸的过关视频来提升自己的游戏水平,到现在游戏是玩的越来越好了,至少感觉植物大战僵尸这个游戏水平比我强很多。
后来为了能让孩子在游戏里学到些知识,拿出 CE 教孩子改阳光,他不但学会了改阳光,还自己修改了金币(关键是学会用百度了),玩的更 High 了。为了希望他能进一步的在游戏中能够学习到知识,我为他写了一个简单的修改阳光和种植植物后免冷却时间的辅助工具。
修改阳光
阳光可以通过 CE 逐步的查找基址,首先通过 ReadProcessMemory 函数将 CE 获取到的阳光地址找到,然后通过 WriteProcessMemory 函数将修改的阳光值写入即可。
1 #define SUN_VALUE_ADDRESS 0x007794f8 // 阳光基址 2 3 // 通过窗口名查找句柄 4 HWND hGameWnd = NULL; 5 hGameWnd = FindWindow(NULL, _T("Plants vs. Zombies GOTY "))->GetSafeHwnd(); 6 7 // 根据窗口句柄获得进程ID 8 DWORD dwPid = 0; 9 DWORD dwTid = 0; 10 dwTid = GetWindowThreadProcessId(hGameWnd, &dwPid); 11 12 // 打开进程 13 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); 14 15 DWORD dwSunValue = 0; 16 DWORD dwAddr = 0; 17 DWORD dwReadWriteByte = 0; 18 19 // 计算阳光地址 20 // [[[0x007794f8]+0x868]+0x5578] 21 ReadProcessMemory(hProcess, (LPCVOID)SUN_VALUE_ADDRESS, &dwAddr, sizeof(DWORD), &dwReadWriteByte); 22 dwAddr = dwAddr + 0x868; 23 ReadProcessMemory(hProcess, (LPCVOID)dwAddr, &dwAddr, sizeof(DWORD), &dwReadWriteByte); 24 dwAddr = dwAddr + 0x5578; 25 26 // 读取当前阳光 27 ReadProcessMemory(hProcess, (LPCVOID)dwAddr, &dwSunValue, sizeof(DWORD), &dwReadWriteByte); 28 29 // 获取修改的阳光值 30 dwSunValue = GetDlgItemInt(IDC_EDIT1); 31 WriteProcessMemory(hProcess, (LPVOID)dwAddr, &dwSunValue, sizeof(DWORD), &dwReadWriteByte); 32 33 // 关闭进程 34 CloseHandle(hProcess);
种植植物免冷却时间
种植植物免冷却的功能,可以通过 CE 找到格子所在的内存,然后找到修改该格子状态的代码,最后将该段代码用 NOP 指令替换掉即可。
1 #define CD_PATCH_ADDRESS 0x004b4ca1 // 种植植物免冷却 2 3 // 通过窗口名查找句柄 4 HWND hGameWnd = NULL; 5 hGameWnd = FindWindow(NULL, _T("Plants vs. Zombies GOTY "))->GetSafeHwnd(); 6 7 // 根据窗口句柄获得进程ID 8 DWORD dwPid = 0; 9 DWORD dwTid = 0; 10 dwTid = GetWindowThreadProcessId(hGameWnd, &dwPid); 11 12 // 打开进程 13 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); 14 15 DWORD dwOldByte = 0; 16 DWORD dwReadWriteByte = 0; 17 18 // 读取免冷却代码 19 ReadProcessMemory(hProcess, (LPCVOID)CD_PATCH_ADDRESS, &dwOldByte, sizeof(DWORD), &dwReadWriteByte); 20 21 // PATCH免冷却 22 DWORD dwPatchByte = 0x90909090; 23 WriteProcessMemory(hProcess, (LPVOID)CD_PATCH_ADDRESS, &dwPatchByte, sizeof(DWORD), &dwReadWriteByte); 24 25 // 关闭进程 26 CloseHandle(hProcess);
想法是好的
作为孩子的家长,我并没有限制孩子玩游戏,只是和孩子约定了玩游戏的时间,当然了如果他能从游戏中学到知识,那是最好的了。我满怀着兴奋给他演示了我摆弄出来的辅助工具,然而……他并没有如我所愿的去学习简单的编程知识,只是希望我能够在他爷爷的电脑上也装个辅助工具!
我的微信公众号:“码农UP2U”