|如何创建自己的Tracker( 五 )


该C#类是基于ProtoContract定义的 , 使得编译器在生成这14个成员时会同时生成google protobuf消息 。 这就是为什么每个类成员都有一个原型成员 。 现在 , protobuf协议会以不同的方式压缩每种类型(int32 , int64 , 字符串) , 所以我们会在消息中看到很多奇怪的字节 。 到这里基本上已经可以回答我们之前设定的目标1-3 。
很明显 , 下一步我们要做的是:

  1. 创建一个启动SSL连接的python脚本
  2. 验证客户端和服务器之间的连接
  3. 生成一个protobuf消息 , 并且可以与生成客户端发送的消息匹配 。
关于第3点 , 我们可以假设消息的重要部分是Tag , Signature和EncryptionKey成员 , 根据我进行的测试 , 它们必须保持不变并与生成的客户端完全匹配 。 因为Signature和EncrpytionKey是包含X509证书信息的成员 。
0x04 如何使用Python生成Protobuf消息
幸运的是 , Google提供了一个使用Python生成protobuf消息的编程接口以及教程 。
我精心设计了一条消息来启动与服务器的SSL连接:
|如何创建自己的Tracker
本文插图

首先 , 消息内容很简单 , 它包含14个成员 , 这些成员与Quasar客户端发送的消息完全匹配 。
|如何创建自己的Tracker
本文插图

该脚本会创建SSL socket , 并通过始终在每个证书上返回1来来处理验证问题 。 尽管这是作弊 , 但我们是Hackers 。
|如何创建自己的Tracker
本文插图

接下来让我们生成一条消息并将其序列化 。 请记住 , 必须在其后附加4个little endian字节——代表消息的总长度 。
|如何创建自己的Tracker
本文插图

|如何创建自己的Tracker
本文插图

因此 , 我创建了一个简单的函数 , 它将返回该值并将其添加到序列化消息前缀中 。 现在我们可以生成消息 , 进行序列化并输出内容 , 看看它是否与Quasar客户端生成的内容匹配:
|如何创建自己的Tracker
本文插图

|如何创建自己的Tracker
本文插图

如您所见 , 生成消息有问题 。 Python生成的消息与客户端生成消息(除0x0A , 0xCF , 0x05之外)完全匹配(忽略前缀0xdf 0x02 0x00 0x00) 。 这些字节是什么?我不知道 , 所以我在stack overflow上提出了相关问题 。
经过些许研究 , 我确定该前缀只能是消息的长度 。 Python生成的消息其余部分与客户端生成的消息完全匹配 。 另外 , 如果我们编辑Quasar客户端生成的消息 , 则随着我们增加消息的长度 , 该前缀字段将会改变 。 让我们再次调试生成的Quasar客户端 , 并在发送消息之前于第36行中断Payload Writer函数 , 于任意一个字段中添加任意数量的字符”A”来改变消息内容:
|如何创建自己的Tracker
本文插图

如上所示 , 消息已更改 , 第二个字节从0xcf变为0xf5 。 0xF5与0xCF之间差38 , 这正是我添加的字符”A”的数量 。 若要准确计算出长度 , 我们必须了解对该字节序列进行编码的工作原理 , 幸运的是 , Google并未对此保密(参考) , 另外这里也给出了答案 。
我不会详细解释整个过程的工作原理 , 但是理解它对于我们目标的实现是有益的 。 Google Protobuf是开源项目 , 故我们无须从头开始重新实现 。


推荐阅读