植物大战僵尸:查找植物叠加种植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跳转是关键,那我们就让它直接无条件跳转试试,果然可以实现叠加种植啦。

支持一下!!!
页:
[1]