0x0前言:
在角色对战类中,拾取怪物掉落的装备是一项必备的工作,由于装备位置掉落的不确定性,玩家想要拾取离角色距离较远的装备需要一定的时间,这一段时间往往会影响游戏的评分或是玩家的心态,基于此,全屏捡物诞生了,通过作弊手段将一段时间节省了下来。
0x1正文:
实现全屏捡物一般来说有两种方式,一种是改变自身可捡物的范围,另一种就是改变物品的坐标,把物品吸到可以拾取的范围里,我很早之前看到一份DNF的源码就是用第二种方法实现的,本文就用第一种方法实现这个功能。
首先,要这个捡物的范围,肯定是在捡物CALL附近的,所以最先要找的是捡物的代码,由于示例不是网络游戏,不能通过在发包处下断回溯去找,那么只能通过捡物这个过程去找到他的代码,可以是访问物品ID等等,这里就用一个简单的搜索地面物品数量来解决问题。
然后减少一个搜一次
访问后拾取
就得到了相应的地址,打开OD,下断,再去打一个物品然后拾取
段下后在上几层CALL下断
运行后发现
到这个CALL才不会断下,且从上方字符串可以看出这里应该是捡物代码段
尝试在地面没有物品的情况下捡物,发现这里并不断下来,说明上面有相关的判断
通过下断尝试 发现006BC414是在捡物动作触发后最先到达的地址
上面是一个switch-case语句在汇编中的表示,当eax=3是就跳转到捡物部分
一直F8往下运行,发现经过两个跳转来到了return处
因为此时地面是没有物品的,所以就直接return了
回过头去看发现是这个jle起了判断作用,jle是不大于跳转,上面cmp比较的是eax和ebx的值,也就是说当eax小于等于ebx的时候捡物就不继续进行了
地面没有物品的时候eax是0,ebx也是0,上面我们可以看到eax被作为006BC43F的一个参数,那么后面cmp的eax的值就是这个call 的返回值,不难猜到这个call 的作用就是返回在拾取范围内地面物品的数量,
作为有这么一个功能的call他的参数里面很有可能包括拾取的范围,进入该call
Add esp,0x10 说明该cal有4个参数
可以直接看到的参数是3个,还有一个隐藏的参数是esi的值,因为esi储存的浮点型,它通过fild 和fstp dword ptr [esp]将它压人栈中
经调试发现这个esi的值一直是
尝试修改成10000后发现超出范围的物品已经能拾取了,说明这个地址就是一个存放拾取范围的地址,由于它不是一个基址,可以HOOK或者找到它的基址方便下一次的修改。
0x2总结:
在分析的过程中,需要根据已知的条件做出一些合理的猜测和判断,最终实现所需要的功能。