植物大战僵尸中文版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;
}

posted @ 2022-05-27 22:20  二次元花木兰  阅读(1751)  评论(8)    收藏  举报