查找植物叠加种植CAL 单机游戏

委员长 · · 游戏安全/游戏逆向
1

本文共计4115个字,预计阅读时长16.5分钟。

我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物。 我们首先需要找到植物的种植CALL,然后在逐步测试观察功能之间的变化,最终实现功能。 - 种植CALL的遍历技巧: - 打开CE ->回到游戏 ->然后回到CE ->扫描未知初始数 - 回到游戏 ->拿起向日葵(不要种) ->CE 搜索变动的数值 ->回到游戏(不要动) ->搜索未变动的数值 - 回到游戏 ->放下向日葵 ->拿起豌豆射手 ->CE搜索 变动的数值 ->以此重复进行 当我们使用鼠标点击时会在一个地址写入值,当换个植物则会换一个数值,这样如此反复就会找到CALL的地址。 1.打开CE附加游戏进程,然后搜索未知初始化数值。 ![](/image/1379525-20190719205643512-1288646167.png) 2.接着回到游戏,选择向日葵植物,然后回到CE直接搜索,变动的数值。 ![](/image/1379525-20190719205755967-1404012447.png) 3.回到游戏不要动,直接右击取消向日葵的选择,然后再次拿起向日葵,搜索未变动的数值。 ![](/image/1379525-20190719205906310-1951728147.png) 4.放下向日葵,拿起豌豆射手(不要告诉我你不知道是哪个),回到CE,搜索变动的数值。 ![](/image/1379525-20190719210023587-851432632.png) 5.放下豌豆射手,拿起向日葵,然后CE搜索变动的数值。 ![](/image/1379525-20190719210137075-505846968.png) 6.如上以此循环执行第4,5步,直到数据变成了几个为止,这里我找到了两个比较可疑的,只要拿起植物它就发生变化。 ![](/image/1379525-20190719210345922-1404486830.png) 7.我们在第一个地址上面,右击选择查找访问的地址,也可以选中第一行按下`F5`键,回到游戏并手动种植一个植物,会发现一条可疑汇编代码,我们先把地址记下来`00410AC1` 这里我们只需要记录植物种下后出现的地址,前面三个分别是拿起植物和放下植物的代码,我们这里不需要考虑。 ![](/image/1379525-20190719210604237-330920309.png) 好了,我们关闭上面的`访问地址`对话框,然后我们用同样的方式在第二个地址上操作,种下植物会发现三个可疑地址,我们直接记下来,`00410865`,`00410a91`,`0041239A` ![](/image/1379525-20190719210851755-106509289.png) 由于我们不知道那一个会调用种植的CALL所以,我们把这三个地址都记下来,记下来之后关闭CE就好了,后期用不到了。 8.关闭CE后,直接打开OD并附加植物大战僵尸游戏进程,然后按下`F9`让程序先跑起来,然后`Ctrl + G`输入`00401000`回到程序领空。 ![](/image/1379525-20190719211915519-260153097.png) 9.我们分别定位到上面找到的那几个地址上,`00410AC1`,`00410865`,`00410a91`,`0041239A`,然后观察后分别下断点。 ![](/image/1379525-20190719212103884-180536346.png) ![](/image/1379525-20190719212131172-817160858.png) ![](/image/1379525-20190719212202959-566526128.png) ![](/image/1379525-20190719212228073-1726114117.png) 10.一切准备就绪了,我们回到游戏中,然后拿起一个植物,拿起植物后发现并没有断下,我们直接右击放下植物,会发现OD直接断下了,这里可以排除了,因为我们放下了植物并没有种植所以也就跳过了种植的CALL,这里没有我们直接取消下面的两个断点,然后按下`F9`让程序跑起来。 ![](/image/1379525-20190719212530487-999700084.png) 11.接着我们继续回到游戏中,拿起植物然后种植下去,此时OD会段在第二个断点的位置上,默认关键跳转没有跳,我们直接修改标志位让其跳转实现,然后运行程序发现种下了植物,这里虽然断下了但修改后并没有停止种植,所以这里我们也排除掉,取消这里的两处断点。 ![](/image/1379525-20190719212820778-109015227.png) 12.继续回到游戏,种下植物OD会段在以下位置,我们默认是不跳转的也就是种植,我们修改标志位观察发现,植物并没有被种下,说明这个跳转跳过了关键的种植代码,我们向下找也不难看出,于是乎我们重点分析它跳过的代码的执行轨迹。 ![](/image/1379525-20190719213224161-216694172.png) 13.观察如上跳过的代码不难看出一堆PUSH指令,很明显这是调用CALL之前的参数传递,此时我们直接在PUSH的位置下断点,回到游戏中再次种植植物,程序会断下,我们观察程序的压站情况。 首先我在第一行第一列种植了一个植物,观察压站情况如下所示,我已经分析好了。 ![](/image/1379525-20190719214405691-742568318.png) 为了对比明显,我在第二行种植了一个寒冰射手,然后观察压站情况,会发现植物的未知变化和植物ID的变化。 ![](/image/1379525-20190719214258410-1323956339.png) 14.上面的对比已经非常明显了,我们直接使用代码注入器注入分别将push 5 改成` 1,2,3`,然后用`mov eax,2`控制在第几列种植,即可实现叠加效果。注意:这里的 `Push 1406FA88`每次运行程序都会改变,我这里可以注入成功,你们那里需要修改一下。 ![](/image/1379525-20190719214832187-1081238628.png) 既然找到了种植CALL的地址`00410A94`,那我们可以猜测,植物在种下之前是否会判断放入方格中是否有植物呢? 答案是肯定的,当我们在一个空地上种植的时候,我们能够种上说明条件成立,那如果方格中有植物则无法完成种植,条件也就不会成立,由此可猜到这里应该是使用一个条件判断来控制的,下面我们就去寻找这个条件判断的位置。 15.直接打开OD,然后附加游戏并运行起来,按下`Ctrl + G`,输入`00401000`回到程序领空,然后输入`00410A94`,来到种植CALL的位置,然后向上找。 ![](/image/1379525-20190720130407430-1181751359.png) 16.由于这里我们并不知道那个跳转是影响植物的种植判断的,所以我们只能去程序的断首下断点,一步一步的单步调试。 ![](/image/1379525-20190720130630037-1755740122.png) 17.然后我们回到游戏,在已经有植物的格子里种植植物,发现程序会断下直接单步跟踪,只要不是大跳转就不需管它,在单步调试的时候,注意test 和cmp这种比较指令的状态。 ![](/image/1379525-20190720132812826-793361089.png) 18.如下图1-2,此处的JE跳转并没有跳转成功,而且还是很大的跳转,我们鼠标向下滑,找到跳转的结束位置,发现在结束之前有一个JMP指令,由于JE没有跳转,那么肯定是执行JMP指令。 ![](/image/1379525-20190720132902385-1930381014.png) ![](/image/1379525-20190720133108822-1986487497.png) 19.接着看图1我们顺着JMP指令向下找,在图2的位置我们找到了种植CALL,也就是说它跳过了种植过程,我们继续顺着跳转红线往下找,会看到图3直接ret返回了。 ![](/image/1379525-20190720133253007-443629127.png) ![](/image/1379525-20190720133450105-230973760.png) ![](/image/1379525-20190720133515120-1966602314.png) 由上面的分析不难看出,由于JE跳转并没有跳转成功所以执行了JMP指令,而JMP指令恰巧跳过了种植CALL,也就是跳过了种植的过程,所以可以断定上方的JE指令必须得跳转才能实现叠加种植的效果。 其实还有一种分析思路,我们知道如果植物种植失败肯定会Ret直接返回,所以我们直接来到程序的断尾,观察有没有直接跳转到结束的指令,然后顺着指令向上找也能够找到这个JE的位置。 20.既然知道了JE跳转是关键,那我们就让它直接无条件跳转试试,果然可以实现叠加种植啦。 ![](/image/1379525-20190720135034486-1193188604.png)

最新回复 ( 1 )
全部楼主