如何从JavaScript重构Protocol Buffer Schema以解码WebSocket二进制消息?
从JavaScript中重构Protocol Buffer Schema的方法
一、从给定onMessage函数中提取的直接线索
你提供的onMessage函数里已经包含不少Protobuf核心信息,可直接整理出基础Schema框架:
- 字段标签与类型:代码中通过
g.tag匹配的HeaderTags枚举对应Protobuf字段标签,结合解析方法能确定字段类型:PID/SID/SeqNu/Request/UserData/UniqueId/ReplyNu/ResponseId:均为int32类型(通过g.int(u)解析)Response:string类型(通过g.string(u)解析)
- 请求/响应枚举:
HeaderRequests(订阅、心跳、登录等请求类型)、HeaderResponses(成功、重启、错误等响应状态)对应Protobuf中的枚举定义
基于以上可写出基础的Protobuf头部Schema:
syntax = "proto3"; enum HeaderTags { End = 0; PID = 1; SID = 2; SeqNu = 3; Request = 4; UserData = 5; UniqueId = 6; ReplyNu = 7; ResponseId = 8; Response = 9; } enum HeaderRequests { Subscribe = 1; Unsubscribe = 2; ChangeSubscriptions = 3; Ping = 4; LoginProvider = 5; StartRealtime = 6; LoginAuthentication = 7; } enum HeaderResponses { Ok = 0; Restart = 1; Error = 2; } message MessageHeader { int32 pid = 1; int32 sid = 2; int32 seq_nu = 3; HeaderRequests request = 4; int32 user_data = 5; int32 unique_id = 6; int32 segment = 7; HeaderResponses response_id = 8; string response = 9; }
二、JS文件中需补充搜索的线索
要补全完整Schema,还得在整个JS代码中搜索以下内容:
Tag类的完整实现:查看是否定义了其他字段类型的解析方法(比如bool、float、bytes或嵌套消息解析)Parser.next方法的逻辑:确认是否遵循标准Protobuf编码规则(如Varint、长度前缀),还是自定义编码h.data(o, u, i)函数实现:这是业务消息体的核心处理逻辑,里面会包含具体数据的字段标签、类型和结构信息- 枚举的具体数值:找到
e.HeaderTags/e.HeaderRequests/e.HeaderResponses的定义,确认每个枚举对应的整数(比如Subscribe的实际tag值) - 其他解析调用:搜索所有类似
g.int(u)、g.string(u)的代码,统计所有出现的字段类型与对应标签
三、替代提取方案
如果JS代码混淆严重,可尝试这些方法:
- 抓包分析二进制数据:用浏览器Network面板导出WebSocket二进制消息,结合Protobuf编码规则(如Varint格式),对比JS解析逻辑反向推导字段
- 动态调试:在浏览器控制台给
onMessage打打断点,跟踪g.tag的具体数值、解析后的数据内容,直接获取字段tag和值类型 - 逆向工具辅助:使用
protoscope、protobuf-inspector等工具导入二进制数据,结合已知字段信息辅助推导完整Schema
内容的提问来源于stack exchange,提问作者Per
相关产品推荐
相关产品推荐

