Protocol buffers 反编译protobufs net的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-解码原始数据

我有一个protobufs的序列化bin文件,主要是用protobufs-net编写的。 我想对它进行反编译,并查看它的结构

我使用了一些工具,如: https://protogen.marcgravell.com/decode

我还使用了protoc:

protoc-解码原始数据<~/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。不幸的是,如果您不知道模式,许多概念是不明确的,因为多个不同的数据类型和形状共享相同的编码细节,但是。。。我们可以猜测

查看您的输出:

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。否则:电子邮件可能是你最好的选择,请查看我的个人资料页面。