孩子一直迷戀植物大戰僵屍這款游戲,從一開始的水平不行,到後來經常看植物大戰僵屍的過關視頻來提升自己的游戲水平,到現在游戲是玩的越來越好了,至少感覺植物大戰僵屍這個游戲水平比我強很多。 後來為了能讓孩子在游戲里學到些知識,拿出 CE 教孩子改陽光,他不但學會了改陽光,還自己修改了金幣(關鍵是學會用百度 ...
孩子一直迷戀植物大戰僵屍這款游戲,從一開始的水平不行,到後來經常看植物大戰僵屍的過關視頻來提升自己的游戲水平,到現在游戲是玩的越來越好了,至少感覺植物大戰僵屍這個游戲水平比我強很多。
後來為了能讓孩子在游戲里學到些知識,拿出 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”