3.2.1针对阳光值
第一种
可以通过精确数值的扫描来进行太阳值的内存地址的扫描,首先一开始的阳光初始值为50,那么在首次扫描的数值中要填入50。结果如下图所示。
然后通过种植植物来减少阳光值,然后阳光值为0,再次进行数值为0的扫描,结果如下图所示。
通过双击使其地址到达下面的列表当中,然后双击数值来改变太阳值的大小,结果如下图所示。
第二种
可以进行未知的初始值的扫描,来进行首次扫描。结果如下如所示。
然后通过太阳值的增加或者减少,或者不变来选择扫描的类型,分别为增加的数值,减少的数值,不变的数值,直到扫描出太阳值所对应的内存地址。结果如下图所示。
然后将上述地址双击,使其到达下面的列表当中,然后双击数值来更改太阳值。结果如下图所示。
第三种
和上述第二种的首次扫描相同,首先进行未知的初始值的扫描。结果如下图所示。
然后通过太阳值的增加量和减少量,分别对应数值增加了多少,还是数值减少了多少,多试几次,就可以得出太阳值的内存地址。结果如下图所示。
然后双击此地址让其出现在下面的列表中,然后进行数值的修改,结果如下图所示。
根据“0”代表植物未拿起,“1”代表植物拿起,找到植物存放的临时地址,发现有两条地址。根据查看什么访问了这个地址,判断哪一个是真正的地址。找到真正的地址,再继续查看是这个地址,找到指向这个地址的指针。
根据找多级指针的方法找到指针所在的基地址,也就是找到出现绿色的地址。
手动添加指针
各级指针最后指向的地址跟最开始地址存放的状态一样是表示找到正确的基址。
通过上述阳光基址的查找,我们可以分析阳光的数据是一个结构体。结构体中定义了阳光的数量是进程主模块首地址加偏移量。最后我们分析阳光数量的结构体公式为:
阳光数量=[15B816E8]
== [15B7C188+00005560]
==[[[PlantsVsZombies.exe+2A9EC0]+00000768]+00005560]
==[[[006A9EC0]+00000768]+00005560]
当我们捡起阳光时,阳光数值增加,我们可以看到执行下图中的两句指令;当我们消耗阳光时,阳光数值减少,如下图所示。
寻找阳光的产出速度
我们首先得知道阳光是从“向日葵”这种植物中生产出来的,在刚刚种下向日葵时,我们并不知道它开始的数值,因此我们需要首次扫描时进行未知的初始值,之后它的倒计时在没有产出阳光时时慢慢减少的,在产出阳光后,它的倒计时相对于之前来说是进行增加的。
之后要将其进行锁定要不然还会进行新一轮的倒计时,同时我们要将数值修改为0,让向日葵不断的进行生成阳光这一操作,结果如下图所示。
让天空中不断的落下阳光
分析:天空中落下阳光,也有相应的时间,我们可以通过,未知的初始值来进行首次扫描,接下来通过不断扫描减少的数值,当太阳落下时扫描增加的数值,来扫描天空落下阳光的倒计时,从而将倒计时的数值改为0,让天空中不断的落下阳光。
就可以找到天空落下阳光的倒计时,我们要将此锁定,并且同时将数值修改为1,让天空无限落下阳光,结果如下图所示。
首先我们得找到阳光的内存地址根据上面步骤得出,有很多种找到阳光值的内存地址的方法,任意选择一种就可以,结果如下图所示。
然后找到是什么修改了这个地址。右击找到是什么修改了这个地址然后进行阳光的收集,发现在新的窗口中出现了一行代码,结果如下图所示。
接下来会出现一行代码,进行停止,选择显示反汇编程序,在调试中设置断点,等待阳光的掉落,点击视图堆栈跟踪,有jne红线mov,将jne修改成jmp,(这样子修改恢复是很麻烦的),可以进行以下操作,点击工具中的自动汇编,模板中的CT表框架代码,接着点击模板代码注入,将这里的jne修改成jmp。点击文件分配到当前列表,点击运行,删除断点列表中的断电(视图中选择断点列表进行删除断点),就可以进行自动收集阳光,过程如下图所示。
之后进行游戏发现阳光可以被自动的收集。
3.2.2针对“植物”
1.打开游戏(此时游戏内有三个或三个以上的植物),在CE中选择“未知的初始值”,点击“首次扫描”。然后在游戏中点击某一植物,但不种下;随后在CE中选择“变动的数值”,点击“再次扫描”。
不对植物进行操作,选择“未变动的数值”,点击“再次扫描”,反复进行该项操作直到发现点击“豌豆射手”后,有的值变为0,点击“向日葵”,值变为1,点击“樱桃炸弹”,值变为2。将找到的两个地址其中之一添加到下方。
点击地址,右键选择“找出是什么访问了这个地址”,随机点击某一植物,出现指令,双击代码,显示详细信息,可以看到一级指针的偏移量为24。在CE中勾选16进制,输入167410A0新扫描。然后把新地址16709430添加到地址栏,在地址上右键选择“找出是什么访问了这个地址”。
查看详细信息,可以看到二级偏移量为138,再搜索167092F8得到026BA368,在地址026BA368上右键选择“查看是什么访问了这个地址”,双击查看详细信息,可以看到三级指针偏移量为768,再搜索02819EB8看到绿色的基址
最后添加指针,点击“手动添加地址”点击指针,点击三次“添加偏移”,输入基址和偏移后点击“确定”。这样就可以找到植物的内存基址。
3.2.3针对“金币”
扫描金币的内存地址。
分析:首先要进行未知的初始值的首次扫描,然后通过改变金币的数值来进行数值的增加和减少,来查找金币的内存地址。
找到金币的内存基址
分析金币功能实现的设计算法
通过上述金币基址的查找,我们可以分析金币的数据是一个结构体。结构体中定义了金币的数量是进程主模块首地址加偏移量。最后我们分析金币数量的结构体公式为:
金币数量=[05B13960]
==[[[0054C1EC]+0000082C]+00000028]
分析金币的相关汇编语言代码的工作过程
当我们捡起金币时,金币数相对应的增加,我们可以看到执行下图所示的两句指令。再当我们消耗金币时,金币值相对应的减少,我们同样可以看到下图所示的两句语句。
3.2.4针对“僵尸”
扫描三关中全部僵尸的内存地址
分析,我们进行猜想,僵尸到房子的距离是一个数值,随着僵尸距离房子越来越近,我们可以通过减小的数值来进行扫描
找到全部僵尸的内存基址,分析其全部属性。
分析僵尸功能实现的设计算法
设计一个僵尸类,僵尸有一个整形变量 type 代表僵尸的类型,0代表普通僵尸,1代表红帽僵尸,2代表铁桶僵尸,其次僵尸有一个整形变量 hp代表僵尸的血量,然后有一个布尔型标识表示僵尸是否可移动,僵尸在碰到植物的时候让僵尸停止移动即正在吃食物,僵尸与植物的碰撞检测可用矩形碰撞检测,java的 Rect对象有一个intersect方法用来判断两个矩形是否交合用于矩形碰撞检测。另外还有个是否被寒冰子弹击中布尔型属性,如果是被寒冰子弹击中移动速度减半,僵尸的移动就是x坐标减去一个速度值即可即向左边移动,依旧使用一个Vector容器来进行存储僵尸,如果僵尸血量为О就从该容器移除僵尸。
分析全部僵尸的相关汇编语言代码的工作过程
僵尸的相关汇编语言代码的工作过程如下图所示。
3.2.5针对关(级别)
扫描第1~3关的数据内存地址
(1)分析:我们随便进入一场游戏,可以首次扫描可以进行未知的扫描,来进行首次扫描,然后通关进行下一场游戏,通过不断的搜索增加的数值来进行再次扫描,同时游戏过程中可以进行未变动的扫描来进行扫描排除其他地址,结果如下图所示。
(2)我们不断的进行扫描来进行关卡的扫描,来找到关卡的地址,通关时发现数值的变化。结果如下图所示。
找到全部关卡的内存基址,分析其的全部属性
全部关的内存访问工作管理
1.普通关卡,主要是为了让用户熟悉新植物(不包括每5小关出现的mini游戏模式).每关的权值应该是给定的,逐关提高僵尸等级,提高权值.并且根据新卡片插入部分特殊僵尸。
2.迷你关卡,特殊设计.僵尸出现时间也是按一定的权值来计算,种类也是搭配关卡给定的,只不过关卡间没什么关联性.
3.无限模式,基本与普通模式相同,只不过过渡期设计比较长,后期权值提高到一定程度之后,就会出现铺天盖地的僵尸+巨人来填充了。僵尸方面,应该是将僵尸分类,然后每关出现某几种特殊僵尸。
3.2.6针对第三关的豌豆射手
扫描冷却时间的基址
分析:在植物还没有被种植的时候他的冷却时间是没有发生变化的,所以我们首先在种植植物的时候进行未知的初始值的扫描,种下植物之后其冷却时间是不断的变化的,所以之后的扫描选择的是变化的数值来进行扫描,在重复几次之后,我们发现还有很多,所以可以通过停止游戏来搜索未变化的数值来进行筛选,结果如下图所示。
通过上述的扫描我们发现了豌豆射手的冷却时间的内存地址为0A2CA034
查看豌豆射手的冷却时间的数值和内存基址
再通过上述地址的是谁修改了这个地址可以发现,其详细信息豌豆射手的冷却时间是7.5秒,并且通过浏览相关的内存区域可以看到,它内存基址是在0A2CA034~0A2CA037,如下图所示。
找出豌豆射手子弹的速度的内存基址
首先我们要找到吐出豆豆的地址。当一个豌豆射手吐出一个豆豆后,豆豆距离僵尸的距离会逐渐减少。这个就是我们ce扫描时的突破口。由于豆豆的速度比较快我们扫描起来不方便,这里改变游戏的速度,方便我们扫描。结果如下图所示。
未知的初始值扫描起手。当豆豆射出来后,我们进行未知的初始值扫描,且每当豆豆往前一点,我们就扫描一次减少的数值。(这里说一下,我们在种豌豆射手时,要注意射手和僵尸的距离,保证一次只有一个豆豆在场上),结果如下图所示.
扫描减少的数值,当豆豆击中僵尸后,豌豆射手会射出一个新的豆豆,这时我们扫描增加的数值,之后再反复扫描减少的数值,直达找到地址。锁定地址。第一个我们自动忽略,这个地址的值太大了,等这个值减少为0戴夫脑子都没了。我们可以将地址的数值改为0,豌豆射手会立刻在吐出一个豆豆。以此来验证我们是否找到了正确的地址,结果如下图所示。
3.2.8针对第二关的向日葵
扫描冷却与否的状态基址,冷却时间的数值和基址
分析:在向日葵重置下去之后,它的冷却时间会发生改变,首先我们应该种植向日葵之后进行未知的初始值的搜索然后进行变化的数值进行再次搜索,这样应该就可以找到向日葵冷却与否的状态基址。
找到向日葵种植的位置坐标
实现第一颗向日葵无限吐泡泡
我们首先得知道阳光是从“向日葵”这种植物中生产出来的,在刚刚种下向日葵时,我们并不知道它开始的数值,因此我们需要首次扫描时进行未知的初始值,之后它的倒计时在没有产出阳光时时慢慢减少的,在产出阳光后,它的倒计时相对于之前来说是进行增加的。
之后要将其进行锁定要不然还会进行新一轮的倒计时,同时我们要将数值修改为0,让向日葵不断的进行生成阳光这一操作,结果如下图所示。
实现三颗向日葵连续吐出阳光
我们可以通过不断的进行上述的扫描来进行三次扫描找到,这三个阳光的产生阳光的冷却时间,来更改我0,达到我们想要的结果,效果如下图所示
找到第一颗向日葵被僵尸吃掉的时间基址
首先我们进行未知的初始值的扫描,然后等到僵尸来到植物面前,来攻击植物,我们不断的进行减少的数值的搜索,然后可以进行未变动的数值来排除其余的内存地址。多次扫描之后结果如下图所示。
实现僵尸吃不掉别人
现在我们可以找到僵尸咬向日葵时,向日葵的血量是-4,这时候我们可以进行反汇编,将-4更改为+4,结果如下图所示,或者也可以将僵尸的攻击力变为0。相同的结果如下图所示。
这样就可以实现僵尸吃不掉植物的这个想法。