免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:36.x86游戏实战-C++代码实现锁血
上一个内容里,把游戏修改血量的函数封装到c++里了,本次找周围怪物,本来想通过打怪物,然后触发 0x8174E0也就是修改血量的函数断点去追,发现不好找,有很多vm代码,0x8174E0函数的ecx一直都是玩家角色的地址,CTRL+F9也一直会反倒下图位置
然后换了一张有怪物的地图,发现修改血量的函数ecx的值有变化了,它不止有玩家角色的地址了,还有怪物的地址,之前找的玩家角色名字在偏移0x258位置一般怪物NPC也都会是这个位置,如下图,怪物地址
怪物名字
然后在ecx是怪物的时候按CTRL+F9,返回的位置也不一样了
然后给数据(ecx的数据,把ecx到数据复制一下在内存区CTRL+G跳转过去)下一个硬件访问断点,如下图
然后它来到了下图位置(它可能会断在别的位置,根据现在要找到东西只要附近有下图红框的写法就要敏感起来,因为怪物列表就是个数组,数组到访问算法就是下图红框到写法),下图红框是一个数组访问的算法,这就可能是怪物列表
然后看eax的值
这时call的地址
然后游戏崩溃了下方的地址与上方不一样了,崩溃是正常的,重新再来就好了,所以分析的时候要养成记录的好习惯
然后这个eax一般就会是怪物列表的基址了
接下来找eax的值哪来的,最终发现eax的值来自于esi+10
怎么确认eax的值来自于esi+10的?在下方红框位置打断点
然后按F8,来到下图红框位置观察eax的值与上方红框时的值是否一样,如果一样就说明eax的值来自于esi+10
现在eax的值0x5E227688
然后经过观察esi的值是在函数头部赋值到,函数头部有一句mov esi,ecx,ecx的值来自于上一次,所以esi的值也来自于上一层,然后按CTRL+F9来到下图位置,看到ecx的值又来自于esi,然后记录现在得到的取值算法[esi+10]是怪兽列表
然后经过观察esi的值还是来自于上一层
然后CTRL+F9往上反,来到了下图位置
然后打断点观察ecx寄存器
然后[ecx+10]是怪物列表地址,也就是下图红框是ecx到值也就是0x5E7B5AF0+0x10是怪物地址
ecx的值来自于esi+88,通过观察代码发现esi的值来自于ecx,ecx看着又是来自于上一层,现在怪物列表的计算是[[esi+0x88]+0x10],所以在下图红框位置打断点接着CTRL+F9
然后到了下图位置,现在的怪物列表计算 [[[esi+0x14]+0x88]+0x10]
然后经过观察ecx的值来自于esi,通过观察代码(代码很长往上滑了有一会)esi的值来自ecx,ecx来自于上一层,所以在下图位置打断点,继续CTRL+F9
然后来到了一个更复杂的位置
这里是[[[[0x0B000000+3*4+0xA8]+0x14]+0x88]+0x10]是怪物列表,然后eax的值通过断点看出一直是3是固定的
esi的值好像还是来自于上一层,在下图红框位置打断点,按CTRL+F9
然后到了下图位置,然后这里就又崩溃了
重新启动游戏并用OD进行附加,直接来到0x7554EB位置,再仔细观察一下,然后发现esi的值来自于ebp-0x47C位置
然后再找ebp,然后看到ebp-0x47C的值来自于ecx
然后还是要来到上一层看看ecx在哪来的,然后看到ecx的值来自于eax,eax前面有一个call,大概率eax的值是0x006FC760函数的返回值
进入0x006FC760函数里,进来之后可以看到有很多retn,但是可以看到下图绿框是一个写死的值,如果写死的值不行那在断点看看eax在那个ren返回的,然后在分析,现在把这个值带入公式,看看能不能找到怪物列表,[[[[[0x1A5E258]+3*4+0xA8]+0x14]+0x88]+0x10]
然后在下图红框位置写 dd [[[[[0x1A5E258]+3*4+0xA8]+0x14]+0x88]+0x10],写完之后按回车,如下图
然后会跳到下图的内容,全是内存地址,这是一个数组
然后之前找的玩家角色名是0x258位置,所以先随便找几个数据窗口跟随
然后鼠标双击下图红框位置
然后找0x258,如下图红框,显示的是0
然后再次使用下图红框的功能,换一个数据窗口跟随
这次0x258位置就有数据了
然后鼠标右击选择数据窗口中跟随
然后鼠标右击选择Unicode
然后就有怪物名字了
然后换成Unicode之后怎么改回去?鼠标右击选择地址就可以了
怪物列表基址就找到了,在其它游戏可能不会跟上方一样这么顺利,它可能追着追着就会跟乱,一个值在一个函数中mov来mov去看的眼花,这时可以尝试放弃,可以找一个游戏中只要执行了就有基址的位置(能追到眼花这期间肯定会遇到一个常断的函数并且某个寄存器的值是想要的地址),给hook掉,通过hook的方式来得到基址