反编译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
可以是fixed32
或float
;同样,int64
可能是sint64
或uint64
- 或int32
、sint32
、uint32
或bool
,我无法分辨(它们都只是“变种” )。每个选项赋予值不同的含义!
我们的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文件的主要内容,如果未能解决你的问题,请参考以下文章