吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2115|回复: 11
收起左侧

[讨论] 记一次蛋疼的"破"私服u3d的协议提取

  [复制链接]
人渣29 发表于 2022-11-29 21:29
本帖最后由 人渣29 于 2022-12-3 12:07 编辑

初衷

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

行动

抓包方案

其实我从来没有进行过游戏的破解,但是我对网络相对比较熟悉,直接使用了wireshark进行了抓包,非常笨的在16进制包中,分析协议报文,根据游戏中界面的数值,猜测16进制数据各自代表什么含义,记录一下比较重要的一些点:

  • 小端传输
  • 头4字节是数据长度(处理粘包)
  • 后8字节是报文id标识

逆向方案

想了想主要步骤,其实还是因为自己没有弄过逆向,所以走了很多弯路,总体还是比较简单的

开始
  1. 查看Assembly-CSharp.dll文件,windows端使用dnspy,macOS端使用ilspy
  2. 通过关键字查找cBundle.u3d文件,发现了很有意思的函数,用于解密操作,后续会用到,加密的方法也比较简单,使用的是异或加密![]()
  3. 通过AssetStudio文件提取cBundle.u3d中的lua脚本(这个地方有点蛋疼,因为这个文件只支持windows,我还专门找同事借用了一下Windows……如果有macOS上好用的软件,麻烦告知一下),发现拿到的lua脚本都是加密过的,根本无法读,于是使用上面的解密函数尝试操作,进行异或解密![]()![]()
  4. 至此其实已经没有什么特殊的东西能够阻止解析真实报文了,不过随便找了一个报文结构体看了下,发现了一个很蛋疼的事情,有一个地方,明明应该是读i8的,但是lua里面缺是readInt16(),能够发现这个问题,主要还是因为我之前硬着头皮追了tcp包的原因,后来查找了一下readInt16(),发现作者修改了这个函数的实现,最终真正的作用就是读了一个i8出来,不知道这么做的具体原因……

    22-12-03更新

  5. 回答一下我自己遇到的readInt16问题,后来通过查阅资料,发现对方其实使用的是varint+zig_zag的编码格式,这个地方也很有意思,我在lua源码中看到了protobuf的支持,但是又没发现引用的地方,不知道是不是本身使用了protobuf,但是因为u3d的一些限制又取消了
  6. 关于这就完了,因为我自己本身是做程序开发的,所以到这一步本身对于我来说,就是进行源码翻译工作了
  7. 关于GM/刷装备 相关,关于这套源码中,我确实看到了一些给gm预留的接口,不过还没进行进一步的调研,不过我觉得如果gm的话,不如淘宝随便买个服自己瞎改改玩呢

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

skyfire1945 发表于 2022-11-30 17:35
加油~~,,在看了~~就是没看懂
ClearLover 发表于 2022-11-30 18:38
q-147483 发表于 2022-11-30 20:04
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
淘宝买个自己改改
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-23 04:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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