前提是需要用CE来获取阳光的地址,注意第一版的地址是动态地址,下次游戏重启后,地址就会变掉。
#include <iostream>
#include <windows.h>
using namespace std;
HWND hwnd_Game;
DWORD ProcessID;
HANDLE h_process;
/*
** 思路:先获取游戏信息,再进行修改。
** 1、根据游戏窗口名称获取窗口句柄
** 2、根据上一步获取的窗口句柄获得进程ID
** 3、通过上一步获取的进程ID来获取进程句柄(修改进程里面的内存值需要用到进程句柄)
*/
void GetGameInfo()
{
hwnd_Game = FindWindow(NULL, L"Plants vs. Zombies");
GetWindowThreadProcessId(hwnd_Game, &ProcessID);
/*
HANDLE
WINAPI
OpenProcess(
_In_ DWORD dwDesiredAccess, 希望获得这个进程的什么权限,这里我们填默认的PROCESS_ALL_ACCESS就好了
_In_ BOOL bInheritHandle, 是否允许该进程句柄继承,这里我们默认填false
_In_ DWORD dwProcessId 进程ID
);
*/
h_process = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
}
void ChangeSunshine(int num)
{
/* WriteProcessMemory函数原型
BOOL
WINAPI
WriteProcessMemory(
_In_ HANDLE hProcess, 进程句柄
_In_ LPVOID lpBaseAddress, 改写的地址
_In_reads_bytes_(nSize) LPCVOID lpBuffer, 改写的值的缓冲区
_In_ SIZE_T nSize, 缓冲区的大小
_Out_opt_ SIZE_T* lpNumberOfBytesWritten 实际写入的长度(传出参数)
);
*/
int ret = WriteProcessMemory(h_process, (LPVOID)0x2AF58580, &num, 4, NULL);
if (ret == 0)
{
cout << "修改失败!" << endl;
}
else
{
cout << "修改成功!" << endl;
}
}
int main1()
{
int n_sunshine_change;
cout << "欢迎使用植物大战僵尸外挂,请输入你要修改的阳光值:";
cin >> n_sunshine_change;
GetGameInfo();
ChangeSunshine(n_sunshine_change);
system("pause");
return 0;
}
参考:https://blog.csdn.net/xiaokangdream/article/details/79356030
网友评论