PlantsVsZombies简略分析
PVZ简单分析
思路
本想分各个部分来分析,例如阳光收集逻辑、种植逻辑,但在实际分析过程中发现分析往往是以点带面,牵扯出很多东西。想了想,便直接写一篇从头到尾的分析,就不按功能模块来写针对性的分析了。
对于植物大战僵尸这款游戏,显然相当多的逻辑都是围绕阳光的来展开。收集阳光时,阳光变化,种植植物时阳光变化,种植植物时又会带出植物对象的分析等等,因此可以看出从阳光的分析入手无疑是最佳的选择。
分析
首先定位到存储阳光的内存。
追踪阳光地址改写,并拾取一个阳光,追踪到一条汇编语句。
到这里可以停下思考。显然阳光增加是因为我点击拾取了一个阳光,那么按理来说正确逻辑就是判断阳光是否被鼠标点击,若点击则调用增加阳光的CALL,因此按照这个思路往回追。这个个人习惯用x64dbg来调试代码,因此下列分析主要使用x64dbg调试。
根据上述分析,我们不仅仅找到了阳光增加的call,显然也已经成功分析出阳光收集的逻辑,也提供了一个实现阳光自动收集的思路。我们可以在具体的在IDA中分析一下AddSun和CollectSun的具体逻辑。
先来看AddSun
再来看看CollectSun。这个CALL就有些复杂了,代码量巨大,但结合游戏,经过我个人的简单分析,这个CALL前面阳光是做了一些和收集阳光动画渲染之类的工作,就是点击阳光,阳光回到阳光槽这个过程,这个过程完成后才进入AddSun,这也与观察符合,因为阳光值的增加是在阳光动画完成即回到阳光槽的一瞬间后才增加的。很多时候逆向分析就是这样,需要以点带面,连蒙带猜(前提是要符合逻辑)。
接下来在分析一波,阳光减少时的逻辑。触发这个逻辑的动作就是种植植物,因此可以同样在阳光的内存下写入断点,种植一个植物。
经过分析,得到一下结果。在种植动作触发后进入了一个种植事件处理的函数,该函数核心的部分是先判断是否种植成功,如果成功了,再次进入一个不明所以的判断,随后获取种植植物的阳光值,并根据该阳光值调用函数减少阳光。这里其实也可以继续追踪GetPlantsObjectSunById,最终是可以找到一个存储了植物映像模板(Unity中叫可预设对象,UE4中叫蓝图对象,总之就是一种创建某个对象时的模板,包含了必要的初始化参数)的数组。
这里也顺便附上一个对植物对象成员含义的分析,但并不全。
其实分析完植物增减相关的逻辑时,带出了许多可以分析的点,可以选择感兴趣的继续分析,往后继续写也仅仅是延续上述思路,作用不大,因此容许我结束这篇水文。最重要的自己实际去上手分析,另外个人觉得,在分析代码量大的程序时切不可陷入大量细节中,该放就放,只分析自己感兴趣的细节或者只分析与某个目标相关的细节,并且分析过程中应该多结合游戏进行合理的逻辑猜测并验证。