吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 40015|回复: 42
收起左侧

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

  [复制链接]
LukaFu 发表于 2018-4-15 21:56
本帖最后由 LukaFu 于 2018-4-15 23:20 编辑

前言:来论坛有一些时间了,没发过什么帖子。最近看了论坛里Ganlv大神的CE教程,拿一个我以前“搞过”的游戏进行一些趣味修改,主要实现人物的穿墙功能,下面开始我们教程。
一.准备工作
操作系统:Windows 10 企业版 1024
游戏:NBA2kOnline
工具:CE6.4,PChunterx64
二.过CE非法及反调试
1.打开PChunterx64选中游戏右键结束掉TenSLX.dll的三个线程。
TIM截图20180415195508.png


2.打开CE-设置-调试器选项-Debugget method,选择VEH调试器。VEH调试器是注入DLL到要调试的进程,一般TX游戏都会对这个地方进行HOOK。我们打开PChunterx64对NBA2KOL进程钩子进行
扫描。发现了这个 ntdll.dll->LdrInitializeThunk,右键恢复它就行了。
(说明:Windows 的 DLL 装入(除 ntdll.dll 外)和连接是通过 ntdll.dll 中的一个函数LdrInitializeThunk()实现的.)
TIM截图20180414180230.png

PS:老早之前调试的时候还需要恢复OBJ钩子,否则无图标,打开不了进程。现在都不需要了:-)
三.人物坐标寻找以及穿墙实现
1.人物坐标的寻找
1.1)进入训练场CE搜索未知的数值,然后往前走一步,搜索变大的数值,往后退一步搜变小的数值。搜来搜去发现还剩几千个怎么办,全部移下来,然后选中一小片改小一点,如果人物位置没有
改变,那就可以删掉了。因为我们是在竖直方向运动搜索,姑且把这个叫做人物Y坐标吧。
TIM截图20180415202003.png
1.2).同样的原理,我们搜人物Y坐标。首先未知的值搜一下,往左走一步搜变大的值,往右走一步搜变小的值。然后跟之前一样,移下来改小一点,确定人物X坐标。
TIM截图20180415204226.png
1.3).坐标找到了后我们随便修改就可以实现瞬移了,发现只能瞬移半场。但是篮球场要打就要打全场对不对,游戏把我们限制在一个半场里。打得就不舒服,下面我们开始实现穿墙。

PS:修改数据的时候,可能会发现视角会动一下,因为你走动的时候相机位也改变了,有兴趣的可以自己研究一下相机位地址:-)
2.实现穿墙
2.1).当你往边界走的时候,为了把你限制在半场内,肯定会有个函数进行判断,然后修正你的坐标。那么我们往边界走的时候可以看看是那个函数修改了我们的坐标。
右击人物Y坐标,选择是什么写入了这个地址。发现有一个地址是不停写入的,这个我们不管。然后往边界走,这时候出现了第二个地址,你没走一次,他就会往人物Y坐标写入数据
TIM截图20180415205705.png
那我们跟进3451658C这个地址看一下他是怎么实现的。右键数据,浏览内存区域,Ctrl+G,跳转到3451658C。

2.1)下面分析一下这边的逻辑实现
TIM截图20180415210230.png

主要看这几句:
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
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

至此我们完成了修改。可以全场打球了!
四.后续
当我们在场外投篮的时候发现,人物会瞬移到场内,说明此处还有一个投篮坐标的判断,我们来修改一下。同样的道理选择一个坐标,选择是什么写入了这个地址。然后再场外头一个球。
观察向此地址写入的地址,发现一个地址瞬移完就不写入了,那么很可能就是这个地址。我么来这个地址看一下。
TIM截图20180415214430.png
经过之前的修改,相信已经轻车熟路了,看到eax+30和eax+38这两个地址。我么直接将fld和fstp关于这两个值的地方全部NOP掉,就可以全场穿墙投篮啦。


五.总结
以上修改是在训练场做的,在联网对战中修改是无效的,会直接退出游戏,比赛不记录(这也是市面上2K中断挂的原理,当然只要是涉及联网判断的数据都会中断)。
还有巅峰赛的一些数据的搜索教程,我可能会下次发出来吧,第一次发帖感觉蛮累的,感谢大家!

免费评分

