钟欣桐 发表于 2021-8-6 01:24

植物大战僵尸分析实现僵尸百分百掉落物品

一、逆向思路
通过物品掉落生成的坐标第一次改写来找出物品掉落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游戏崩溃。

钟欣桐 发表于 2021-8-6 17:01

010xml 发表于 2021-8-6 15:40
僵尸都这样被你玩坏了如果把物品ID换成僵尸或者里面能出现的物品、甚至是植物,是否可行

物品id应该不行,但可以从死亡call下手,将死亡调用的掉落call替换成出怪call就能实现出怪

钟欣桐 发表于 2021-8-6 13:43

侃遍天下无二人 发表于 2021-8-6 11:43
如果故意让游戏掉过关卡片是不是就能直接胜利了

是的,掉落物品ID为7+都能直接过关

钟欣桐 发表于 2021-8-6 13:45

lostmilkyway 发表于 2021-8-6 12:30
你这整的跟CS的透视似的 画线+方框+显血

直接套的CS方框模板做的:Dweeqw

冰棍好烫啊 发表于 2021-8-6 10:51

清炒藕片丶 发表于 2021-8-6 10:59

感谢分享,儿时的乐趣之一,哈哈哈

吾爱丫男 发表于 2021-8-6 11:00

支持你成品放出来 :lol:lol

nug 发表于 2021-8-6 11:09

原来植物大战僵尸还可以这样子玩,厉害了

Strive8 发表于 2021-8-6 11:22

感谢楼主分享

Nantree 发表于 2021-8-6 11:29

拿走用了

天空の幻像 发表于 2021-8-6 11:34

牛逼啊,,居然还可以这样玩

侃遍天下无二人 发表于 2021-8-6 11:43

如果故意让游戏掉过关卡片是不是就能直接胜利了

地藏王菩萨 发表于 2021-8-6 12:07


感谢楼主分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 植物大战僵尸分析实现僵尸百分百掉落物品