Protocol buffers 反编译protobufs net的bin文件
我有一个protobufs的序列化bin文件,主要是用protobufs-net编写的。 我想对它进行反编译,并查看它的结构 我使用了一些工具,如: https://protogen.marcgravell.com/decode 我还使用了protoc: protoc-解码原始数据<~/Downloads/file.bin 这是我得到的部分结果:Protocol buffers 反编译protobufs net的bin文件,protocol-buffers,protobuf-net,protobuf-c,Protocol Buffers,Protobuf Net,Protobuf C,我有一个protobufs的序列化bin文件,主要是用protobufs-net编写的。 我想对它进行反编译,并查看它的结构 我使用了一些工具,如: https://protogen.marcgravell.com/decode 我还使用了protoc: protoc-解码原始数据
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。不幸的是,如果您不知道模式,许多概念是不明确的,因为多个不同的数据类型和形状共享相同的编码细节,但是。。。我们可以猜测 查看您的输出:
1 {
...
}
告诉我们,我们的根消息可能在字段1处有一个子消息;因此:
message Root {
repeated Foo Foos = 1;
}
我在猜测这里重复出现的问题;如果1只出现一次,则它可能是单个的
下一级的一切都是我们的食物
看起来可能是这样
但是,;这些sfixed64可以是double,也可以是fixed64;那些固定的32可以是固定的32,也可以是浮动的32;同样,int64可以是sint64或uint64,也可以是int32、sint32、uint32或bool,我不能说它们都是变量。每个选项赋予值不同的含义
我们的酒吧肯定有一些重复,因为所有的2:
让我们猜猜看:
message Bar {
string A = 1;
repeated Blap B = 2;
int64 C = 3;
}
最后,看一下前一位的2,我们有:
1: "e993fba0-8fc9-e811-9c15-06ec640006bb"
及
及
因此,结合这些,我们可能会猜测:
message Blap {
string A = 1;
int64 B = 2;
}
根据您是否有更多数据,可能会有其他字段,或者您可以推断出更多的上下文。例如,如果一个int64值(如Blap.B)始终为1或省略,那么它实际上可能是一个bool。如果其中一个重复的元素始终最多有一个值,则该元素可能不会重复
诀窍是使用它,直到您可以对数据进行反序列化、重新序列化,并获得完全相同的有效负载(即往返)
一旦你做到了这一点:你会想要反序列化它,改变你想要改变的东西,然后序列化。反向工程.proto文件主要是查看你提到的工具的输出,并尝试编写一个类似的.proto。不幸的是,如果您不知道模式,许多概念是不明确的,因为多个不同的数据类型和形状共享相同的编码细节,但是。。。我们可以猜测 查看您的输出:
1 {
...
}
告诉我们,我们的根消息可能在字段1处有一个子消息;因此:
message Root {
repeated Foo Foos = 1;
}
我在猜测这里重复出现的问题;如果1只出现一次,则它可能是单个的
下一级的一切都是我们的食物
看起来可能是这样
但是,;这些sfixed64可以是double,也可以是fixed64;那些固定的32可以是固定的32,也可以是浮动的32;同样,int64可以是sint64或uint64,也可以是int32、sint32、uint32或bool,我不能说它们都是变量。每个选项赋予值不同的含义
我们的酒吧肯定有一些重复,因为所有的2:
让我们猜猜看:
message Bar {
string A = 1;
repeated Blap B = 2;
int64 C = 3;
}
最后,看一下前一位的2,我们有:
1: "e993fba0-8fc9-e811-9c15-06ec640006bb"
及
及
因此,结合这些,我们可能会猜测:
message Blap {
string A = 1;
int64 B = 2;
}
根据您是否有更多数据,可能会有其他字段,或者您可以推断出更多的上下文。例如,如果一个int64值(如Blap.B)始终为1或省略,那么它实际上可能是一个bool。如果其中一个重复的元素始终最多有一个值,则该元素可能不会重复
诀窍是使用它,直到您可以对数据进行反序列化、重新序列化,并获得完全相同的有效负载(即往返)
一旦你做到了这一点:你会想要反序列化它,改变你想要改变的东西,然后序列化。那么,你需要改变哪些字段呢?最简单的方法是创建您自己的.proto,它与上面的风格相匹配,并反序列化/变异/序列化我没有关于这个程序的任何信息,我只有bin文件,没有其他信息取决于报告的导线类型varint vs fixed32 vs fixed64等这看起来就像是一堆带有重复子消息的int32/string/etc。。。你有实际的bin吗?注意:如果你不能在这里发布文件,但你可以更私密地共享它,请随时通过电子邮件发送给我,我可以很容易地从中反向设计一个可通过的模式。它没有原始名称,我们也不知道某些字段是否为之字形等,但是:它可以往返使用,因此如果它很小且没有特权,则应适用于此目的:只需在问题中张贴十六进制或base-64。另外,电子邮件可能是你最好的选择。请查看我的个人资料页面。那么,你需要更改哪些字段?最简单的事情是创建您自己的.proto,它符合上面的风格,并且是值得的
ize/mutate/serialize我没有关于程序的任何信息,我只有bin文件,没有其他信息,这取决于报告的导线类型varint vs fixed32 vs fixed64等这看起来就像是一堆int32/string/etc,带有重复的子消息。。。你有实际的bin吗?注意:如果你不能在这里发布文件,但你可以更私密地共享它,请随时通过电子邮件发送给我,我可以很容易地从中反向设计一个可通过的模式。它没有原始名称,我们也不知道某些字段是否为之字形等,但是:它可以往返使用,因此如果它很小且没有特权,则应适用于此目的:只需在问题中张贴十六进制或base-64。否则:电子邮件可能是你最好的选择,请查看我的个人资料页面。