植物大战僵尸分析实现僵尸百分百掉落物品
一、逆向思路通过物品掉落生成的坐标第一次改写来找出物品掉落CALL。
二、实现工具
CE、OD
三、实现步骤
为了方便分析,笔者事先做了一个顶点吸怪工具,当怪物积累到一定程度再放炸弹可以节省不少时间。
1.打开游戏,进入关卡,吸怪,等僵尸存够一定数量。
2.利用CE将游戏变速为0.1,使用樱桃炸弹干掉僵尸,等银币出现马上暂停游戏。
3.CE搜索未知浮点数->回到游戏->硬币往上抛->搜索变小的数值->硬币往下掉->搜索变大的数值->重复操作->硬币落地->搜索未变动的数值。最后得到的数据只有八个,将最后两个放到数据列表中(第一个有在变动故不放入列表中)。
4.修改其中数值,回到游戏,发现银币y坐标发生变化。故知道0x1AA5F3EE8为银币y坐标。
5.对0x1AA5F3EE8进行指针扫描,将最大偏移设为9。以基址排序,找到基址偏移为003296FC的地址(阳光、僵尸血量、坐标偏移均为这个,所以本次逆向以本偏移为准),选择总偏移数最少的,添加到地址列表。
6.打开CE的遍历结构,分析最外层的偏移,找相似数据段。发现0x28和0x100上下文相似。
最后可知存放银币结构的是一个数组,且每一段数据相隔0xD8.
7.OD附加,将数组成员选到为y坐标为空的地址,OD对其下硬件写入断点。
8.CE调到10倍速,吸怪,等怪物积累到一定数量->樱桃炸弹->断下。
9.Ctrl+F9返回到上一层,分析其上下文,没有发现明显的判断(判断掉落物品以及是否掉落等)。继续Ctrl+F9
10.发现疑似CALL内部,存在多个判断。
11.向上翻阅,发现同一CALL出现多次,记住参数0x3,0x4。
12.在最开始跳出来的CALL下断,重复刷怪操作,观察堆栈,共断下两次,爆两个银币。
13.重复操作,下断然后刷怪,更改堆栈内的值,从开始,因为第一个参数是常数4,第二个参数不同。
将1改成4,观察僵尸掉落物品。
断下四次,将的值都改成4,发现掉落了四个阳光。
14.可知0x40F400是确定掉落物品call,第二个参数为掉落的物品ID,4为阳光的ID。从最早调用此call的地址进行分析。
将跳过函数执行的跳转语句全部nop掉。
15.回游戏查看效果。(100%爆阳光)
结尾放一个物品ID表:
1银币 2金币 3钻石 4阳光 5阳光 6大阳光 7过关卡片 8金奖杯 9铲子 A图鉴 B钥匙 C半截花瓶 D花洒 E三明治 F明信片
亲测当第二个参数>=0x10游戏崩溃。 010xml 发表于 2021-8-6 15:40
僵尸都这样被你玩坏了如果把物品ID换成僵尸或者里面能出现的物品、甚至是植物,是否可行
物品id应该不行,但可以从死亡call下手,将死亡调用的掉落call替换成出怪call就能实现出怪 侃遍天下无二人 发表于 2021-8-6 11:43
如果故意让游戏掉过关卡片是不是就能直接胜利了
是的,掉落物品ID为7+都能直接过关 lostmilkyway 发表于 2021-8-6 12:30
你这整的跟CS的透视似的 画线+方框+显血
直接套的CS方框模板做的:Dweeqw 感谢分享,儿时的乐趣之一,哈哈哈 支持你成品放出来 :lol:lol 原来植物大战僵尸还可以这样子玩,厉害了 感谢楼主分享 拿走用了 牛逼啊,,居然还可以这样玩 如果故意让游戏掉过关卡片是不是就能直接胜利了
感谢楼主分享