文章总结: 文章记录了对某书collect日志上报接口的protobuf逆向分析过程。通过JS跟栈定位Tracker.js中的序列化函数,分析protobuf编码逻辑,结合AI生成proto文件。核心实现包括JSON到proto消息对象转换、字段枚举映射、二进制序列化,以及长度前缀、版本哈希和base64编码处理。文章提供完整Python代码,成功复现日志上报加密数据生成。 综合评分: 75 文章分类: 逆向分析,爬虫,WEB安全,安全工具
【网页逆向】某书collect日志上报protobuf
原创
可乐还是百事好 可乐还是百事好
爬虫逆向小林哥
2026年3月12日 17:41 江苏
介绍
进入笔记详情会发大量的collect的Xhr包,请求data加密了
过程
跟栈
下图是主要位置,这里的u已经初始化了Tracker
下面的是重点我们后面分析
{
key: "serializeBinary",
value: function serializeBinary(e, r) {
var a = new r
, f = e.serializeBinary();
a.encoder_.writeSignedVarint64(f.byteLength + 4),
a.encoder_.writeInt32(this.versionHash),
a.encoder_.writeBytes(f);
var c = a.getResultBase64String();
return a.reset(),
c
}
}
先来看u的生成,往前找就可以了,这里是明文
下面这里build了
proto
进入到一个Tracker.js的文件,里面全是proto相关的代码
字段名类型(每个case)
结合Ai写个proto文件
然后生成个pb2
protoc --python_out=./output ./tracker.proto
后面就是 JSON数据转换为proto消息对象了,属于是复杂的传数据的流程。原理就是SON的字符串枚举通过映射表转为整数,按proto定义的字段编号顺序排列,嵌套消息先序列化再作为父字段的值,最终生成带字段编号和类型的二进制数组
举个例子:
JSON中的 "platform":{"type":"Platform","value":"PC"}
↓
[枚举映射] PLATFORM_MAP["PC"] = 7
↓
App消息对象 app.platform = 7
↓
App消息序列化 (按字段编号顺序)
├─ 字段1(nameTracker): tag=8, value=5 → [08, 05]
├─ 字段2(appVersion): tag=12, length=19, string bytes → [12, 19, 100,105,...]
├─ 字段6(platform): tag=30, value=7 → [30, 07]
├─ 字段7(artifactName): tag=58, length=10, string bytes → [3a, 0a, 120,104,...]
└─ ...
↓
App的完整二进制数据 (54字节)
后面结合Ai用Python实现就好了
还有最后一步它输出的是base64格式的
主要做了加个长度前缀、哈希版本号然后base64就好了
class JsProtoEncoder:
def __init__(self):
self.buffer = bytearray()
def write_signed_varint64(self, value):
value = value & 0xFFFFFFFFFFFFFFFF
while value > 0x7F:
byte = (value & 0x7F) | 0x80
self.buffer.append(byte)
value >>= 7
value = value & 0xFFFFFFFFFFFFFFFF
self.buffer.append(value & 0x7F)
def write_int32(self, value):
value = value & 0xFFFFFFFF
self.buffer.extend(struct.pack('<I', value))
def write_bytes(self, data):
if isinstance(data, list):
self.buffer.extend(bytes(data))
else:
self.buffer.extend(data)
def get_result_base64_string(self):
return base64.b64encode(self.buffer).decode('utf-8')
def reset(self):
self.buffer = bytearray()
encoder = JsProtoEncoder()
encoder.write_signed_varint64(len(proto_bytes) + 4)
encoder.write_int32(version_hash)
encoder.write_bytes(proto_bytes)
result = encoder.get_result_base64_string()
encoder.reset()
success
广子
❝
有需要用于爬虫、逆向、抓包的测试机又不想花时间折腾Root、刷机、环境配置可以来看下下面联系方式,或者B站视频评论区见
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:爬虫逆向小林哥 可乐还是百事好 可乐还是百事好《【网页逆向】某书collect日志上报protobuf》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论