免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!0
本次游戏没法给
内容参考于:微尘网络安全
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:26.第二阶段x86游戏实战2-C++遍历背包物品
上一个内容里通过C++把背包的数据成功读取了出来,然后接下来找周围的NPC,这是想做自动打怪、自动做任务必须的数据,遍历周围NPC算是核心的东西了,然后怎样找周围NPC?可以通过对象里面的变量,比如说名字、血量
本次就通过附近NPC的名字去追
npc特点说明:附近NPC一般游戏会不断的遍历附近NPC这个数据,也就是不断遍历npc列表,所以只要通过CE找到了地址那它一定是在循环里
首先打开游戏,打开CE,并使用CE附加到游戏里
搜索完有314个结果
然后把结果全选然后点下图红框
然后在下图红框位置选中大概一半的数据
通过修改进一般的内存地址,发现游戏中npc的名字并没有被影响,所以现在选中的都不是npc的名字,可以把它们都给删了,注意游戏在后台运行的时候不后悔刷新页面,所以最好修改完了数据用鼠标点击点击游戏中的npc
删除地址
然后再对剩下的数据选中一半然后修改,看看会不会在游戏中影响到npc的名字,修改完还是没影响,所以把这次选中的地址也全部删除
然后继续重复上面的步骤,最终找到了名字的地址,然后打开OD进行断点调试
使用dd指令在内存窗口中跳转过去
然后下硬件访问断点
通过硬件访问断点就来到了下图位置,ecx的值是名字,记得把硬件访问断点删除
开始找ecx的值哪来的,下图ecx的值看着来自于下图红框位置
但是它上一行是一个跳转指令,如下图可能会不执行上图红框里的代码
然后通过下断点,可以确定ecx的值不来自于,mov ecx,dword ptr[ecx]这一行,它来自于上面,所以接下来往上翻看看还有什么位置给ecx赋值了
然后下图断点位置是一个je跳转指令,可以看出它并没有跳转
所以位置ecx还进行了加0x2C,现在的公式[[[ebx+0x148]+0x10]+0x2C]
然后最终看到ecx来自于edx,edx又来自于[eax+0x10],eax来自于[ebx+148],ebx来自于ecx,ecx来自于上一层,所以接下来通过硬件访问到断点CTRL+F9
首先在内存窗口中回到使用CE找到的那个地址,如下图红框
然后硬件访问断点,断点住,记得删除硬件断点,然后按CTRL+F9就来到下图位置
CTRL+F9发现跳出了Game模块,来到了一个递归循环(下图位置会不断的运行)
然后再回到npcm111这个位置,测试一下公式 [[[ebx+0x148]+0x10]+0x2C],首先在下图红框位置打断点
然后使用 dd [[ecx+0x148]+0x10]+0x2C,如下图虽然现实不全但它确实是一个名字
然后它也有的位置是0,没有名字
还有乱名字不知道是什么,等后面用C++在看,乱码是OD的问题
现在确定了[[ecx+0x148]+0x10]+0x2C 是名字,然后接下来再找ecx的基址,如下图ecx的值来自于esi,ecx的基址找不到,下图红框位置是函数的头部,在下图红框位置使用[[esi+0x148]+0x10]+0x2C公式得到的结果永远都是当前角色的名字
在下图红框位置打断点可以得到当前角色名字和附近npc的名字,基址找不到,这次就算完了
然后是跳出递归循环的方法
首先来到递归循环,递归循环的特点就是会多次执行一样的代码,如下图来到会被多次执行的递归代码里
栈里会有返回到,如下图红框,通过返回到来跳出递归循环
右击选择反汇编窗口跟随,返回之前记得取消断点
然后就会来到下图位置,然后在下图红框位置打断点,继续看它的返回到,
继续返回到
然后回来到下图位置,然后继续返回到
然后回来到下图位置,下图位置就不会被重复执行了,这就算是跳出了循环,下图里的基址没法用,它们的数据很乱不好用,然后下一次通过其它方式去找附近npc