免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:42.x86游戏实战-C++实现全图秒杀功能
之前代码中用的坐标是偏移0x18C和0x190位置,这俩未位置使用CE修改之后没有反应(怪物不瞬移),所以这俩位置并不是真正的坐标,真正的坐标改了之后怪物会瞬移,接下来先找真正的坐标。
首先来到有怪物的地图,然后把怪物清理的就剩下一个
然后注入我们写的dll,点击遍历怪物,找一下怪物的地址
然后记住怪物地址,一会CE中要用
然后使用管理员打开CE,并附加到游戏,然后输入怪物地址+0x18C位置(也就是坐标)
然后就能看到怪物坐标的数据了
然后使用CE的范围搜索
然后搜出来很多结果
这时引怪物移动改变坐标,移动之后再次使用CE搜索,如下图
然后就能找到了,修改下图红框地址的值怪物就会瞬移
然后接下来通过使用硬件断点来找基址,所以使用管理员打开OD,并附加游戏,附加之前记得过一下检测(0x755B88位置的值改成EB,详情:34.x86游戏实战-XXX过检测代码分析)
然后以十六进制显示
然后输入EB
过完检测使用管理员打开OD并附加到游戏,首先点位置1,然后按CTRL+G,然后输入上方通过CE找的可以修改的坐标地址,然后点确定(本次步骤要做两次,OD有个问题,第一次CTRL+G会乱搞)
然后下一个硬件写入断点
然后在下图位置断了下来,xmm0是专门存放浮点数的寄存器(专门存放小数的寄存器),可以看到这里给数组里的一个值进行了赋值(ecx+eax*4*4地址里的值是坐标)也就是修改坐标
xmm0寄存器的值来自于ebp+C
ebp是的值是栈顶数据(函数中的数据),ebp+C一般是函数的第二个参数,这个参数并不重要,重要的是ecx,所以接下来找ecx,ecx在下图中并没有看到有赋值的代码,所以ecx的值来自于上一层
然后取消硬件写入断点(如果不取消使用CTRL+F9功能可能会乱断点住)
取消硬件写入断点之后,按CTRL+F9来到上一层,看看ecx的值哪来的,按完CTRL+F9之后,在下图中可以看出,ecx的值来自愈ebp-64,所以接下来要找ebp的值哪来的
然后通过断点一路F8 下图红框两个位置给ecx的值都是一样的,然后ebp并没有看到在哪赋值的,但是esi看到了
用鼠标滚轮往上翻,一般来到函数头部附近就可以看到,然后如下图esi的值来自于ecx,ecx的值来自于上一层,所以还是要CTRL+F9
使用鼠标滚轮往上翻了之后,怎么回到往上翻之前的位置?这里按下图红框的C就可以
然后CTRL+F9,可以看到ecx的值又是来自于esi,如果不出意外esi的值又会是来自于ecx
然后使用鼠标滚轮往上翻,来自于ecx,所以还要继续CTRL+F9
CTRL+F9之后来到下图位置,下图红框可以看出ecx的值来自于ebp-48位置
然后找ebp的时候发现,这个函数里几乎全是vm代码,这就没法找,往上反也反不出去
上方是通过下硬件写入断点找的,接下来通过下硬件访问试试
然后访问断点断下来,然后通过dd ecx+eax*4+4,看到 ecx+eax*4+4的值是坐标,为了后续方便这里称它为坐标列表,然后找ecx
然后删除访问断点
然后CTRL+F9之后,然后发现ecx的值还是来自于ecx,所以要继续CTRL+F9
然后CTRL+F9之后,也没有ecx的赋值,这里在retn位置断下来了,要按F8,不要按CTRL+F9,然后这里push了一个0,这个0就是 ecx+eax*4+4中的eax的值
然后F8之后,看到ecx的值还是来自于ecx,所以继续往上
CTRL+F9之后,ecx的值来自于edi,edi的值来自于ebp+8,然后ebp的值来自于esp,ebp+8也就是函数第一个参数,所以要继续往上反
然后CTRL+F9之后,第一个参数是esi的值,然后esi还是来自于函数的第一个参数
然后CTRL+F9,这里比较复杂,慢慢细看发现它的值来自于ebp,并没有什么有用的东西
这里esi最后一次赋值是来自于ebp-4,这种减法是访问的函数中的局部变量,然后并没有看到给局部变量赋值的操作
然后通过断点之后按F8的方式发现,ebp-4的值来自于ecx+4
然后进入0xB09680函数
然后ecx的值来自于ebx,ebx的值来自于esi+AC,然后esi的值来自于ecx,ecx的值来自于上一层
然后CTRL+F9,到了下图位置
然后ecx的值最终还是来自于ecx,但是这里按CTRL+F9 反不动了,所以现在可以宣布通过硬件断点访问也没找到这个地址的基址
然后回到CE,看看CE中有那些我位置访问了坐标,首先玻璃OD,右击OD选择Detach,如下图
然后回到CE,右击地址选择找出是什么访问了这个地址
然后发现只有两个位置访问了坐标,这俩位置上方都分析过了,都找不到,这怎么办?
然后换个思路,现在有一件事,这个游戏中坐标数据会有多个地址存放,通过CE可以看出有两个位置存放一个是怪物地址+0x18C位置一个是通过CE新扫描出来的(修改数据会让怪物瞬移),怪物会存在多个也就是怪物列表,然后一般为了性能在同步坐标数据的时候它肯定不会先从怪物数组里一个一个找,找到之后再通过某些条件去坐标列表(坐标列表指的是上方通过访问断点找的那个)找怪物对应的坐标,所以它肯定会在怪物列表中记录了坐标列表的数据,所以接下来,来到怪物对象里找一找看看有没有5D6948C相近的数据
现在怪物列表是0x13fb6000
然后修改坐标怪物瞬移的地址是0x5D6948C
再次来到OD,鼠标单击1位置,然后输入怪物地址,然后点确定
然后双击下图红框位置,让它显示偏移
然后在怪物地址偏移0xA8位置找到了与0x5D6948C相近的值,0x5D69480
分别是x坐标、y坐标、z坐标,z坐标是高度,这些坐标修改可以让怪物瞬移,也就能实现吸怪了