游戏环境:
热血江湖
WIN 7专业版 x64
效果图
原理:
游戏内,角色之所以不能穿过建筑物模型,是因为在游戏代码内,存在对障碍物的检测,如角色行进到某一处,向前的坐标可能是标识为障碍物,当角色被触发前进的操作,会先执行对前方障碍物的判断的函数,当前方是障碍物时,角色不执行前行的操作,而对玩家而言,就是操作角色在障碍物前卡住不前。所以对穿墙的实现,可以将游戏内对障碍物的判断nop 掉或者让它总是返回无障碍状态。
思路:
1、角色可以移动时,会对目的地坐标进行改写和访问
2、角色可以移动时,会对当前坐标进行改写和访问
相关基址:
角色基址:Client.exe+3E80BA0
目的地X 坐标:[[Client.exe+3E80BA0]+2420]
当前X坐标:(float)[[Client.exe+80BFFC] + 30]
·注:以上地址仅作为测试使用,临时分析得出
开始分析:
1、充目的地坐标入手,对该地址进行访问查看
整理得出:
在角色移动这个过程中,之前也大致猜测,流程可能是先进行障碍物的判断,在对角色进行操作,这个流程,处理操作可能有:
执行对障碍物判断的CALL----> 根据结果计算路径----> 将坐标传到FPU(坐标一般为浮点型数据) ----> 将坐标结构地址传递到寄存器(或栈) ----> 操作角色移动并同步服务器数据
所以一般这个过程靠前或许距离目标比较接近,在上面的访问代码中,正好有一段代码是对FPU 传递浮点数据005D8C42 - D9 06 - fld dword ptr [esi] <<
所以,尝试在此处作为入口点
打开xdbg 32,并且附加游戏:
在这里,可能存在一段代码,是对角色前方障碍物的判断,既然有判断,那么应该会有一段判断的指令,如cmp、test 等,判断之前,可能是执行了判断前方是否有障碍物的CALL,所以可能存在如下形式代码:
注:这里可以使用x32 dbg 的流程图查看,比较直观的看到在哪些位置存在判断和跳转
向下查看代码,发现一处代码类似上面的结构
在此处进行条件断点(eax != 1) 发现没断下来,估计这里可能只返回1,数值2应该是一个错误数值,在这里进行校正,进入到CALL 内部观察
同样,找一下有没有上面结构的代码段:
而此处的CALL <client.sub_5D5E20>
对其进行下段
发现当角色前方存在障碍物时,返回值eax != 0,当前方没有障碍物时,返回的值是0,角色前移
所以,找一个CALL 是对障碍物的判断的可能性比较大,进入到<client.sub_5D5E20> 内部,尝试修改返回值:
或者也可以做以下修改:
这里推荐使用第一种方式修改,因为该函数在很多地方都进行了调用,修改返回值是比较高效率的改法
但修改后,并不能实现穿墙,但是可以实现坐标在障碍物上点击(之前点击是没有光标的)
修改后,出现光标:
虽然没有实现穿墙,但是找到了障碍物判断的函数,总结:
没实现穿墙的原因大概率是因为除了障碍物的判断函数以外,还有类似功能的代码,对游戏角色行进的位置进行校正。
并且也发现,当游戏角色可以移动时,当前坐标才会发生改变,当遇到障碍物时,这些代码是不会被调用的,所以从这个思路进行切入,查看改变了当前坐标的代码:
上面是对当前坐标进行访问的代码段,其中代码段1和代码段2是在角色移动开始和结束进行修改,代码段3是在角色移动过程中修改当前坐标,而代码段4是在角色移动结束后调用,所以,可以使用前面3个作为分析的切入点:
经过分析,发现代码段1和代码段2在下段点后都会一秒断下,说明在其他地方也在调用,这里我没继续分析下去,而是使用代码段3作为入口点:
同样,此处代码是在游戏角色前方没有障碍物时才会被执行到,所以可以猜测在这段代码前面的部分或者上层应该存在上述代码结构,对障碍进行判断,当没障碍时执行到该部分。使用流程图查看代码执行流程:
在此处断点,发现在前进时CALL client.sub_5F3D80
返回值总是为1,猜测可能是1标识可以前行,0、2、3标识不能前行或错误数值,所以进入call 内部,修改返回值,让call 始终返回1
再次点击角色,发现实现穿墙:附上截图:卡在墙内的我
参考:郁金香老师教程
http://www.yjxsoft.com/forum.php?mod=viewthread&tid=3552&highlight=%E7%A9%BF%E5%A2%99
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!