反编译protobufs-net的bin文件

问题描述 投票:1回答:1

我有一个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文件。

protocol-buffers protobuf-net protobuf-c
1个回答
0
投票

对.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可以是doublefixed64;那些sfixed32可以是fixed32float;同样,int64可能是sint64uint64-或int32sint32uint32bool,但我无法分辨(它们全都是“ 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;
}

取决于您是否有更多数据,可能还有其他字段,或者您可能能够推断出更多上下文。例如,如果诸如int64Blap.B值是always 1或省略,则它实际上可能是bool。如果repeated元素之一始终最多具有一个值,则可能不是repeated

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

一旦拥有that:您将要反序列化它,对事物进行修改[[您想更改,然后序列化。

© www.soinside.com 2019 - 2024. All rights reserved.