我正在尝试对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个字节,以消息的长度作为消息的前缀,但这不是这种情况。
任何帮助将不胜感激。
编码规则在这里:https://developers.google.com/protocol-buffers/docs/encoding
[基本上,每个字段都是一个字段标题(又称“标签”),后跟有效负载。字段标题是“ varint”(请参见编码指南),它是由字段编号和连线类型组成的整数。电线类型是3个最低有效位,而字段号是其余的(移位3位)。对于0x0A(二进制1010),导线类型为2(二进制010),字段号为1。]
如何处理有效负载取决于导线类型。对于2型导线(长度为前缀),您应该期待下一个:
不幸的是,protobuf在没有模式的情况下是模棱两可的,因此知道您具有长度前缀的数据并不能告诉您什么数据是
bytes
)