【游戏漏洞】《猎天》二叉树的多种形态以及角色对象的获取
如果你无法判断哪一个是正确的进程,可以打开任务管理器,在游戏的应用程序上点击右键——>转到进程,这样就会跳到我们需要附加的进程名上,这个游戏的进程名为Client.dat *32,后面的这个*32说明游戏是32位的,在win64位的系统上会在32位的进程后面标注*32,同样在win32位的系统上也会对64位的进程进行标注。这也是我们以后调试游戏前需要确定的。
附加进程后我们先尝试搜索整数型,然后通过被怪物攻击或者更改装备来改变血量,反复过滤得到较少的结果。
我们在取消快速扫描的情况下分别尝试整数型,浮点型,双浮点型,最终在扫描浮点型时得到了两个结果。
这两个结果中一个是绿色,一个是黑色,绿色的一般都是在基地址附近或者就是基地址,而黑色的则是有一些偏移存在的。遇到这种情况,首先要考虑是黑色的地址,因为如果是基地址的话则很有可能不是存放在角色对象下的。我们在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] 二叉树根
标签: