27.第二阶段x64游戏实战-分析技能属性
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容:26.第二阶段x64游戏实战-代码实现背包遍历
这次找技能的结构(对象),技能怎么找?可以通过任意技能相关的属性去找,比如技能的名字,如下图通过技能名字去找
首次扫描完有15个结果
然后设置成字节数组显示,这个种方式之前写过了
得到它的字符数组
然后点击新的扫描
然后选择字节数组
然后粘贴刚刚复制的字节数组
然后首次扫描,扫描出的结果就剩下两个了
然后如下图全选结果,然后点击红色箭头
然后如下图,重新该回字符串类型显示
然后修改它俩的值,然后看看游戏中技能的名字变成哪一个了,这里技能名字变成了初级22,然后就找到了技能名字的地址
然后来到x64dbg设置硬件访问断点,追基址,如下图设置硬件访问断点
然后来到游戏,鼠标放到技能上,让游戏访问技能名字,从而触发断点来到下图位置,下图红框位置的rdx访问了技能名字
开始分析代码,如下图,继续找rdx
断点住
如下图 按CTRL+F9再按F8来到的上一层
然后发现一个问题,下图红框是通过名字的硬件访问断点来到的,上图是通过CTRL+F9再按F8来到的,可以发现它call的地址是0x7FF761F12FB0,这个地址离着0x7FF761F13519很远
如下图红框差着一千多字节,这说明通过名字触发的硬件访问来到的函数只是获取技能函数的一小部分,所以需要从函数头一路F8,一直执行到 0x7FF761F13519这个地址为止,否则相差的一千多字节的取值公式我们找不到
现在的公式[[rdx+0x8]+0x10],然后如下图,设置断点
触发断点
取消断点
按F7进入函数头部
按住F8,直到来到下图红框范围内
然后按减号,然后就可以看到rdx来自于rax
rax的值应该来自于下图红框call的返回值
设置断点
触发断点,如下图按F8之前rax的值
按F8之后rax的值就变了
如下图继续按F8可以看到rdx的值确实来自于rax,然后按F9让游戏运行起来
所以接下来就要F7进入下图红框函数,看看它的返回值怎么来的
触发断点
按F7进入函数
然后按F8看看执行逻辑,判断了rax是不是空,不是空进行了跳转
然后进行jmp往上跳转
然后来到了下图红框位置,这里的代码很乱,但是不要紧,我们现在找的是rax,是返回值,返回值在函数的后面,所以按住F8来到当前函数ret位置其它代码直接忽略就可以了
然后找到了rax,然后开始找rax的值哪来的
然后一路按减号,可以看到rax的值来自于一个二叉树,这个二叉树之前遍历周围的时候细写过了,现在应该有一种熟悉感
然后公式 [[[[rdi+0x18]+0x2AB0]+0x8]+0x10]+0x28
rdi的值来自于rcx,现在的公式[[[[rcx+0x18]+0x2AB0]+0x8]+0x10]+0x28
然后最终公式 [[[[[[[0x7FF7625290E8]+0x98]+1B0]+0x18]+0x2AB0]+0x8]+0x10]+0x28
最终技能名字的公式 [[[[[[[[[0x7FF7625290E8]+0x98]+1B0]+0x18]+0x2AB0]+0x8]+0x10]+0x28+0x8]+0x10],这个地址通过在内存窗口的CTRL+G跳转是可以跳转到一个技能名字的
然后 [[[[0x7FF7625290E8]+0x98]+1B0]+0x18] 这个公式之前找的人物属性(血量啥的)很像,所以这个 0x7FF7625290E8 也是人物对象
偏移0x0x7FF7625290E8 - 0x00007FF761BE0000 = 0x9490E8
遍历技能二叉树代码地址:0x00007FF761D66E49 - 0x00007FF761BE0000 = 0x186E49