实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物。

我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间的变化,最终实现功能。

种植CALL的遍历技巧:

打开CE -> 回到游戏 -> 然后回到CE -> 扫描未知初始数

回到游戏 -> 拿起向日葵(不要种) -> CE 搜索变动的数值 -> 回到游戏(不要动) -> 搜索未变动的数值

回到游戏 -> 放下向日葵 -> 拿起豌豆射手 -> CE搜索 变动的数值 -> 以此重复进行

当我们使用鼠标点击时会在一个地址写入值,当换个植物则会换一个数值,这样如此反复就会找到CALL的地址。

1.打开CE附加游戏进程,然后搜索未知初始化数值。

2.接着回到游戏,选择向日葵植物,然后回到CE直接搜索,变动的数值。

3.回到游戏不要动,直接右击取消向日葵的选择,然后再次拿起向日葵,搜索未变动的数值。

4.放下向日葵,拿起豌豆射手(不要告诉我你不知道是哪个),回到CE,搜索变动的数值。

5.放下豌豆射手,拿起向日葵,然后CE搜索变动的数值。

6.如上以此循环执行第4,5步,直到数据变成了几个为止,这里我找到了两个比较可疑的,只要拿起植物它就发生变化。

7.我们在第一个地址上面,右击选择查找访问的地址,也可以选中第一行按下【F5】键,回到游戏并手动种植一个植物,会发现一条可疑汇编代码,我们先把地址记下来【00410AC1】

这里我们只需要记录植物种下后出现的地址,前面三个分别是拿起植物和放下植物的代码,我们这里不需要考虑。

好了,我们关闭上面的【访问地址】对话框,然后我们用同样的方式在第二个地址上操作,种下植物会发现三个可疑地址,我们直接记下来,【00410865】,【00410a91】,【0041239A】

由于我们不知道那一个会调用种植的CALL所以,我们把这三个地址都记下来,记下来之后关闭CE就好了,后期用不到了。

在调试之前,请你自行把阳光改多一点,方便我们调试。

8.关闭CE后,直接打开OD并附加植物大战僵尸游戏进程,然后按下【F9】让程序先跑起来,然后【Ctrl + G】输入【00401000】回到程序领空。

9.我们分别定位到上面找到的那几个地址上,【00410AC1】,【00410865】,【00410a91】,【0041239A】,然后观察后分别下断点。

10.一切准备就绪了,我们回到游戏中,然后拿起一个植物,拿起植物后发现并没有断下,我们直接右击放下植物,会发现OD直接断下了,这里可以排除了,因为我们放下了植物并没有种植所以也就跳过了种植的CALL,这里没有我们直接取消下面的两个断点,然后按下【F9】让程序跑起来。

11.接着我们继续回到游戏中,拿起植物然后种植下去,此时OD会段在第二个断点的位置上,默认关键跳转没有跳,我们直接修改标志位让其跳转实现,然后运行程序发现种下了植物,这里虽然断下了但修改后并没有停止种植,所以这里我们也排除掉,取消这里的两处断点。

12.继续回到游戏,种下植物OD会段在以下位置,我们默认是不跳转的也就是种植,我们修改标志位观察发现,植物并没有被种下,说明这个跳转跳过了关键的种植代码,我们向下找也不难看出,于是乎我们重点分析它跳过的代码的执行轨迹。

13.观察如上跳过的代码不难看出一堆PUSH指令,很明显这是调用CALL之前的参数传递,此时我们直接在PUSH的位置下断点,回到游戏中再次种植植物,程序会断下,我们观察程序的压站情况。

首先我在第一行第一列种植了一个植物,观察压站情况如下所示,我已经分析好了。

为了对比明显,我在第二行种植了一个寒冰射手,然后观察压站情况,会发现植物的未知变化和植物ID的变化。

14.上面的对比已经非常明显了,我们直接使用代码注入器注入分别将push 5 改成【 1,2,3】,然后用【mov eax,2】控制在第几列种植,即可实现叠加效果。注意:这里的 【Push 1406FA88】每次运行程序都会改变,我这里可以注入成功,你们那里需要修改一下。

既然找到了种植CALL的地址【00410A94】,那我们可以猜测,植物在种下之前是否会判断放入方格中是否有植物呢? 答案是肯定的,当我们在一个空地上种植的时候,我们能够种上说明条件成立,那如果方格中有植物则无法完成种植,条件也就不会成立,由此可猜到这里应该是使用一个条件判断来控制的,下面我们就去寻找这个条件判断的位置。

15.直接打开OD,然后附加游戏并运行起来,按下【Ctrl + G】,输入【00401000】回到程序领空,然后输入【00410A94】,来到种植CALL的位置,然后向上找。

16.由于这里我们并不知道那个跳转是影响植物的种植判断的,所以我们只能去程序的断首下断点,一步一步的单步调试。

17.然后我们回到游戏,在已经有植物的格子里种植植物,发现程序会断下直接单步跟踪,只要不是大跳转就不需管它,在单步调试的时候,注意test 和cmp这种比较指令的状态。

18.如下图1-2,此处的JE跳转并没有跳转成功,而且还是很大的跳转,我们鼠标向下滑,找到跳转的结束位置,发现在结束之前有一个JMP指令,由于JE没有跳转,那么肯定是执行JMP指令。

19.接着看图1我们顺着JMP指令向下找,在图2的位置我们找到了种植CALL,也就是说它跳过了种植过程,我们继续顺着跳转红线往下找,会看到图3直接ret返回了。

