发布于:2018-6-25 15:19 | 1670691次阅读 作者: 外部投稿 | 原作者: LukaFu
一.准备工作
PS:老早之前调试的时候还需要恢复OBJ钩子,否则无图标,打开不了进程。现在都不需要了:-) 三.人物坐标寻找以及穿墙实现 1.人物坐标的寻找 1.1)进入训练场CE搜索未知的数值,然后往前走一步,搜索变大的数值,往后退一步搜变小的数值。搜来搜去发现还剩几千个怎么办,全部移下来,然后选中一小片改小一点,如果人物位置没有 改变,那就可以删掉了。因为我们是在竖直方向运动搜索,姑且把这个叫做人物Y坐标吧。 1.2).同样的原理,我们搜人物Y坐标。首先未知的值搜一下,往左走一步搜变大的值,往右走一步搜变小的值。然后跟之前一样,移下来改小一点,确定人物X坐标。 1.3).坐标找到了后我们随便修改就可以实现瞬移了,发现只能瞬移半场。但是篮球场要打就要打全场对不对,游戏把我们限制在一个半场里。打得就不舒服,下面我们开始实现穿墙。 PS:修改数据的时候,可能会发现视角会动一下,因为你走动的时候相机位也改变了,有兴趣的可以自己研究一下相机位地址:-) 2.实现穿墙 2.1).当你往边界走的时候,为了把你限制在半场内,肯定会有个函数进行判断,然后修正你的坐标。那么我们往边界走的时候可以看看是那个函数修改了我们的坐标。 右击人物Y坐标,选择是什么写入了这个地址。发现有一个地址是不停写入的,这个我们不管。然后往边界走,这时候出现了第二个地址,你没走一次,他就会往人物Y坐标写入数据 那我们跟进3451658C这个地址看一下他是怎么实现的。右键数据,浏览内存区域,Ctrl+G,跳转到3451658C。 2.1)下面分析一下这边的逻辑实现 主要看这几句: fld dword ptr [ebp+0C] fld st(0) fadd dword ptr [eax+38] fstp dword ptr [eax+38] 下面我们来分析一下这几条汇编的意思: ebp+0C地址保存的值我认为是修正值,fld将ebp+0C地址里面的浮点数据压入堆栈st(0)。(浮点运算(FPU)的处理器有8个寄存器,分别为ST0~ST7) fld st(0)意思是把堆栈寄存器ST(0)的值再压进栈。而之前压入的值被放进st(1)。 fadd dword ptr [eax+38]意思是把地址eax+38的值(人物Y坐标值)跟st(0)相加在保存到st(0)。 fstp dword ptr [eax+38]意思是将st(0)的数据保存到eax+38的地址里面,然后再弹出st(0) 理解了这几条语句那我们就可以开始修改了那么我们只要修改把修正值改为0,就可以了,让它还是传回当前的坐标就行了。 FLDZ '把0压入 fld st(0) fadd dword ptr [eax+38] fstp dword ptr [eax+38] 然后我们返回游戏看一下,Y方向的能不能穿墙了。发现可以穿墙,可以上沙滩上打球了。 2.1)人物X坐标上也是同理,汇编代码在Y坐标上面一点,下面我主要分析一下 fld dword ptr [eax+30] 'X坐标值压入堆栈 mov esi,[edi+14] fld dword ptr [ebp+08] '纠正值压入堆栈 add esi,000000A0 fld st(0) '复制st(0)值,并压入堆栈 faddp st(2),st(0) 'st(2)=st(2)+st(0),并弹出st(0) fxch st(1) 'st(1)跟st(0)交换 fstp dword ptr [eax+30] '将st(0)值保存到eax+30也就是X坐标地址里面,然后弹出 修改也是同样道理直接把纠正值改成0就行了,第一局改成FLDZ 。然后发现左边绿地也能进去了。 至此我们完成了修改。可以全场打球了! 四.后续 当我们在场外投篮的时候发现,人物会瞬移到场内,说明此处还有一个投篮坐标的判断,我们来修改一下。同样的道理选择一个坐标,选择是什么写入了这个地址。然后再场外头一个球。 观察向此地址写入的地址,发现一个地址瞬移完就不写入了,那么很可能就是这个地址。我么来这个地址看一下。 经过之前的修改,相信已经轻车熟路了,看到eax+30和eax+38这两个地址。我么直接将fld和fstp关于这两个值的地方全部NOP掉,就可以全场穿墙投篮啦。 五.总结 以上修改是在训练场做的,在联网对战中修改是无效的,会直接退出游戏,比赛不记录(这也是市面上2K中断挂的原理,当然只要是涉及联网判断的数据都会中断)。 文章转载至吾爱破解-LukaFu GSLAB网站转载文章仅代表作者本人的观点,与本网站立场无关。 *转载请注明来自游戏安全实验室(GSLAB.QQ.COM)
|
最新评论
发表评论