[游戏安全]【原创】CE实现对《NBA2kOnline》游戏人物的穿墙

2025-05-03 13:47:28

本帖最后由 LukaFu 于 2018-4-15 23:20 编辑

前言:来论坛有一些时间了,没发过什么帖子。最近看了论坛里Ganlv大神的CE教程,拿一个我以前“搞过”的游戏进行一些趣味修改,主要实现人物的穿墙功能,下面开始我们教程。

一.准备工作

操作系统:Windows 10 企业版 1024

游戏:NBA2kOnline

工具:CE6.4,PChunterx64

二.过CE非法及反调试

1.打开PChunterx64选中游戏右键结束掉TenSLX.dll的三个线程。

TIM截图20180415195508.png (22.8 KB, 下载次数: 3)

下载附件

2018-4-15 19:55 上传

2.打开CE-设置-调试器选项-Debugget method,选择VEH调试器。VEH调试器是注入DLL到要调试的进程,一般TX游戏都会对这个地方进行HOOK。我们打开PChunterx64对NBA2KOL进程钩子进行

扫描。发现了这个 ntdll.dll->LdrInitializeThunk,右键恢复它就行了。

(说明:Windows 的 DLL 装入(除 ntdll.dll 外)和连接是通过 ntdll.dll 中的一个函数LdrInitializeThunk()实现的.)

TIM截图20180414180230.png (31.64 KB, 下载次数: 1)

下载附件

2018-4-15 20:09 上传

PS:老早之前调试的时候还需要恢复OBJ钩子,否则无图标,打开不了进程。现在都不需要了:-)

三.人物坐标寻找以及穿墙实现

1.人物坐标的寻找

1.1)进入训练场CE搜索未知的数值,然后往前走一步,搜索变大的数值,往后退一步搜变小的数值。搜来搜去发现还剩几千个怎么办,全部移下来,然后选中一小片改小一点,如果人物位置没有

改变,那就可以删掉了。因为我们是在竖直方向运动搜索,姑且把这个叫做人物Y坐标吧。

TIM截图20180415202003.png (26.09 KB, 下载次数: 2)

下载附件

2018-4-15 20:20 上传

1.2).同样的原理,我们搜人物Y坐标。首先未知的值搜一下,往左走一步搜变大的值,往右走一步搜变小的值。然后跟之前一样,移下来改小一点,确定人物X坐标。

TIM截图20180415204226.png (8.55 KB, 下载次数: 2)

下载附件

2018-4-15 20:42 上传

1.3).坐标找到了后我们随便修改就可以实现瞬移了,发现只能瞬移半场。但是篮球场要打就要打全场对不对,游戏把我们限制在一个半场里。打得就不舒服,下面我们开始实现穿墙。

PS:修改数据的时候,可能会发现视角会动一下,因为你走动的时候相机位也改变了,有兴趣的可以自己研究一下相机位地址:-)

2.实现穿墙

2.1).当你往边界走的时候,为了把你限制在半场内,肯定会有个函数进行判断,然后修正你的坐标。那么我们往边界走的时候可以看看是那个函数修改了我们的坐标。

右击人物Y坐标,选择是什么写入了这个地址。发现有一个地址是不停写入的,这个我们不管。然后往边界走,这时候出现了第二个地址,你没走一次,他就会往人物Y坐标写入数据

TIM截图20180415205705.png (25.04 KB, 下载次数: 1)

下载附件

2018-4-15 20:57 上传

那我们跟进3451658C这个地址看一下他是怎么实现的。右键数据,浏览内存区域,Ctrl+G,跳转到3451658C。

2.1)下面分析一下这边的逻辑实现

TIM截图20180415210230.png (23.76 KB, 下载次数: 1)

下载附件

2018-4-15 21:02 上传

主要看这几句:

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方向的能不能穿墙了。发现可以穿墙,可以上沙滩上打球了。

TIM截图20180415212344.png (511.27 KB, 下载次数: 1)

下载附件

2018-4-15 21:24 上传

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 。然后发现左边绿地也能进去了。

TIM截图20180415213757.png (450.15 KB, 下载次数: 1)

下载附件

2018-4-15 21:37 上传

至此我们完成了修改。可以全场打球了!

四.后续

当我们在场外投篮的时候发现,人物会瞬移到场内,说明此处还有一个投篮坐标的判断,我们来修改一下。同样的道理选择一个坐标,选择是什么写入了这个地址。然后再场外头一个球。

观察向此地址写入的地址,发现一个地址瞬移完就不写入了,那么很可能就是这个地址。我么来这个地址看一下。

TIM截图20180415214430.png (20.78 KB, 下载次数: 2)

下载附件

2018-4-15 21:46 上传

经过之前的修改,相信已经轻车熟路了,看到eax+30和eax+38这两个地址。我么直接将fld和fstp关于这两个值的地方全部NOP掉,就可以全场穿墙投篮啦。

五.总结

以上修改是在训练场做的,在联网对战中修改是无效的,会直接退出游戏,比赛不记录(这也是市面上2K中断挂的原理,当然只要是涉及联网判断的数据都会中断)。

还有巅峰赛的一些数据的搜索教程,我可能会下次发出来吧,第一次发帖感觉蛮累的,感谢大家!