-
-
[原创]植物大战僵尸实现一些实用的功能
-
发表于: 2021-10-9 14:40 10012
-
在不断偏移定位到基址
运行游戏,使用CE(Cheat Engine)加载游戏,想要修改阳光,可以通过人为的多次变化阳光的值,定位到动态地址。
1.初始阳光 50 ,精准搜索阳光值50
改变阳关的值,再次搜索,发现定位到数据,
验证一下数据的是否决定阳光的值,双击value值修改
阳光值立刻跟着改变,说明找对了位置。
找的这个数据是动态地址。
动态地址:临时用于存放数据的地址,黑色。特征:重新启动游戏地址发生变化
静态地址:永久用于存放数据的地址,绿色。特征:重新启动游戏地址不变
做游戏辅助的时候找的是静态地址。要通过动态地址找静态地址。怎么找呢?我们先来了解一下偏移这个概念,在外挂这里叫偏移,在编程的时候其实就是指针,我们就是通过一层一层挖指针来找静态地址。
方法一:右键 或者F5 阳光地址里的值是会改变的,看一下什么地方访问了这个地址
重点关注mox指令 ,赋值指令 很关键,
双击mov。。。 指令跟进:
5560 是偏移,记住ESI=1EFDE7E8,搜索1EFDE7E8,选择上HEX
发现很多地址,19开头的地址是堆栈的地址,不用管。
发现此处改变的esi的值,第二层偏移为768
跟进 发现EDI=0287A778
搜索EDI
发现了绿色的地址:静态地址,找到目标,
静态地址 + 偏移1 + 偏移2 + 。。。 = 动态地址
随便选择一个地址。
这里选择第一个地址:006A9EC0.手动添加
重新运行游戏,ce加载,
这个地址指向的还是阳光
方法二:
获得阳光动态地址,方法跟上面相同。
右键,点击是谁改写了这个地址
等下下一个阳光掉落,弹出
记下00430a11地址
搜索EAX=1D603468,剩下步骤跟方法一相同,选择F5
esi=028AA778
搜索地址,添加,与方法一相同
1.0的内容只能说是熟悉CE操作,寻找数据,1.1尝试自动拾取阳光,使用1.0记下的地址
玩家操作时,点击阳光,阳光被拾取,阳光数值增加。
初步观察,最少有两个函数:阳光出来的函数,判断是否点击阳光然后增加阳光的函数
(在程序中,很多关键功能都是通过一个call来实现的)
od附加游戏
搜索430A11地址,下断点,回到游戏,阳光下落,点击收集阳光,断点断下
ecx 19 十进制25 一个阳光的数值
ctrl+F9 执行到返回
定位阳光call
可以把函数nop掉试验这是不是真的增加阳光的call
函数面有个jnz跳转
经过试验,这个是判断阳光是否到位,当阳光完全在左上角才会真正执行增加阳光的call,这层代码量很少。点击阳光的代码再上一层或者更上一层,继续执行到返回看看。
只有当43158f处的jnz执行成功,增加阳光的call才能调用,43158f处下断点,发现阳光下落断下。
在函数增加的函数下断,发现点击阳光,断下。
jnz判断是否点击阳光,点击增加阳光,不点击则阳光继续下落,
逻辑就是,if else 逻辑,被点击调用增加阳光函数,没有点击,执行下落动画。
修改
改为jmp 阳光出现就自动增加
(右键 ,复制到可执行文件,所有修改,全部复制,保存文件)
通过种植物减少阳光的值,进行定位
通过1.0的知识,修改阳光值为10000,可以种植物不受限制,种植物,多次终止,定位阳光数据。
F6 后继续游戏,种植植物。
出现
OD附加游戏观察41BA76附近函数
逻辑:esi存储阳光的值,cmp 判断扣出的阳光值够不够买植物,如果够买,就 sub减掉阳光
nop掉sub指令实现种植物不需要阳光
击打僵尸,找到僵尸血量发生变化的地方,搜索采用范围搜索,0-400之间搜索,没打到搜不变,打到搜减少,多次搜索定位。
这里不断搜索减少,
当打中僵尸时,减20血量,确定数据
多次测试发现 ,僵尸血量不止一个数据, 所以只要随便根据一个血量 找到减少血量的call,(调用的减少血量的函数是一个 )并且减少血量的逻辑根据不同的僵尸也不太相同。
老套路 F6: find out what writes to this address
od附加游戏,看看附近的代码。。
下断点,运行,要达到僵尸的时候断下来
看下方寄存器信息:edi是僵尸血量,堆栈 SS:[0019F930]=00000014对应 豌豆的攻击力。
531319处 如果直接修改僵尸血量为0,游戏崩掉,搜索一片000000区域,
简单hook53130F处代码
找到006510cd处
修改531319处指令为
006510cd处指令
此时就可以一击必杀普通僵尸了
所有的普通僵尸都要经过此处的指令处理,所以可以击杀所有普通僵尸,特殊的僵尸有特殊的处理,这个对特殊僵尸不起作用
方法二:还可以把减少EDI的指令改成XOR EDI,EDI即可,也是将血量清0,
经过测试,也实现了普通僵尸的一击必杀
根据网络上公布的数据看
1、普通僵尸(ZOMBIE):200+70
2、摇旗僵尸(FLAG ZOMBIE):200+70
3、路障僵尸(CONEHEAD ZOMBIE):370(防具)+200+70
4、撑杆僵尸(POLE VAULTING ZOMBIE):333+167
5、铁桶僵尸(BUCKET ZOMBIE):1100+200+70
6、读报僵尸(NEWSPAPER ZOMBIE):150+200+70
7、铁栅门僵尸(SCREEN DOOR ZOMBIE):1100+200+70
8、橄榄球僵尸(FOOTBALL ZOMBIE):1400+200+70
9、舞王僵尸(DANCING ZOMBIE):333+167
10、伴舞僵尸(BACKUP DANCER):200+70
11、鸭子救生圈僵尸(DUCKY TUBE ZOMBIE):200+70
防具和僵尸的扣血call 不是一个,不同的代码处理,在1.3的基础上完成这次的破解,1.3适用于僵尸血量组成为xx+200+70类型的。
先搜索0-800之间 ,种植物不断攻击路障僵尸,攻击僵尸后搜索减少的数据,多重复几次,找到好的时机定位数据, 效率加倍。记得控制变量(比如找出现一个路障僵尸的时候),或者直接搜索370,这是路障僵尸防具的血量
右键 ,F6(找出是什么改写了这个地址),继续让植物攻击僵尸。
这是路障僵尸防具的扣血量代码。
此时已经得到普通僵尸扣除血量代码地址:531319
路障僵尸防具血量扣除代码地址:53104D
为了缕清楚僵尸扣除血量的一个逻辑,搜索普通僵尸扣除血量代码地址531319,在该函数的头部下断点,运行游戏,要攻击到僵尸的时候断下。
返回到调用处,发现上方的可疑跳转,直接跳过僵尸血量扣除代码,
运行游戏,发现路障僵尸没有被一击必杀,只有当路障彻底损坏之后,变成普通僵尸才被一击击杀,531872处是普通僵尸扣除血量call,那么这个test jle的组合逻辑就是,判断防具血量。防具血量没有后在扣除僵尸血量()。
将JLE跳转指令nop掉,观察结果:
路障僵尸被一击必杀,看来僵尸本身血量比防具血量更重要,
观察这个跳转上方的代码,既然逻辑是if else逻辑。那么扣除防具血量的代码也在附近,下断00531866 处的call,运行游戏,在打到路障僵尸前断下,跟进,发现路障僵尸防具血量扣除代码地址:53104D在函数内部。00531866处的call是扣除防具血量的call。
判断防具血量是否为0,为0则直接扣除僵尸血量。
整体逻辑:
if(防具有血量)
{
扣防具的血量;
}
else
{
扣僵尸的血量;
}
判断防具血量上面的test jle组合 直接跳过防具和僵尸的血量扣出call,直接将此处nop掉。
经过测试,如果此处不nop掉,路障僵尸可以秒杀,但是铁栅栏僵尸不可以秒杀。那么test jle组合判断的就是是否扣除铁栅栏僵尸的血量,上面的call就是扣除特栅栏防具的血量,可以使用CE进一步判断,想要秒杀特栅栏僵尸,nop掉531858处的跳转即可。
我们可以猜测出植物的冷却时间也是存在一个累加器不断累加,达到上限后归零实现的。
先首次搜索未知数据,把植物种下,不断搜索改变的数据(植物有冷却到亮的一瞬间也是变换的)
冷却结束后不断搜索不改变的量 ,发现0值
多次测试发现特征码 为 0 和1。 0:冷却结束 1 : 在冷却中
所以还有一种方法 直接搜 0 1 特征码去找
发现植物种下的时候,由0不断增加到700多的过程中是冷却状态,冷却结束变为0
看地址 0048728c 处
有两种情况改写这个地址,拿起或者放下植物,种下植物。
1.减少冷却时间可以把01变大
赞赏
- [原创]CVE-2017-11882分析和白象样本分析 8258
- 银狐样本分析 12921
- [原创]CS[1]exe木马分析 7751
- [原创]内核漏洞学习[6]-HEVD-UninitializedStackVariable 27928
- [原创]植物大战僵尸外挂实现 13096