人渣29 发表于 2022-11-29 21:29

记一次蛋疼的"破"私服u3d的协议提取

本帖最后由 人渣29 于 2022-12-3 12:07 编辑

## 初衷
因为是一个简单怀旧的回合网游,但是这个私服把游戏客户端搞的非常吃性能,明明零几年的时候,一台pc轻松十几开的游戏,现在的电脑开4个风扇就嗷嗷叫了(可能也和我intel mac + 虚拟机)有关,于是萌生了自己写个脱机的想法

## 行动
### 抓包方案
其实我从来没有进行过游戏的破解,但是我对网络相对比较熟悉,直接使用了wireshark进行了抓包,非常笨的在16进制包中,分析协议报文,根据游戏中界面的数值,猜测16进制数据各自代表什么含义,记录一下比较重要的一些点:
* 小端传输
* 头4字节是数据长度(处理粘包)
* 后8字节是报文id标识

### 逆向方案
想了想主要步骤,其实还是因为自己没有弄过逆向,所以走了很多弯路,总体还是比较简单的
#### 开始
1. 查看`Assembly-CSharp.dll `文件,windows端使用(https://github.com/dnSpy/dnSpy),macOS端使用(https://github.com/icsharpcode/AvaloniaILSpy)
2. 通过关键字查找`cBundle.u3d`文件,发现了很有意思的函数,用于解密操作,后续会用到,加密的方法也比较简单,使用的是异或加密![]()
3. 通过(https://github.com/Perfare/AssetStudio)文件提取`cBundle.u3d`中的lua脚本(这个地方有点蛋疼,因为这个文件只支持windows,我还专门找同事借用了一下Windows……如果有macOS上好用的软件,麻烦告知一下),发现拿到的lua脚本都是加密过的,根本无法读,于是使用上面的解密函数尝试操作,进行异或解密![]()![]()
4. 至此其实已经没有什么特殊的东西能够阻止解析真实报文了,不过随便找了一个报文结构体看了下,发现了一个很蛋疼的事情,有一个地方,明明应该是读i8的,但是lua里面缺是`readInt16()`,能够发现这个问题,主要还是因为我之前硬着头皮追了tcp包的原因,后来查找了一下`readInt16()`,发现作者修改了这个函数的实现,最终真正的作用就是读了一个i8出来,不知道这么做的具体原因……
## 22-12-03更新
1. 回答一下我自己遇到的readInt16问题,后来通过查阅资料,发现对方其实使用的是varint+zig_zag的编码格式,这个地方也很有意思,我在lua源码中看到了protobuf的支持,但是又没发现引用的地方,不知道是不是本身使用了protobuf,但是因为u3d的一些限制又取消了
2. 关于`这就完了`,因为我自己本身是做程序开发的,所以到这一步本身对于我来说,就是进行源码翻译工作了
3. 关于`GM`/`刷装备` 相关,关于这套源码中,我确实看到了一些给gm预留的接口,不过还没进行进一步的调研,不过我觉得如果gm的话,不如淘宝随便买个服自己瞎改改玩呢

skyfire1945 发表于 2022-11-30 17:35

加油~~,,在看了~~就是没看懂

ClearLover 发表于 2022-11-30 18:38

?????就完了???

q-147483 发表于 2022-11-30 20:04

{:1_889:} 老哥私服存在刷装备这类技术么

heiyue003 发表于 2022-12-1 08:05

私服刷个GM权限,给自己刷装备哈

张三土 发表于 2022-12-1 09:12

前排观摩学习学习

huangjiloqw 发表于 2022-12-1 13:02

厉害了,有想法,能做到,很不错

jilonghao 发表于 2022-12-1 23:12

我也来学习了,继续……大神

lfordch 发表于 2022-12-3 02:05

感谢分享,学习一下思路

runfog 发表于 2022-12-4 20:32

淘宝买个自己改改
页: [1] 2
查看完整版本: 记一次蛋疼的"破"私服u3d的协议提取