植物大战僵尸中文版C语言实现阳光修改最简洁源代码
#include <windows.h>
#include <stdio.h>
void SunMaximize()
{
HWND gameWindow = FindWindow(NULL , "植物大战僵尸中文版");//获得窗口句柄,窗口句柄就是
if(gameWindow == NULL)
MessageBox(NULL , "游戏程序未运行!" , "提示" , MB_OK|MB_ICONERROR);
else
MessageBox(NULL, "游戏运行中\n点击确定修改阳光!", "提示", MB_OK|MB_ICONINFORMATION);//是否获得窗口句柄判断程序是否运行
DWORD pid;//定义进程id ,DWORD无符号整形
GetWindowThreadProcessId(gameWindow , &pid);//由窗口句柄获得进程id,并写入到 &pid
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS , 0 , pid);/*获取写内存权限 由进程id获得进程句柄并写入hProcess
hProcess为无类型指针=void * = PVOID */
int sun;//定义本地阳光整形变量
int max_sun = 9990;/*定义阳光最大值常量const实际上保证的,并不是变量的值不得改动,
而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,
const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,
就完全不能控制了。因此,将一个对象声明为常量必须非常小心。(重点) */
DWORD pObj = 0; // 有的时候偏移要用,但是这次直接是固定基地址所以不用管
printf("pobj: %0X \n", pObj);
//打印
ReadProcessMemory(hProcess, (LPCVOID)(pObj+0x6a9ec0), &pObj, 4, 0);//取静态基地址值写入pObj
printf("pobj: %0X \n", pObj);//打印
ReadProcessMemory(hProcess, (LPCVOID)(pObj+0x768), &pObj, 4, 0);//偏移后取值写入pObj
printf("pobj: %0X \n", pObj);//打印
DWORD pSun = pObj+0x5560;//偏移得到动态地址 并赋值给pSun
printf("动态地址 psun = %0X \n", pSun);//打印
ReadProcessMemory(hProcess, (LPCVOID)(pSun), &sun, 4, 0);//由动态地址读取阳光值,写入sun变量
printf("当前阳光 sun: %d \n", sun);//打印
WriteProcessMemory(hProcess, (LPCVOID)(pSun), &max_sun, 4 ,0);//将极限阳光写入pSun
if(CloseHandle(hProcess));//对此进程不再感兴趣 ,但进程任在继续运行
MessageBox(NULL , "CloseHandle" , "提示" , MB_OK|MB_ICONINFORMATION);
}
int main(void)
{
SunMaximize();//调用SunMaximize函数
return 0;
}
浙公网安备 33010602011771号