植物大战僵尸:查找植物叠加种植CALL
实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物。
我们首先需要找到植物的种植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://blib.cn/post/4420.html
植物大战僵尸:查找植物叠加种植CALL的更多相关文章
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- 原生JS实现的h5小游戏-植物大战僵尸
代码地址如下:http://www.demodashi.com/demo/12755.html 项目介绍 本项目是利用原生js实现的h5小游戏-植物大战僵尸,主要结合了一下自己对于h5小游戏的理解,结 ...
- [Android] 转移“植物大战僵尸2”存档的办法,无需root
作者:zyl910 查过了很多文章,都说需要root后才能转移存档.但很多时候是不能root的,此时该怎么办呢? 我研究了很久,最终找到了一种办法,无需root也能转移存档. 一.备份 我用的是联想手 ...
- 植物大战僵尸:寻找阳光掉落Call调用
实验目标:通过遍历阳光产生的时间,寻找阳光产生的本地Call,使用代码注入器注入,自定义生成阳光 阳光CALL遍历技巧: 进入植物大战僵尸-> 当出现阳光后->马上搜索未知初始数值 返回游 ...
- java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码
Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...
- 【bzoj1565】[NOI2009]植物大战僵尸
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2164 Solved: 1001[Submit][Stat ...
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:pvz.out 简单对比时间限制:2 s 内存限制:512 MB [问题描述] Plants vs ...
- P2805 [NOI2009]植物大战僵尸
题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...
- 【刷题】BZOJ 1565 [NOI2009]植物大战僵尸
Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻. ...
随机推荐
- Hdu5178
Hdu5178 题意: 题目给你N个点,问有多少对点的长度小于K . 解法: 首先将所给的坐标从大到小排序,则此题转化为:对排序后的新数列,对每个左边的\(x_a\)找到它右边最远的 $ x_b $ ...
- Mac 下 brew的卸载 插件
brew 又叫 Homebrew,是 Mac OSX 上的软件包管理工具,能在 Mac 命令行中方便的安装软件或者卸载软件, 只需要一个命令, 非常方便 brew 类似 ubuntu 系统下的 apt ...
- vue cli 安装element-ui
1.安装elment-ui --save 参数:上线打包 MacBookPro:vue_test zhangxm$ npm install element-ui axios --save npm WA ...
- 黑马vue---61、为什么vue组件的data要是一个函数
黑马vue---61.为什么vue组件的data要是一个函数 一.总结 一句话总结: 因为js中以函数为变量作用域,所以这样可以保证每个组件的数据不互相影响 二.why components data ...
- 网络时间协议 (SNTP)
sntp是简单网络时间协议(Simple Network Protocol)的客户端,可以用来查询或修正NTP服务器的时间和本地的时差. sntp可以以非交互模式运行或运行一个计划任务的脚本. snt ...
- web前端——Vue.js基础学习之class与样式绑定
打着巩固 css 知识的旗号开始了对 vue 样式绑定的研究,相比前一篇的 demo,本次内容多了各种样式在里面,变得稍微花哨了些,话不多说,直接上代码吧: <html> <head ...
- [go]日志库小例子
输出日志 //输出日志到console msg := fmt.Sprintf(format, args...) //format里的坑 args解出的数据相匹配 fmt.Fprintf(os.Stdo ...
- linux上安装phpstudy
摘要:安装:wget-chttp://lamp.phpstudy.net/phpstudy.bin chmod+xphpstudy.bin #权限设置./phpstudy.bin#运行安装用时十到几 ...
- opencv C++ mask_rcnn
#include <fstream> #include <sstream> #include <iostream> #include <string.h> ...
- Linux 远程登陆图形界面
如果我的解决方案帮助到了你,请随手点亮一颗小红心.如有疑问,可在下方评论区处留言. 利用Xmanager,linux启用XDMCP协议(可直接修改配置文件,也可以采用在Xshell中运行gdmconf ...