对 .proto 文件进行逆向工程主要是查看您提到的工具的输出,并尝试编写看起来相似的 .proto 文件。不幸的是,如果您不知道架构,许多概念是模棱两可的,因为多个不同的数据类型和形状共享相同的编码细节,但是......我们可以猜测。
查看您的输出:
1 {
...
}
告诉我们,我们的根消息可能在字段 1 有一个子消息;所以:
message Root {
repeated Foo Foos = 1;
}
(我猜在repeated
这里;如果1
只出现一次,它可能是单一的)
下一个层次的一切都是我们的Foo
。
1: "4f81b7bb-d8bd-e911-9c1f-06ec640006bb"
2: 0x404105b1663ef93a
3: 0x4049c6158c593f36
4: 0x40400000
5: { ... }
6: 46,
7: 1571059279000
这看起来可能是
message Foo {
string A = 1;
sfixed64 B = 2;
sfixed64 C = 3;
sfixed32 D = 4;
repeated Bar E = 5; // again, might not be "repeated" - see how many times it occurs
int64 F = 6;
int64 G = 7;
}
然而; 那些sfixed64
可能是double
,或fixed64
;那些sfixed32
可能是fixed32
or float
; 同样,int64
可能是sint64
or uint64
- or int32
, sint32
, uint32
or bool
,我无法分辨(它们都只是“varint”)。每个选项都赋予价值不同的含义!
我们Bar
肯定有某种repeated
,因为所有的2
:
1: "53f8afde-04c6-e811-910e-4622e9d1766e"
2 { ... }
2 { ... }
2 { ... }
3: 18446744073709551615
让我们猜测一下:
message Bar {
string A = 1;
repeated Blap B = 2;
int64 C = 3;
}
最后,2
从前一点来看,我们有:
1: "e993fba0-8fc9-e811-9c15-06ec640006bb"
和
1: "9a7c7210-3aca-e811-9c15-06ec640006bb"
2: 1
和
1: "2d7d12f1-2bc9-e811-9c15-06ec640006bb"
所以结合这些,我们可能会猜到:
message Blap {
string A = 1;
int64 B = 2;
}
根据您是否有更多数据,可能会有其他字段,或者您可能能够推断出更多上下文。例如,如果int64
诸如alwaysBlap.B
或省略之类的值,它实际上可能是一个. 如果其中一个元素始终最多具有一个值,则它可能不是. 1
bool
repeated
repeated
诀窍是使用它,直到您可以反序列化数据,重新序列化它,并获得完全相同的有效负载(即往返)。
一旦你有了它:你会想要反序列化它,改变你想要改变的东西,然后序列化。