战士刀刀烈火的实现
[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个方向