之前我们在分析游戏的内息值时得到了一个CALL的返回值,那么接下来我们到CALL去寻找一下这个返回值的来源,并对遇到的汇编指令进行讲解(如图)(什么?你不知道是哪个CALL?请上一篇看一遍~~~)
在CALL的位置下F2断点,我们发现这里不需要修改内息,游戏直接就会断下。于是我们在+178偏移和CALL的返回处分别下F2断点,看一下eax的值是否相同(如图)(如图)
接下来我们在CALL下F2断点,并点击F7进入CALL的内部继续分析来源(如图)
这里是CALL内部的头部,我们继续点击F8,走到CALL的retn处(如图)
我们需要从这里继续向上分析rax的来源。点击减号来逐步后退,这样可以原路返回去分析来源,防止跳转过多影响我们的分析过程。
首先可以得到mov rax, qword ptr [rcx + 8]
这里的分析可能有一些绕,有32位基础的能够看得懂,如果看不懂的在后面的堆栈文章中我们会重新的进行讲解。
继续向上分析rax可以得到mov rax, qword ptr [r10 + rdx*8],这是一个标准的64位数组的代码,r10是数组的起始地址,而每一个数组元素都占用8字节(如图)
这说明我们来到了一个遍历代码中,这里不只有数组,如果仔细观察还能够发现在下面还存在一个链表(如图)
由于遇到了遍历代码,所以我们就不继续讲解这个分析过程了,在后面的文章中会重点讲解64位下的数据结构。
那么我们的分析结束了么?当然没有。由于角色是在游戏中是一个特殊的存在,他被访问的也是最频繁的,所以大部分游戏的角色对象都会单独存放在一个基地址中。所以我们尝试用CE去对之前的r12进行扫描(如图)
得到了一个绿色的地址,为了验证它是否是一个可用的基地址,我们在OD中查找常量(如图)
还没有搜索完就得到了很多的结果,说明这是一个可用的基地址(如图)