植物大战僵尸-阳光掉落CALL
说到最前:
逆向和正向相辅相成.做游戏安全分析亦是如此.想要分析一款游戏必须要知道他的功能是如何实现的
这篇文章记录的我分析植物大战僵尸阳光掉落CALL的思路.
植物大战僵尸:链接:https://pan.baidu.com/s/1fg2ZQ-sQTzAjoqdMX6XExg 提取码:46v8
分析前的思考
什么时候会执行掉落阳光的CALL?
猜测是使用的随机数来控制掉落阳光的时间间隔
阳光的CALL是否有参数?
自己也玩过这游戏.知道阳光是有大阳光和小阳光的分别(太阳花/阳光菇).
所以猜测阳光掉落的CALL是有参数的
分析过程
通过CE查找猜想的随机数
阳光掉落后随机数开始递减 减至小于X值时再次执行掉落CALL.
执行一次阳光掉落的CALL就会把原来的随机数覆盖掉.
搜索方法:出现阳光后搜索位置的初始值->疯狂搜索减少的值->直到确定随机数的地址->锁定随机数的值为1(这样肯定小于X值,验证前面的猜测)
找到控制时间的随机数后,查看在哪修改了这个值.OD附加查找到关键的CALL
等待阳光出现之后就搜索未知的初始值(4字节).
扫描后会有很多值,导致临时数据表(我自己给起的名字)显示不出来.
先给再次扫描-减少的数值
和再次扫描-增加的数值
设置一个快捷键(这样我们就不用在CE和游戏之间来回跳转了)
设置好后回到游戏,按快捷键直到出现第二个阳光.这个时候就要搜索增加的数值(一次就行了!!!!)
这样就可以很快的把随机数的地址搜索出来了.把基质拖到固定数据表(这个也是我自己起的名字).把值改成1锁定后回到游戏看看.
这样它就会疯狂的掉落阳光下来.然后我们确定这个就是我们要找的随机数了.右键看是什么改变了这个值,等待新的阳光掉落下来
00413BCB
OK,确定了地址OD附加调试它!
通过地址作为突破点,利用OD动态调试
OD附加后 按Ctrl+G或者点击图中按钮跳转到我们前面找的地址处
跳转到产出阳光后随机数重新生成
的地址之后发现前面有很多的跳转.从后往前追,看看最近的哪个跳转跳过了这个改变随机数的地址
找到跳转之后我们给他下个断点(F2)执行看看
下了断点之后回到游戏马上就被断了下来.改标志位让跳转不执行看看会不会掉落阳光
如果掉落阳光说明 产出阳光的CALL就在这个跳转里面
把标志改了之后它就不会执行跳转了.运行发现,游戏中出现了阳光.然后现在只需要分析是哪个CALL就行了
然后继续向下看,会看到有几个push的call,猜测就是这个CALL
把push的值分别改一改看看会出现什么情况,来验证这个CALL是不是要找到CALL.
经过修改发现
第一个push:出现的动作 0x0掉落 0x2植物产出跳跃出现 0x4自动收集 0x6从右边跳跃出现 0x8一直在天上(真·阳光)没有动作
第二个push:出现的物品 0x2金币 0x4阳光 0x6超级大阳光 0x8奖杯
第三个push:修改了并没有发生什么.....
第四个push:修改了并没有发生什么.....
那现在已经搜索到了要找的CALL了,四个参数第一个和第二个参数并没有仔细分析出具体作用,第三第四个参数分别代表出现的物品和出现的动作.可以通过修改最后一个参数为0x4达到自动收集阳光的目的.
分析成果:
CALL的地址为:0x0040CB10
第一个参数:0x1D1
第二个参数:0x3c
第三个参数:0x2金币 0x4阳光 0x6超级大阳光 0x8奖杯
第四个参数:0x0掉落 0x2跳跃出现 0x4自动收集 0x6从右边跳跃出现 0x8动作