从这节课开始,我们将开始《猎天》的数据分析。 对于大部分游戏来说,我们都会从角色的血量入手,因为分析角色血量是比较容易,也是很直观的。血量的数据类型并不固定,大部分游戏是整数型,也就是DWORD型,也有很多游戏会用到浮点型,双浮点型。还有很多游戏会对血量进行加密,不过大多不是很复杂,可能是个简单的XOR(位异或)一个值,也可能是转换成百分比。还有个别的游戏会做复杂的加密,比如XNF等。下面我们就开始分析猎天的角色血量。 打开OD和CE,分别加载游戏进程,如果你无法判断哪一个是正确的进程,可以打开任务管理器,在游戏的应用程序上点击右键——>转到进程,这样就会跳到我们需要附加的进程名上,这个游戏的进程名为Client.dat *32,后面的这个*32说明游戏是32位的,在win64位的系统上会在32位的进程后面标注*32,同样在win32位的系统上也会对64位的进程进行标注。这也是我们以后调试游戏前需要确定的。(如图) 附加进程后我们先尝试搜索整数型,然后通过被怪物攻击或者更改装备来改变血量,反复过滤得到较少的结果。(如图) 这时我们可能会发现,过滤到最后一个结果都没有了。出现这个结果的原因有如下几种:第一,数据类型不对;第二,数据有加密;第三,也是最容易忽略的,那就是我们用了快速扫描,而我们的搜索结果并不是可以被4整除的。(如图) 我们在取消快速扫描的情况下分别尝试整数型,浮点型,双浮点型,最终在扫描浮点型时得到了两个结果。(如图) 这两个结果中一个是绿色,一个是黑色,绿色的一般都是在基地址附近或者就是基地址,而黑色的则是有一些偏移存在的。遇到这种情况,我们首先要考虑是黑色的地址,因为如果是基地址的话则很有可能不是存放在角色对象下的,周围也没有其他的信息,不方便我们分析和读取。我们在OD的数据窗口中跟随这个黑色的地址(dd 18176462),然后在这个地址上下硬件访问断点,或者直接hr 18176462也可以,下断点之后断在如图位置(如图)。 硬件断点会断在代码执行之后的位置,而内存断点会断在即将执行的代码处,这一点需要注意,这里我们得到了第一层偏移[esi+4C],fld dword ptr [esi+4C]这句指令是将esi+4C里的值压到浮点栈st0里,我们不用管他传递到哪,只需要知道esi+4C里存放的是我们要的值,而这个值是浮点数就可以了。继续向上追esi的来源,发现来源于ecx,继续向上追发现到了子程序头部(如图)。 删除硬件断点后ctrl+F9返回上一层后继续向上追,发现ecx来源于esi,然后又来源于ecx,继续返回(这里不贴图了),向上追来得到mov ecx, dword ptr [edi+10]这样的来源(如图)。 这里是一个关键,我们在edi+10上下F2断点,然后点F9运行会发现edi会变化,而在上面的 je short 00501826上下断时发现无论怎么F9运行edi都是不变的。这个情况说明mov ecx, dword ptr [edi+10]这条代码是在一个循环遍历里的,每次代码循环经过这里,edi的值都不一样。那么我们顺着代码往下看,发现下面有一个向上的跳转,而跳转经过的代码很像是一个二叉树的遍历(如图)。 我们先向上追ebx,过一会再回来分析这个遍历。向上追得到 mov ebx, dword ptr [esi+20],继续向上追esi的来源,得到来源于ecx后到了子程序头部,然后执行到返回,还是头部继续返回,向上追得到来源[esi](如图), 到了头部继续返回得到了基地址(如图)。 整理后得到公式dd [[[[[9B9A44]]+20]]遍历 +10]+4C 血量 这个遍历看起来很乱,所以我们hr [[[[9B9A44]]+20]] 看看有么有其他的代码访问这个地址,F9几次我们发现断到了如下的代码(如图)。 这段代码是比较常见的二叉树的遍历代码,返回之后可以很容易的追到公式[[[[9B9A44]]+1C+4]+4] 二叉树根 +0左子树 +8右子树 +15标志位 +10对象,对象里面存放的是血量等信息 我们要追的是角色的血量,可是追到了遍历里,很明显这样并不方便我们调用,那么下节课我们来解决这个问题。
联系我时,请说是在 挂海论坛 上看到的,谢谢! |