首页
论坛
课程
招聘
[原创]植物大战僵尸实现一些实用的功能
2021-10-9 14:40 5269

[原创]植物大战僵尸实现一些实用的功能

2021-10-9 14:40
5269

植物大战僵尸初探

1.0 修改阳光值,寻找阳光基址

在不断偏移定位到基址

 

运行游戏,使用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.1 自动拾取阳光

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.2 种植物不用阳光

通过种植物减少阳光的值,进行定位

 

通过1.0的知识,修改阳光值为10000,可以种植物不受限制,种植物,多次终止,定位阳光数据。

 

 

F6 后继续游戏,种植植物。

 

出现

 

 

 

OD附加游戏观察41BA76附近函数

 

 

逻辑:esi存储阳光的值,cmp 判断扣出的阳光值够不够买植物,如果够买,就 sub减掉阳光

 

nop掉sub指令实现种植物不需要阳光

 

1.3 一击必杀普通僵尸

击打僵尸,找到僵尸血量发生变化的地方,搜索采用范围搜索,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.4一击必杀不普通僵尸

根据网络上公布的数据看

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,在该函数的头部下断点,运行游戏,要攻击到僵尸的时候断下。

 

 

返回到调用处,发现上方的可疑跳转,直接跳过僵尸血量扣除代码,

 

在这里插入图片描述

1
2
3
test    eax,eax
jle        某地址
含义是:如果`eax <= 0`,就跳到`某地址`,否则继续往下执行

运行游戏,发现路障僵尸没有被一击必杀,只有当路障彻底损坏之后,变成普通僵尸才被一击击杀,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处的跳转即可。

1.5实现植物无冷却

我们可以猜测出植物的冷却时间也是存在一个累加器不断累加,达到上限后归零实现的。

 

先首次搜索未知数据,把植物种下,不断搜索改变的数据(植物有冷却到亮的一瞬间也是变换的)

 

冷却结束后不断搜索不改变的量 ,发现0值

多次测试发现特征码 为 0 和1。 0:冷却结束 1 : 在冷却中

所以还有一种方法 直接搜 0 1 特征码去找

 

在这里插入图片描述

 

发现植物种下的时候,由0不断增加到700多的过程中是冷却状态,冷却结束变为0

 

看地址 0048728c 处

 

在这里插入图片描述

 

有两种情况改写这个地址,拿起或者放下植物,种下植物。

 

1.减少冷却时间可以把01变大

 

 

冷却的逻辑;

 

反汇编:

0 判断是否冷却

1 如果不是跳转到4

2 已冷却时间增加

3 跳转到0

4 设置冷却结束

 

 

对比逻辑,相似,直接将减少冷却时间上面的一条 JE SHORT PlansVs.004872AC ,把这个条件反过来,即把je改为jne。达到 如果处在冷却中就结束冷却的结果。

 

接下来尝试编程写这个游戏的辅助。。实现上述的功能


[公告] 欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回