【游戏逆向】腾讯系微信小游戏JceStruct协议分析

admin 2026-04-27 05:12:37 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 该文档分析腾讯系微信小游戏使用的JceStruct协议逆向过程,通过控制台抓包发现业务数据通过WebSocket传输,定位到JCEProtocol对象中的封包函数X0b和解包函数J0b。关键发现包括加密逻辑判断机制(iFlag标志位)和动态密钥加解密流程,并通过修改aiLevel参数实现游戏难度调整的实战操作。 综合评分: 75 文章分类: 逆向分析,移动安全,WEB安全,红队,其他


cover_image

【游戏逆向】腾讯系微信小游戏JceStruct协议分析

原创

挖个洞先 挖个洞先

挖个洞先

2026年4月25日 23:28 北京

在小说阅读器读本章

去阅读

 我们都会做出选择,那些选择会让我们走上某条道路。有时候那些选择看起来很微小,但它们足以让你走上某条道路。你想着离开,但最后你还是会回来。——《风骚律师》S5E09 

01

操作步骤

1、控制台Fetch/XHR看到只有配置文件json和ini,没有看到业务请求

2、小游戏没走http大概率走的是websocket

3、断点进入卡住请求,强制ws触发重连,跟进game.js,

发现n.JCEProtocol关键字

4、JceStruct协议分析文章

https://bbs.kanxue.com/thread-276418.htm

5、n.JCEProtocol对象里定义了封包函数X0b,收包函数J0b

// 封包函数X0b: function(t) {    // 创建JCE输出流    var o = new e.Taf.nr;    // 将业务明文msgBody序列化写入到o    if (t.md.msgBody.writeTo(o),     // 密钥d存在且ag不在ihd列表中进入加密逻辑    d && 0 > h.ihd.indexOf(t.md.Pe.ag)) {        // 提取流中数据并调用ohd加密函数        var n = r.default.ohd(new Uint8Array(o.bc.bc, 0, o.bc.len), d);        // 将加密后的数据重新写回流中        o.bc.vec(n.buffer),        // 1,代表加密        t.iFlag |= 1    // 0,代表不加密    } else t.iFlag = 0;    // 省略    new Uint8Array(o.bc.bc, 0, t)}
// 收包函数J0b: function(t, i) {    // 省略    if (t = new t.va,    // 判断是否存在密钥d,且i.iFlag=1加密的情况,进入解密逻辑    d && 1 == (1 & i.iFlag)) {        var o = new Uint8Array(i.md.yc.byteLength);        // 调用nQb解密函数,结果存入数组o        r.default.nQb(new Uint8Array(i.md.yc.bc, 0, i.md.yc.byteLength), d, o),        o = new e.Taf.Jn(o.buffer) // 将解密后的明文转为输入流    }    // 未加密直接读取流    else o = new e.Taf.Jn(i.md.yc.bc);    try {        // 将流反序列化赋值给实例对象t        t.readFrom(o)    } catch(t) {     // 抛出报错,这里可以作为关键字定位        return t instanceof Error ? e.console.warn("decode body fail,msgID:" + i.md.Pe.ag, t.message) : e.console.warn("decode body fail,msgID:" + i.md.Pe.ag, JSON.stringify(t)),        l.fdk.Mhc("DecodeJceFail"),        i    }    // 触发字典c中注册的命令号对应的回调函数,传入i和t    return c[i.md.Pe.ag] && c[i.md.Pe.ag](i, t),    // 将明文对象挂载到外层信封的msgBody上,在这里断点查看响应    i.md.msgBody = t,    i}

6、X0b在序列化之前断点,修改难度设定,开始挑战

var o = new e.Taf.nr;

7、跟调用堆栈

e && e.XDd(this.aiLevel),

8、修改this.aiLevel=1000,人机难度由入门变成了特级大师


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:挖个洞先 挖个洞先 挖个洞先《【游戏逆向】腾讯系微信小游戏JceStruct协议分析》

评论:0   参与:  0