C++写的植物大战僵尸辅助外挂

码农公社  210.net.cn   210= 1024  10月24日一个重要的节日--码农(程序员)节

娃一直迷恋植物大战僵尸这款游戏,从一开始的水平不行,到后来经常看植物大战僵尸的过关视频来提升自己的游戏水平,现在植物大战僵尸玩的越来越好了。后来为了能让娃学到些东西,拿出 CE 教娃改阳光,娃不但学会了改阳光,还能自己修改金币玩的更 High 了。为了娃能进一步的学习知识,为娃写了一个简单的修改阳光和种植植物后免冷却时间的辅助工具。

 

修改阳光

        阳光可以通过 CE 逐步的查找基址,首先通过 ReadProcessMemory 函数将 CE 获取到的阳光地址找到,然后通过 WriteProcessMemory 函数将修改的阳光值写入即可。

#define SUN_VALUE_ADDRESS   0x007794f8  // 阳光基址


// 通过窗口名查找句柄

HWND hGameWnd = NULL;

hGameWnd = FindWindow(NULL, _T("Plants vs. Zombies GOTY "))->GetSafeHwnd();


// 根据窗口句柄获得进程ID

DWORD dwPid = 0;

DWORD dwTid = 0;

dwTid = GetWindowThreadProcessId(hGameWnd, &dwPid);


// 打开进程

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);


DWORD dwSunValue = 0;

DWORD dwAddr = 0;

DWORD dwReadWriteByte = 0;


// 计算阳光地址

// [[[0x007794f8]+0x868]+0x5578]

ReadProcessMemory(hProcess, (LPCVOID)SUN_VALUE_ADDRESS, &dwAddr, sizeof(DWORD), &dwReadWriteByte);

dwAddr = dwAddr + 0x868;

ReadProcessMemory(hProcess, (LPCVOID)dwAddr, &dwAddr, sizeof(DWORD), &dwReadWriteByte);

dwAddr = dwAddr + 0x5578;


// 读取当前阳光

ReadProcessMemory(hProcess, (LPCVOID)dwAddr, &dwSunValue, sizeof(DWORD), &dwReadWriteByte);


// 获取修改的阳光值

dwSunValue = GetDlgItemInt(IDC_EDIT1);

WriteProcessMemory(hProcess, (LPVOID)dwAddr, &dwSunValue, sizeof(DWORD), &dwReadWriteByte);


// 关闭进程

CloseHandle(hProcess);


种植植物免冷却时间
        种植植物免冷却的功能,可以通过 CE 找到格子所在的内存,然后找到修改该格子状态的代码,最后将该段代码用 NOP 指令替换掉即可。

#define CD_PATCH_ADDRESS    0x004b4ca1  // 种植植物免冷却


// 通过窗口名查找句柄

HWND hGameWnd = NULL;

hGameWnd = FindWindow(NULL, _T("Plants vs. Zombies GOTY "))->GetSafeHwnd();


// 根据窗口句柄获得进程ID

DWORD dwPid = 0;

DWORD dwTid = 0;

dwTid = GetWindowThreadProcessId(hGameWnd, &dwPid);


// 打开进程

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);


DWORD dwOldByte = 0;

DWORD dwReadWriteByte = 0;


// 读取免冷却代码

ReadProcessMemory(hProcess, (LPCVOID)CD_PATCH_ADDRESS, &dwOldByte, sizeof(DWORD), &dwReadWriteByte);


// PATCH免冷却

DWORD dwPatchByte = 0x90909090;

WriteProcessMemory(hProcess, (LPVOID)CD_PATCH_ADDRESS, &dwPatchByte, sizeof(DWORD), &dwReadWriteByte);


// 关闭进程

CloseHandle(hProcess);


 

评论