欢迎光临散文网 会员登陆 & 注册

战士刀刀烈火的实现

2022-11-19 11:24 作者:螺丝刀_汗颜  | 我要投稿

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
originalcode:
call gamesvr.exe+96EB0
push 0
push pkg
mov ecx,esi
call gamesvr.exe+77020
exit:
jmp returnhere

pkg:
db 24 00 00 00 E9 03 00 00 00 00 00 00 20 00 00 00 08 00 00 00 13 00 0A 00 06 00 07 00 00 00 00 00 00 00 00 00

"gamesvr.exe"+96381:
jmp newmem
returnhere:

gamesvr.exe+770CC:
nop 2
"gamesvr.exe"+770EA:
jmp gamesvr.exe+7715D


"gamesvr.exe"+77167:
jmp gamesvr.exe+77190

"gamesvr.exe"+771A2:
jmp gamesvr.exe+771A8

"gamesvr.exe"+7746A:
nop 6


"gamesvr.exe"+77665: //烈火CD限制1
nop 6

"gamesvr.exe"+76E72: //烈火CD限制2
jmp gamesvr.exe+76E86

[DISABLE]
dealloc(newmem)
"gamesvr.exe"+96381:
call gamesvr.exe+96EB0
//Alt: db E8 2A 0B 00 00

"gamesvr.exe"+770EA:
jae gamesvr.exe+7715D
call gamesvr.exe+8D680
//Alt: db 73 71 E8 8F 65 01 00

"gamesvr.exe"+77167:
jae gamesvr.exe+77190
mov eax,ecx
sub eax,[edi+000043E8]
//Alt: db 73 27 8B C1 2B 87 E8 43 00 00

"gamesvr.exe"+771A2:
je gamesvr.exe+771A8
cmp ecx,eax
jb gamesvr.exe+77156
//Alt: db 74 04 3B C8 72 AE

"gamesvr.exe"+7746A:
je gamesvr.exe+77156
//Alt: db 0F 84 E6 FC FF FF

"gamesvr.exe"+77665:
je gamesvr.exe+7A562

"gamesvr.exe"+76E72:
jae gamesvr.exe+76E86
push gamesvr.exe+19D1E0
//Alt: db 73 12 68 E0 D1 4A 00

gamesvr.exe+770CC:
nop 2
jne gamesvr.exe+770D7


上面是一个综合的测试脚本,能实现99叠加版战士刀刀自动烈火。我以前只做过按技能键即能放烈火,这种自动烈火是第一次尝试。只因有M友(游戏修改爱好者)说,要客户端改烈火效果才可以,我想不能是这样吧,后面就尝试,弄出了这个脚本。

过程不多说了,就是反复下断追踪代码,多开追踪器,比较哪里跳过去,就暴力改之。后面一长串地址改跳转,均是处理技能或烈火CD的,因为大多跳转也是其它技能所共用的,我也没深入去做测试,所以本脚本只能说是测试用的,真正拿来玩游戏,可没保障。

另1个,自定义代码注入地址是处理C端”砍“动作数据包之后,这个函数也是共用函数,还包括处理人物移动等等,所以也是正常游戏不可靠的原因之二。

总之,大家以学习心态来测试吧。

我这里只着重说一下自定义代码。

call gamesvr.exe+96EB0   

这是原代码,没什么说的,就是处理C端有关移动或物理砍怪、挖肉之类的动作申请。

push 0
push pkg               // C端发过来的指令
mov ecx,esi           // 人物地址
call gamesvr.exe+77020

gamesvr.exe+77020  这个call 是游戏处理技能施放的

第2个参数: 是申请放技能的时间戳(时间点),为0时,服务器则取系统当前的时间戳。

时间戳不是我们常用的多少分多少秒,而是以支行程序的电脑为准备,就是每台电脑在通电后,Cpu就产生一条运行的时间线,在这”时间线“上的一个点,就是时间戳,两点时间戳就能计算出具体时长,单位是毫秒,比如判断传送间隔15秒  cmp eax,#15000。

第1参数: 是C端发过来的数据包,已解密,大家可以仿照着自定义数据包,也可以下断后再放技能,自己通过寄存器或堆栈浏览相应地址以复制数据。上面代码是客户端申请放烈火的指令,所有请求或动作,包括移动,使用物品等等,都是先向服务器发送指令申请,服务器处理有效申请后,又回馈给C端,然后C端又处理这回馈的数据包,加以修正。比如玩联机,你网络不好,跑图时经常就会向走瞬移回去,这就是数据不匹配,给强行修正了,这数据是以服务器上的为准的。

24 00 00 00 E9 03 00 00 00 00 00 00 20 00 00 00 08 00 00 00 13 00 0A 00 06 00 07 00 00 00 00 00 00 00 00 00

分析指令包,熟悉了可以自己依着偏移构建:

24   =  数据包总长度  24 byte   记住包含 ”24“ 这个 第1个字节。

E9 03  =  指令类别       这个就是放技能

20       =   人物 tag      类似物品tag, 是全服务器区分”物体“的标志。 

不知道tag含义的,可以去群里看看基础教程视频。

08       =   指令小类别,  我没记那么多,有兴趣自己试

13       = 人物横坐标

0A       =  人物纵坐标

06        = 技能编号

07       =  人物的朝向      取值范围是 0-7  共8个方向

战士刀刀烈火的实现的评论 (共 条)

分享到微博请遵守国家法律