【问题标题】:Protobuf-net unrecognized stream prefixProtobuf-net 无法识别的流前缀
【发布时间】:2020-08-08 06:07:58
【问题描述】:

我正在尝试对 Quasar RAT protobuf 协议结构进行逆向工程。 Quasar 是一个用 C# 编写的远程管理工具,它是开源的,可以在这里在线找到。 https://github.com/quasar/QuasarRAT

我已经设法扭转了大部分情况,现在我可以从 python 脚本连接到 Quasar 服务器客户端。无论一个问题仍然存在,似乎从客户端发送到服务器的每个字节流都以一个 3 字节字段开头,该字段未在 Quasar 的 protobuf 类中注册。该字段似乎提供了不包括前缀字节的消息长度。正如在此块中可以看到的示例,为大小为 0x2d2 的数组生成的前缀字节流,这些是附加到消息的前缀字节。

0x0A, 0xCF, 0x05

如果我决定在序列化消息之前更改消息字段,那么除了第一个 0x0A 字节之外,这个字节流将会改变。似乎如果我继续将字节附加到消息字段,第二个字节会增长,并且如果我溢出第二个字节(使其达到 0xff 以上) - 它会增加第三个字节并将第二个字节重置为0x80。但是数学对我来说根本没有意义,因为这个字段应该返回数组的大小,但不在任何我可以计算的合理公式下。我知道 protobuf-net 可以生成 PreLengthPrefix 字节来为消息添加前缀,但这里不是这样。

任何帮助将不胜感激。

【问题讨论】:

  • 所以它不仅仅是一个“varint”?
  • 您能详细说明一下吗?也许我在阅读编码时错过了理解。据我了解,第一个字节 0x0a 表示它是一种字符串?
  • @MarcGravell 嘿,我已经检查了你所说的话,这似乎是有道理的>
  • 在 protobuf 字段头(“标签”)中,3 个 LSB 代表线路类型。所以:取你的字段 number (1) 并左移 3 位,给你二进制 1000。现在将它与“长度前缀”的线类型结合起来,即 2(二进制 010),你得到二进制 1010 - 或十六进制:0A。如果您有完整的有效负载,protogen.marcgravell.com/decode 可以引导您完成每一部分。在决定时,显然要反过来:(tag & 7) 给你电线类型,(tag >> 3) 给你号码。很明显,这是在 varint 解码之后。
  • 好吧,你已经说得很清楚了,如何确定 2 是长度前缀还是字符串,解码器必须猜测吗?

标签: python c# protocol-buffers reverse-engineering protobuf-net


【解决方案1】:

编码规则在这里:https://developers.google.com/protocol-buffers/docs/encoding

基本上,每个字段都被编码为字段标头(也称为“标签”),然后是有效负载。字段头是一个“varint”(参见编码指南),它的值是一个由字段编号和线路类型组成的整数。线路类型是 3 个最低有效位,字段编号是其余的(移位 3 位)。 0x0A(二进制1010)的情况下,线型为2(二进制010),字段号为1。

如何处理有效载荷取决于电线类型。对于 2 类电线(以长度为前缀),您应该期待下一个:

  • 一个 varint,它是有效负载的长度(以字节为单位),然后
  • 实际有效负载的字节数

不幸的是,protobuf 在没有模式的情况下是模棱两可的,所以知道你有长度前缀的数据并不能告诉你数据是什么;以长度为前缀的有效载荷可以是:

  • UTF-8 字符串
  • 原始 BLOB (bytes)
  • 子消息
  • 某种原始类型(整数/浮点数/等)的“打包”数组——记住长度前缀是字节数,而不是元素数;元素甚至不一定是固定大小的(它们本身可能是变体

在许多方面,电线类型的目的并不是告诉您如何解释数据;而是告诉您如何解释数据。它是告诉您如何跳过(或仅逐字存储)该字段(如果您不知道该字段)。例如,其他人正在使用 API 的 V3,而您仅将架构更新到 V2;他们向您的 V2 API 发送 V3 消息; V3 有你不关心的额外字段 - 反序列化程序在遇到它们时需要不中断,因此线类型告诉它如何忽略该字段(即查找下一个字段的规则是什么场地)。否则,我们可以只使用模式信息而不将线类型存储在有效负载中根本(尽管它也被用作重复原始数据的优化,通过“打包”数组 - 它是到序列化器是否编码,例如长度前缀与大量字段头/值对)。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多