由上面的分析不难看出,由于JE跳转并没有跳转成功所以执行了JMP指令,而JMP指令恰巧跳过了种植CALL,也就是跳过了种植的过程,所以可以断定上方的JE指令必须得跳转才能实现叠加种植的效果。

其实还有一种分析思路,我们知道如果植物种植失败肯定会Ret直接返回,所以我们直接来到程序的断尾,观察有没有直接跳转到结束的指令,然后顺着指令向上找也能够找到这个JE的位置。

20.既然知道了JE跳转是关键,那我们就让它直接无条件跳转试试,果然可以实现叠加种植啦。

转载于:https://www.cnblogs.com/LyShark/p/11213955.html

植物大战僵尸(6):查找植物叠加种植CALL相关推荐

  1. 植物大战僵尸:查找植物叠加种植CALL

    实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物. 我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间 ...

  2. 游戏辅助制作核心--植物大战僵尸逆向之植物种植call(七)

    一.效果 二.思路 使用鼠标点击时会在一个地址写入一个值,当换一个植物会换一个值,这样如此反复就会找到这个地址,当种植的时候肯定要访问这个地址,这样就可以精确的定位到种植call了 三.实现 (1)搜 ...

  3. 游戏辅助制作核心--植物大战僵尸逆向之植物攻击加速(六)

    一.效果 二.思路 思路就很简单了,从前面几篇文章可以得知,只要搜索到计时器,然后通过计时器就可以定位到他的代码执行段. 三.实现 之所以写这篇的目的是因为植物攻击加速的代码和太阳花快速生产的不是一个 ...

  4. 【Unity植物大战僵尸】UI植物卡片逻辑完善(十二)

    目录 22.UI植物卡片逻辑完善 问题一:植物的生命值和最大生命值 问题二:将一些变量和官方变量一致 问题三:点击卡片后还可以继续点击,进而种植多个植物 问题四:如何得到卡片的状态,也就是点击卡片后( ...

  5. 植物大战僵尸java圣诞版,植物大战僵尸圣诞版-植物大战僵尸2圣诞节版v1.9.1 安卓版-腾牛安卓网...

    植物大战僵尸2圣诞节版是一款经典的塔防类手机休闲游戏,要考验玩家的脑力,还有丰富的想象力,将不同功能的植物组合在一起玩抗击僵尸,圣诞版到来,僵尸也换上新衣服,变的更加强力,快用你植物进行反击吧. 官方 ...

  6. 【Unity植物大战僵尸】铲除植物的铲子开发(二十一)

    目录 39.铲子的资源导入 ​测试 39.铲子的资源导入 铲子资源导入 新建铲子和铲子背景物体 在Shovel下添加脚本 添加代码为: using System; using System.Colle ...

  7. 植物大战僵尸(8):分析植物的攻击速度

    实验目标:植物大战僵尸中,植物是有攻击速度的,比如每隔一段时间会吐出一些子弹,那么由此可判断吐出子弹应该是由一个计数器控制的,也就是说只要我们能够找到控制植物攻击的时钟并改写它,也就可以实现植物的无限 ...

  8. 植物大战僵尸android11,植物大战僵尸自创版APK

    植物大战僵尸自创版本指的是玩家根据植物大战僵尸原版自发制作的修改版本,修改的方向可能包含僵尸和植物单位的强度.关卡的流程等等,今天小编为大家带来的是名为克西版(ξ版)的版本,克西版基于植物大战僵尸北美 ...

  9. “植物大战僵尸之父”George Fan与他的设计之道

    前言 让人始料未及的是,诞生于2009年,以极富创造力的玩法风靡全球的<植物大战僵尸>,居然在11年后热度重回高潮,再度回归大众视野.暂且不论将其再次带火的"弄潮儿"姓 ...

最新文章

  1. JavaScript语言特点
  2. 当写了五百行代码忘记保存时…… | 每日趣闻
  3. Windows 下端口被占用
  4. selenium.common.exceptions.SessionNotCreatedException
  5. 数组最大最小值比较次数优化
  6. WinSock I/O 模型 -- WSAEventSelect 模型
  7. java验证码工具_java 验证码工具
  8. XMLHttpRequest.status 返回服务器状态码
  9. onenote复制出来是图片_OneNote入门篇
  10. Hadoop和Spark的异同
  11. C_C++编程题:选择填空、智力题
  12. WIN2003 IIS6.0+PHP+ASP+MYSQL优化配置
  13. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.
  14. 大数据技术之Hadoop(入门)
  15. Gauss型求积公式及其Matlab程序
  16. Spring Boot 整合 Spring Data JPA
  17. 在金融公司做 IT 是什么感觉?
  18. 理解 RxSwift:为什么要使用 RxSwift(一)
  19. 商业需求文档(BRD)怎么写
  20. (Java)socket网络编程及处理socket粘包拆包问题

热门文章

  1. JIRA6.3安装及alige插件破解
  2. python爬取证券数据并存入数据库
  3. 经常玩电脑正确的坐姿_使用电脑的正确坐姿 你坐对了吗?
  4. Android端一对一视频聊天系统功能实现方式
  5. MoM(五)解矩阵方程
  6. Oracle 数据库中的多种SCN汇总
  7. 31、SpringBoot(1)
  8. 【技术分享】python web 安全总结
  9. 民营企业的13种死法
  10. LWIP应用开发|心跳机制