【网页逆向】某书collect日志上报protobuf

admin 2026-03-12 22:21:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章记录了对某书collect日志上报接口的protobuf逆向分析过程。通过JS跟栈定位Tracker.js中的序列化函数,分析protobuf编码逻辑,结合AI生成proto文件。核心实现包括JSON到proto消息对象转换、字段枚举映射、二进制序列化,以及长度前缀、版本哈希和base64编码处理。文章提供完整Python代码,成功复现日志上报加密数据生成。 综合评分: 75 文章分类: 逆向分析,爬虫,WEB安全,安全工具


cover_image

【网页逆向】某书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
&nbsp; &nbsp; &nbsp; &nbsp; self.buffer.extend(struct.pack('<I', value))

&nbsp; &nbsp; def write_bytes(self, data):
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;isinstance(data, list):
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.buffer.extend(bytes(data))
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;else:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.buffer.extend(data)

&nbsp; &nbsp; def get_result_base64_string(self):
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;base64.b64encode(self.buffer).decode('utf-8')

&nbsp; &nbsp; def reset(self):
&nbsp; &nbsp; &nbsp; &nbsp; 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》

评论:0   参与:  0