Protobuf-net无法识别的流前缀

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

我正在尝试对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个字节,以消息的长度作为消息的前缀,但这不是这种情况。

任何帮助将不胜感激。

python c# protocol-buffers reverse-engineering protobuf-net
1个回答
0
投票

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

[基本上,每个字段都是一个字段标题(又称“标签”),后跟有效负载。字段标题是“ varint”(请参见编码指南),它是由字段编号和连线类型组成的整数。电线类型是3个最低有效位,而字段号是其余的(移位3位)。对于0x0A(二进制1010),导线类型为2(二进制010),字段号为1。]

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

  • 一个varint,它是有效载荷的长度,以字节为单位
  • 实际有效负载的那么多字节
  • 不幸的是,protobuf在没有模式的情况下是模棱两可的,因此知道您具有长度前缀的数据并不能告诉您什么数据

;前缀有效载荷的长度可以是:
  • UTF-8字符串
  • 原始BLOB(bytes
  • 子消息
  • 某种原始类型(整数/浮点数/等)的“打包”数组-记住长度前缀是bytes
  • 的数目,而不是元素的数目;元素甚至不一定是固定大小的(它们本身可以是varints)
© www.soinside.com 2019 - 2024. All rights reserved.