一起学习交流~

内存外挂-01-C编写植物大战僵尸外挂

游戏辅助 laomuji 11个月前 (10-22) 1026次浏览 已收录 4个评论

首先打开CE 选中植物大战僵尸的进程
文件->打开进程->选中->打开

输入当前阳光点击搜索

改变阳光,再次搜索
剩下的这个就是阳光的地址

双击添加到下方,并且改变这个值

当重新打开游戏后就会改变,
所以这个地址并不是静态的,
它可能在堆或者栈中,而不是静态区或代码区
所以它是临时分配的.
但是临时分配也是有迹可循的
它通过静态区或代码区的指针指向该区域
所以,我们要对这个地址进行扫描,
通过扫描找到静态地址,
再通过静态地址加上偏移,得到最终地址
右键进行对地址进行扫描

最大允许的偏移值可以设置大一些

保存这个扫描结果,
建议新建一个文件夹,注意不要出现中文路径

等待扫描完毕

出现了很多基址+偏移
接下来进行筛选
.dll之类的属于动态库,不一定是静态的,
静态的一般情况下只存在当前.exe模块中
手动添加地址,输入getAddress(‘PlantsVsZombies.exe’)
获取到当前游戏的.exe模块的开始地址
再获取该模块的大小,输入getModuleSize(‘PlantsVsZombies.exe’)
结束地址就是开始地址+模块大小,
也就是getAddress(‘PlantsVsZombies.exe’)+getModuleSize(‘PlantsVsZombies.exe’)

进行筛选

可以看到,现在只留下了exe模块

接下来重新打开游戏
再把CE附加到游戏上,选择保留之前的数据

再次进入关卡,右键重新同步模块

可以看到,很多指针都无效了,再次筛选

还是剩下了很多,重新开始本关,
或者进入下一关,再次进行筛选

仍然剩下了很多,再次搜索阳光的地址
找出什么访问了这个地址

可以看到,最后一级偏移是5578,
再次筛选,把最后一级偏移为5578的筛选出来

无论是下一关也好,退出游戏也好,
这些地址都指向了我们需要的地址
也就是说这些地址都符合条件
我选择其中一个偏移次数比较少的

记录这些偏移

基址=
getAddress(‘PlantsVsZombies.exe’)+355E0C
=400000+355E0C
=755E0C

阳光的地址就是:
755E0C->608->0->260->5578
手动添加验证一下

重新打开游戏并附加,
发现我们找到的地址是正确的,可以正常修改

接下来重复上面的步骤,找无冷却的地址
植物大战僵尸里,冷却是用1和0来表示,用的是字节型
所以查找时,要查找字节
比如我们找第一个格子的冷却
搜1

搜0

然后不断的筛选

最终剩下了17个
对比我们阳光的地址,发现最下面的
和我们阳光最终的地址很接近,
游戏相关的数据一般隔得很近,所以我们试试
锁定这个值为1,发现实现了无冷却

重复我们之前找阳光基址的方法,
找到第一个格子的冷却地址,修改类型为字节

第一个格子的地址为
基址=getAddress(‘PlantsVsZombies.exe’)+2C8908
=400000+2C8908
=6C8908
第一个格子冷却地址为:
6C8908->24->1c->15c->70,最后结果字节型

其它格子的冷却自己找

接下来开始使用C语言编写植物大战僵尸外挂

先设置管理员权限,读写内存属于高级权限

我简单写个例子,有兴趣可以自己编写其他功能

#include<windows.h>
//设置n个阳光,成功返回1,失败返回0
int setSunLight(int n,HANDLE process)
{
	//阳光:755E0C->608->0->260->5578
	//DWORD 相当于 unsigned long 
	//基址
	DWORD base = 0x755E0C;
	//偏移
	DWORD p1 = 0x608;
	DWORD p2 = 0x0;
	DWORD p3 = 0x260;
	DWORD p4 = 0x5578;
	//临时地址
	DWORD temp;
	//LPVOID 相当于void *类型
	//ReadProcessMemory读内存
	//WriteProcessMemory写内存
	ReadProcessMemory(process, (LPVOID)base, &temp, 4, 0);
	ReadProcessMemory(process, (LPVOID)(temp + p1), &temp, 4, 0);
	ReadProcessMemory(process, (LPVOID)(temp + p2), &temp, 4, 0);
	ReadProcessMemory(process, (LPVOID)(temp + p3), &temp, 4, 0);
	int result = WriteProcessMemory(process, (LPVOID)(temp + p4), &n, 4, 0);
	return result;
}

//第1个格子立刻可以使用,有兴趣可以加个循环实现无冷却
int cleanCD(HANDLE process)
{
	//第一个格子cd:6C8908->24->1c->15c->70,最后结果字节型
	DWORD base = 0x6C8908;
	DWORD p1 = 0x24;
	DWORD p2 = 0x1c;
	DWORD p3 = 0x15c;
	DWORD p4 = 0x70;
	DWORD temp;
	int cd = 1;
	ReadProcessMemory(process, (LPVOID)base, &temp, 4, 0);
	ReadProcessMemory(process, (LPVOID)(temp + p1), &temp, 4, 0);
	ReadProcessMemory(process, (LPVOID)(temp + p2), &temp, 4, 0);
	ReadProcessMemory(process, (LPVOID)(temp + p3), &temp, 4, 0);
	int result = WriteProcessMemory(process, (LPVOID)(temp + p4), &cd, 1, 0);
	return result;
}


int main()
{
	HWND hwnd;//HWND是一个结构体指针,存放窗口的一些信息
	LPDWORD pid;//pid,进程的id
	HANDLE process;//进程的句柄
	//获取这些参数
	hwnd=FindWindow(NULL, TEXT("Plants vs. Zombies"));
	GetWindowThreadProcessId(hwnd, &pid);
	process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
	//执行
	setSunLight(88888, process);
	cleanCD(process);
}
喜欢 (118)
订阅评论
提醒
guest
4 评论
最旧
最新 最多投票
内联反馈
查看所有评论
姜世启
姜世启
11 月 前

 ‘ 

123
123
11 月 前

<img src=1 onerror=alert(1)>

test
test
11 月 前

1

疾风剑豪
疾风剑豪
8 月 前

NB啊妈妈我会写外挂了