角色的当前技能列表往往都是从系统的技能库中进行筛选而组成的,而这个筛选的过程大多非常的复杂,经过的代码和临时结构体的传递也非常的多,所以在分析技能对象来源的时候常常要将OD和CE配合来使用。下面我们来分析下《天堂2》的技能列表。
首先通过CE对技能的名字进行扫描,可以得到较多的UNICODE型结果,通过二分法对技能的名字进行修改,发现其中的一个地址可以改变技能的本地显示(这里要注意的是,只有重新开启技能栏以后显示的技能名字才是我们需要分析的)(如图)
在OD中对这个地址下访问断点,再次开启技能栏,游戏断下(如图)
执行到返回后继续分析第一个参数的来源,发现来源于0AF8C8C2处函数的返回值(如图)
经过对函数内部的分析,只得到了一个+0的偏移,我们需要继续向上分析ecx的来源。然而当我们向上分析了一段时间后发现,这里的来源始终是在一些临时地址中互相传递,为了节省时间,我们直接通过CE对ecx进行扫描,并得到了较少的结果(如图)
在第一个结果上下访问断点,打开技能栏游戏断下(如图)
执行到返回继续分析eax的来源,得到来源于0AEFC541处函数的返回值(如图)
在函数内部可以得到一个结构体数组,而数组的大小为0x10(如图)
返回后分析esi的来源,得到+80偏移,继续向上分析,可以在执行到返回后得到+10偏移(如图)
再次返回并分析第一个参数,可以在函数call 0A671770中得到基地址(如图)
接下来整理技能公式如下
[[0B7B6E74]+10+80]+n*10 技能ID
[[[[0B7B6E74]+10+80]+n*10+C]+0] 技能名字