我有一个protobufs的序列化bin文件,主要用protobufs-net编写。我想反编译它,并查看它的结构。
我使用了一些toolds,例如:https://protogen.marcgravell.com/decode
而且我也使用了protoc
:
protoc --decode_raw < ~/Downloads/file.bin
这是我得到的结果的一部分:
1 {
1: "4f81b7bb-d8bd-e911-9c1f-06ec640006bb"
2: 0x404105b1663ef93a
3: 0x4049c6158c593f36
4: 0x40400000
5 {
1: "53f8afde-04c6-e811-910e-4622e9d1766e"
2 {
1: "e993fba0-8fc9-e811-9c15-06ec640006bb"
}
2 {
1: "9a7c7210-3aca-e811-9c15-06ec640006bb"
2: 1
}
2 {
1: "2d7d12f1-2bc9-e811-9c15-06ec640006bb"
}
3: 18446744073709551615
}
6: 46
7: 1571059279000
}
我如何反编译它?我想知道结构并更改其中的数据并制作一个新的bin文件。
对.proto文件进行反向工程主要是查看您提到的工具的输出,并尝试编写看起来类似的.proto的情况。不幸的是,如果您不了解模式,那么很多概念都是ambiguous,因为多种不同的数据类型和形状共享相同的编码细节,但是...我们可以做出猜测。
查看您的输出:
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
或float
;同样,int64
可能是sint64
或uint64
-或int32
,sint32
,uint32
或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
的Blap.B
值是always 1
或省略,则它实际上可能是bool
。如果repeated
元素之一始终最多具有一个值,则可能不是repeated
。
诀窍是一直使用它,直到可以反序列化数据,重新序列化它,然后获得完全相同的有效负载(即往返)。
一旦拥有that:您将要反序列化它,对事物进行修改[[您想更改,然后序列化。