13.第二阶段x64游戏实战-分析人物等级和升级经验
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容:12.第二阶段x64游戏实战-远程调试
效果图:
如下图红框,之前的代码里有等级、经验、升级所需要的经验,这些数据之前没有分析过,现在开始分析
当前经验和等级的找法一样,升级所需的经验不一样,然后升级所需要的经验是计算出来的东西,所以这里就不找当前经验了,这里只提一下怎么找,就是在人物信息面板找当前经验是多少,然后使用CE去搜,然后打个怪然后再看看人物信息面板的当前经验是多少,然后使用CE中的再次扫描去找,不断重复这个步骤就能找到当前经验了
然后是等级,首先创建一个新账号,新账号默认等级是1级
然后搜索1,这里要注意,有的游戏切换地图后内存地址会变化,也就是说在A地图搜索出来的1到了B地图就没用了,需要重新搜索
然后领取任务,多升几级,再使用CE的再次扫描,升到了2级再次扫描
还剩2千多
升到了3级再次扫描
扫描之后还有3个,可以手动改了
双击下图红框位置
然后输入一个等级然后点确定
修改完重新打开人物信息面板查看等级,最终确定下图红框的是人物等级(原本人物等级是3通过手动修改内存地址的值变成了7)
然后找出是什么访问了这个地址
如下图红框0x6C就是这样找到的
然后通过手动修改等级可以发现,升级所需要的经验也随着等级的变化而变化了,然后重新打开人物信息面板,可以发现多处了三个访问,但是其中有一个是访问了5次,但是面板只打开了1次可以直接把5次的过滤了,然后这里就有一件事等级访问的很频繁使用x64dbg的硬件断点肯定是无法找到下图红框的位置的,所以就要手动把下图红框的内存地址记录下来 7FF740C7DA8B - 8B 50 6C - mov edx,[rax+6C],记录下来之后,关闭 找出是什么访问了这个地址 窗口,然后CE重新附加游戏,如果不这样做x64dbg就没法附加了
CTRL+G跳转到代码
开始分析 mov edx,dword ptr ds:[rax+6C] 访问了等级,然后下面有一个call,call的下面有一句test rax,rax这说明这个call有返回值,先使用断点查看返回值
如下图红框可以发现我们的等级和经验(返回值+0x4位置是升级所需要的经验),这说明 经验的计算就在 call qword ptr ds:[r8+8] 中
然后进入 call qword ptr ds:[r8+8],首先断点住下图红框位置
取消断点
然后再按F7就进入到下图位置
下图红框位置有一个无条件跳转,一路F8
然后就jmp跳转到了,下图位置
然后我们知道返回值是rax,所以找rax在哪返回的,所以一路按F8,然后发现下图红框的循环
一直按F8,最终发现它从下图红框位置跳到了下图绿框位置
然后发现下图红框位置还有一个call,然后需要看看它有没有返回值,也就是看rax的值变不变
断点当前RAX的值
按F8之后的值,可以看到RAX的值没有变说明这个call没有返回值
rax的值就来自于 00007FF740F1ABA4 这里,也就是下图红框位置
然后在下图红框位置可以看到 xor eax,eax,这里把eax进行了清零,xor eax,eax实际上就是mov eax,0x0这样的代码,我们的rax是有值的,所以不可能是下图红框的位置,所以它也可以直接排除掉
通过上方的步骤就确定rax来自于rcx,也就是下图红框的位置
然后接下来就找rcx的值哪来的,rcx的值来自于下图红框位置,获取的是数组中的值,r11的值是数组的头部
然后查看r11的数据,通过数据很明显的可以看出r11是一个数组,因为它数据长相都差不多,这里要注意,一定要确保下图红框的断点是通过查看人物信息面板触发来的,如果别的地方触发的可能r11的地址不一样
然后查看数组中第一个数据可以看到1级升级到2级需要90经验
7级升级所需要的经验是1980,这都跟游戏中人物信息面板对的上
所以现在就找到了人物升级所需要的经验,然后接下来找r11的值哪来的,如下图红框可以看到r11的值来自于[rcx+0x58]
然后rcx的值来自于上一层
然后rcx的值来自于rcx+0x8,现在的公式[[rcx+0x8]+0x58]
再往上rcx的值来自于基址了,现在的公式[[[0x00007FF74143FB10]+0x8]+0x58],然后升级所需要的经验的公式
[[[[0x00007FF74143FB10]+0x8]+0x58]+(等级-1)*0x8]+0x4
人物所需经验数据偏移 93FB10
然后查看数组的大小,如下图红框再往后的数据就与前面的数据差异很大了所以数组的大小是0x988字节,转成数组数据个数是0x988除以8
然后发现下图红框以上是人物经验,下面是其它的经验(未知可能是宠物啥的,现在不知道它是谁的经验,也没法找)
0x988除以0x8的结果是0x131,转成十进制是305,这游戏最高等级是150
然后4A8,从0开始,0-149正好150个数字
获取升级所需要经验的代码