反编译protobufs-net的bin文件

Posted

技术标签:

【中文标题】反编译protobufs-net的bin文件【英文标题】:decompiling a bin file of protobufs-net 【发布时间】:2019-10-24 16:43:18 【问题描述】:

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

【问题讨论】:

好吧,您需要更改哪些字段?最简单的方法是创建自己的 .proto 与上述风格相匹配,并反序列化/变异/序列化 好吧,我没有关于这个程序的任何信息,我只有 bin 文件,没有其他信息 取决于报告的电线类型(varint vs fixed32 vs fixed64 等),这看起来只是一堆带有重复子消息的 int32/string/etc... 你有实际的 bin ? 注意:如果您不能在此处发布文件,但您可以更私密地共享它,请随时通过电子邮件将其发送给我,我可以轻松地从中逆向工程一个可通过的架构。它不会有原始名称,我们不知道某些字段是否是 zig-zag 等,但是:它会往返正常,所以应该在这里工作 如果它很小且没有特权:只需在问题中发布十六进制或 base-64。否则再次:电子邮件可能是您的最佳选择(请参阅我的个人资料页面)。 【参考方案1】:

对 .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 可以是fixed32float;同样,int64 可能是sint64uint64 - 或int32sint32uint32bool,我无法分辨(它们都只是“变种” )。每个选项赋予值不同的含义!

我们的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始终1 或省略,则它实际上可能是 bool。如果repeated 元素之一始终最多有一个值,则它可能不是repeated

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

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

【讨论】:

以上是关于反编译protobufs-net的bin文件的主要内容,如果未能解决你的问题,请参考以下文章

如何利用ILSPY反编译工具重建C#NETWeb源码解决方案

谁能帮我把一个hex文件反编译为c语言文件?

XJad反编译工具

如何反编译esriaddin文件

什么软件能将C语言的执行文件反汇编为汇编源代码

可以反编译DLL文件吗