参与人数 17威望 +1 吾爱币 +26 热心值 +15 收起 理由
qidians + 1 + 1 热心回复!
L4Nce + 1 + 10 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qaz003 + 1 + 1 谢谢@Thanks!
chenjingyes + 1 + 1 谢谢楼主分享游戏安全的文章
Ganlv + 1 用心讨论,共获提升!
一叶知秋G + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
小俊 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
c66d88 + 1 + 1 虽然看不懂,但是好像你还是第一个分享穿增的教程,支持
cominghome + 1 + 1 热心回复!
whm630987633 + 1 + 1 我很赞同!
简单メ传说 + 1 + 1 谢谢@Thanks!
灯火阑珊=zero + 1 + 1 热心回复!
wadsq1081 + 1 + 1 我很赞同!
65302666 + 2 用心讨论,共获提升!
goupiluobo + 1 + 1 用心讨论,共获提升!
yAYa + 1 + 1 用心讨论,共获提升!
gunxsword + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lsrynn 发表于 2018-4-15 22:08
球星能破吗?攒球星好难
小虎 发表于 2018-4-15 23:02
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
wf.FMOD::EventQueueI::setUserData+462FA0 - 55                    - push ebp
wf.FMOD::EventQueueI::setUserData+462FA1 - 8B EC                 - mov ebp,esp
wf.FMOD::EventQueueI::setUserData+462FA3 - 83 E4 F0              - and esp,-10 { 240 }
wf.FMOD::EventQueueI::setUserData+462FA6 - 8B 45 08              - mov eax,[ebp+08]
wf.FMOD::EventQueueI::setUserData+462FA9 - 83 EC 28              - sub esp,28 { 40 }
wf.FMOD::EventQueueI::setUserData+462FAC - 0F28 00               - movaps xmm0,[eax]
wf.FMOD::EventQueueI::setUserData+462FAF - 56                    - push esi
wf.FMOD::EventQueueI::setUserData+462FB0 - 8B F1                 - mov esi,ecx
wf.FMOD::EventQueueI::setUserData+462FB2 - 57                    - push edi
wf.FMOD::EventQueueI::setUserData+462FB3 - 8B 46 08              - mov eax,[esi+08]
wf.FMOD::EventQueueI::setUserData+462FB6 - 0F29 86 D0000000      - movaps [esi+000000D0],xmm0        写入Y坐标的地址,和X坐标,所有NPC都需要调用的地址
wf.FMOD::EventQueueI::setUserData+462FBD - 85 C0                 - test eax,eax
wf.FMOD::EventQueueI::setUserData+462FBF - 74 39                 - je wf.FMOD::EventQueueI::setUserData+462FFA
wf.FMOD::EventQueueI::setUserData+462FC1 - 8B 40 70              - mov eax,[eax+70]
wf.FMOD::EventQueueI::setUserData+462FC4 - 8B 4E 10              - mov ecx,[esi+10]
wf.FMOD::EventQueueI::setUserData+462FC7 - F3 0F10 40 0C         - movss xmm0,[eax+0C]
wf.FMOD::EventQueueI::setUserData+462FCC - F3 0F59 05 18E70002   - mulss xmm0,[wf.FMOD::EventQueueEntryI::setCrossfadeTime+B4E788] { [0.50] }
wf.FMOD::EventQueueI::setUserData+462FD4 - 8B 11                 - mov edx,[ecx]
wf.FMOD::EventQueueI::setUserData+462FD6 - 8D 7C 24 10           - lea edi,[esp+10]
wf.FMOD::EventQueueI::setUserData+462FDA - F3 0F58 45 0C         - addss xmm0,[ebp+0C]
wf.FMOD::EventQueueI::setUserData+462FDF - 57                    - push edi
wf.FMOD::EventQueueI::setUserData+462FE0 - 51                    - push ecx
wf.FMOD::EventQueueI::setUserData+462FE1 - 8D 86 A0000000        - lea eax,[esi+000000A0]
wf.FMOD::EventQueueI::setUserData+462FE7 - F3 0F11 04 24         - movss [esp],xmm0
wf.FMOD::EventQueueI::setUserData+462FEC - 50                    - push eax
wf.FMOD::EventQueueI::setUserData+462FED - FF 52 14              - call dword ptr [edx+14]
wf.FMOD::EventQueueI::setUserData+462FF0 - 8B C7                 - mov eax,edi
wf.FMOD::EventQueueI::setUserData+462FF2 - 50                    - push eax
wf.FMOD::EventQueueI::setUserData+462FF3 - 8B CE                 - mov ecx,esi
wf.FMOD::EventQueueI::setUserData+462FF5 - E8 F6040000           - call wf.FMOD::EventQueueI::setUserData+4634F0
wf.FMOD::EventQueueI::setUserData+462FFA - 5F                    - pop edi
wf.FMOD::EventQueueI::setUserData+462FFB - 5E                    - pop esi
wf.FMOD::EventQueueI::setUserData+462FFC - 8B E5                 - mov esp,ebp
wf.FMOD::EventQueueI::setUserData+462FFE - 5D                    - pop ebp
wf.FMOD::EventQueueI::setUserData+462FFF - C2 0800               - ret 0008 { 8 }


不明白这段代码,也找不到基址,求大神给解释下
820436617 发表于 2018-4-15 22:18
gunxsword 发表于 2018-4-15 22:21
不错,感谢大神分享方法!
 楼主| LukaFu 发表于 2018-4-15 23:01
820436617 发表于 2018-4-15 22:18
巅峰季后赛可以改什么吗

巅峰赛里面的任务,包括篮板,抢断,助攻,三分,命中率,等等。
WoLiDe 发表于 2018-4-16 08:04
CE是个好工具,只不过自己玩玩还可以
123-木头人 发表于 2018-4-16 08:27 来自手机
大佬,能告诉我怎么定位那3个线程吗,就比如《饥荒》,一查找谁改写了地址就闪退,这个应该这么处理啊,直接把饥荒拉进od就不能用ce触发闪退了,这个问题很纠结,求大佬帮忙解决
q6687898 发表于 2018-4-16 09:21
感谢分享
大表叔 发表于 2018-4-16 09:59
有学习了一个技术.感谢楼主
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-11 02:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表