本帖最后由 人渣29 于 2022-12-3 12:07 编辑
初衷
因为是一个简单怀旧的回合网游,但是这个私服把游戏客户端搞的非常吃性能,明明零几年的时候,一台pc轻松十几开的游戏,现在的电脑开4个风扇就嗷嗷叫了(可能也和我intel mac + 虚拟机)有关,于是萌生了自己写个脱机的想法
行动
抓包方案
其实我从来没有进行过游戏的破解,但是我对网络相对比较熟悉,直接使用了wireshark进行了抓包,非常笨的在16进制包中,分析协议报文,根据游戏中界面的数值,猜测16进制数据各自代表什么含义,记录一下比较重要的一些点:
- 小端传输
- 头4字节是数据长度(处理粘包)
- 后8字节是报文id标识
逆向方案
想了想主要步骤,其实还是因为自己没有弄过逆向,所以走了很多弯路,总体还是比较简单的
开始
- 查看
Assembly-CSharp.dll 文件,windows端使用dnspy,macOS端使用ilspy
- 通过关键字查找
cBundle.u3d 文件,发现了很有意思的函数,用于解密操作,后续会用到,加密的方法也比较简单,使用的是异或加密![]()
- 通过AssetStudio文件提取
cBundle.u3d 中的lua脚本(这个地方有点蛋疼,因为这个文件只支持windows,我还专门找同事借用了一下Windows……如果有macOS上好用的软件,麻烦告知一下),发现拿到的lua脚本都是加密过的,根本无法读,于是使用上面的解密函数尝试操作,进行异或解密![]()![]()
- 至此其实已经没有什么特殊的东西能够阻止解析真实报文了,不过随便找了一个报文结构体看了下,发现了一个很蛋疼的事情,有一个地方,明明应该是读i8的,但是lua里面缺是
readInt16() ,能够发现这个问题,主要还是因为我之前硬着头皮追了tcp包的原因,后来查找了一下readInt16() ,发现作者修改了这个函数的实现,最终真正的作用就是读了一个i8出来,不知道这么做的具体原因……
22-12-03更新
- 回答一下我自己遇到的readInt16问题,后来通过查阅资料,发现对方其实使用的是varint+zig_zag的编码格式,这个地方也很有意思,我在lua源码中看到了protobuf的支持,但是又没发现引用的地方,不知道是不是本身使用了protobuf,但是因为u3d的一些限制又取消了
- 关于
这就完了 ,因为我自己本身是做程序开发的,所以到这一步本身对于我来说,就是进行源码翻译工作了
- 关于
GM /刷装备 相关,关于这套源码中,我确实看到了一些给gm预留的接口,不过还没进行进一步的调研,不过我觉得如果gm的话,不如淘宝随便买个服自己瞎改改玩呢
|