1

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

我使用了一些工具,例如: 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 文件。

4

1 回答 1

3

对 .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可能是fixed32or float; 同样,int64可能是sint64or uint64- or int32, sint32, uint32or 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或省略之类的值,它实际上可能是一个. 如果其中一个元素始终最多具有一个值,则它可能不是. 1boolrepeatedrepeated

诀窍是使用它,直到您可以反序列化数据,重新序列化它,并获得完全相同的有效负载(即往返)。

一旦你有了:你会想要反序列化它,改变你想要改变的东西,然后序列化。

于 2019-10-24T18:18:10.093 回答