识别文件的哪一部分是 header 以及什么是 protobuf 消息

Recognising the what part of a file is a header and what is protobuf messages

我正在尝试从使用 protobuf 的程序创建的文件中获取原始 protobuf 消息。我不拥有源程序或任何东西,但我对 protoc --decode_raw 的输出感到满意。不幸的是,这不起作用,因为我收到“无法解析输入”错误。我相信这是因为文件中的 protobuf 数据有一个 header。源程序是DOTA2,文件是这样开头的;

50 42 44 45 4d 53 32 00 f0 54 0e 03 f7 bf 0d 03
01 ff ff ff ff 0f 7b 0a 08 50 42 44 45 4d 53 32
00 10 2c 1a 2e 56 61 6c 76 65 20 44 6f 74 61 20
32 20 45 55 20 4e 6f 72 74 68 20 53 65 72 76 65
72 20 28 73 72 63 64 73 31 32 35 2e 31 38 35 2e
36 34 29 22 0d 53 6f 75 72 63 65 54 56 20 44 65
6d 6f 2a 05 73 74 61 72 74 32 1f 2f 6f 70 74 2f
73 72 63 64 73 2f 64 6f 74 61 2f 64 6f 74 61 5f
76 31 38 33 31 2f 64 6f 74 61 38 02 40 01 48 01
52 00 08 ff ff ff ff 0f 11 08 01 10 01 1a 0b 44
02 82 e8 01 08 00 0a 00 0c 00 08 ff ff ff ff 0f
16 08 02 10 02 1a 10 d3 34 28 14 cc d1 85 c9 d1
41 e0 b3 46 47 06 20 08 ff ff ff ff 0f e7 03 08
03 10 03 1a e0 03 98 70 0f 20 d4 26 40 10 60 04
80 04 c0 b0 f5 e0 59 d1 48 40 01 61 91 17 80 01
b4 25 22 22 f4 c8 7d bc bc c1 d1 bd cc c9 8d 91
cd bd 90 bd d1 85 bd 90 bd d1 85 7d d9 c5 e0 cc
c4 bc 90 bd d1 85 e9 15 cc d1 85 c9 d1 29 06 20
4c bd d5 c9 8d 95 51 59 49 06 00 68 06 ac 06 20

在尝试解码此文件之前,我没有使用 protobuf 的知识或经验,所以我有点不确定 header 结束和 protobuf 消息开始的位置。我非常有信心 upto "..v1831/dota8" 是 header 的一部分,但删除它仍然给我带来无法解析输入的问题。

我在网上查看了有关此类文件的任何细节(这是一个 DOTA2 演示下载),还有其他人制作的程序可以执行此类任务,但我找不到明确的裁剪资料上header的长度。我部分地使用它来了解 protobuf,所以使用另一个应用程序并不是我真正想要的。

作为参考,我打算最终在 vb.net 中使用它,因此我正在使用 protobuf-net(我不认为它与 question/answer 相关,但它是 here 以防万一).

前 33 个字节是 header。 header 以 8 字节序列 "PBDEMS2[=20=]" 开始和结束(包括 \0,又名 NUL 字节)。 protobuf 数据在第二个 "PBDEMS2[=20=]"(NUL 字节之后的字节)之后立即开始。

您只提供了数据的开头,所以当我尝试将其提供给 protoc --decode_raw 时,它仍然出错,因为数据过早结束。但是手动解码数据似乎是这样开始的:

2: 44
3: "Valve Dota 2 EU North Server (srcds125.185.64)"
4: "SourceTV Demo"
5: "start"
6: "/opt/srcds/dota/dota_v1831/dota"
7: 2
8: 1
9: 1
10: ""
1: 4294967295   // (probably actually -1)
2: 0x02440b1a01100108

但是,这是可疑的:请注意字段编号的顺序越来越多,然后突然从 1 开始。还要注意字段 2 第二次具有不同的类型。我想我们在这里看到的实际上是多条消息——可能是不同类型的——back-to-back.

遗憾的是,很难说出您应该如何分辨一条消息在哪里结束以及下一条消息从哪里开始。可能 header 告诉了你,但我不知道如何解码它。 header 似乎不是 protobuf-format。