|如何创建自己的Tracker( 五 )
该C#类是基于ProtoContract定义的 , 使得编译器在生成这14个成员时会同时生成google protobuf消息 。 这就是为什么每个类成员都有一个原型成员 。 现在 , protobuf协议会以不同的方式压缩每种类型(int32 , int64 , 字符串) , 所以我们会在消息中看到很多奇怪的字节 。 到这里基本上已经可以回答我们之前设定的目标1-3 。
很明显 , 下一步我们要做的是:
- 创建一个启动SSL连接的python脚本
- 验证客户端和服务器之间的连接
- 生成一个protobuf消息 , 并且可以与生成客户端发送的消息匹配 。
0x04 如何使用Python生成Protobuf消息
幸运的是 , Google提供了一个使用Python生成protobuf消息的编程接口以及教程 。
我精心设计了一条消息来启动与服务器的SSL连接:
本文插图
首先 , 消息内容很简单 , 它包含14个成员 , 这些成员与Quasar客户端发送的消息完全匹配 。
本文插图
该脚本会创建SSL socket , 并通过始终在每个证书上返回1来来处理验证问题 。 尽管这是作弊 , 但我们是Hackers 。
本文插图
接下来让我们生成一条消息并将其序列化 。 请记住 , 必须在其后附加4个little endian字节——代表消息的总长度 。
本文插图
本文插图
因此 , 我创建了一个简单的函数 , 它将返回该值并将其添加到序列化消息前缀中 。 现在我们可以生成消息 , 进行序列化并输出内容 , 看看它是否与Quasar客户端生成的内容匹配:
本文插图
本文插图
如您所见 , 生成消息有问题 。 Python生成的消息与客户端生成消息(除0x0A , 0xCF , 0x05之外)完全匹配(忽略前缀0xdf 0x02 0x00 0x00) 。 这些字节是什么?我不知道 , 所以我在stack overflow上提出了相关问题 。
经过些许研究 , 我确定该前缀只能是消息的长度 。 Python生成的消息其余部分与客户端生成的消息完全匹配 。 另外 , 如果我们编辑Quasar客户端生成的消息 , 则随着我们增加消息的长度 , 该前缀字段将会改变 。 让我们再次调试生成的Quasar客户端 , 并在发送消息之前于第36行中断Payload Writer函数 , 于任意一个字段中添加任意数量的字符”A”来改变消息内容:
本文插图
如上所示 , 消息已更改 , 第二个字节从0xcf变为0xf5 。 0xF5与0xCF之间差38 , 这正是我添加的字符”A”的数量 。 若要准确计算出长度 , 我们必须了解对该字节序列进行编码的工作原理 , 幸运的是 , Google并未对此保密(参考) , 另外这里也给出了答案 。
我不会详细解释整个过程的工作原理 , 但是理解它对于我们目标的实现是有益的 。 Google Protobuf是开源项目 , 故我们无须从头开始重新实现 。
推荐阅读
- 模型|REVIT技巧!如何创建能量模型,实现能量优化
- 技术编程|如何利用数据库进行世界史研究
- 区块链|欧科云链任煜男做客西安广电电台节目,解读区块链如何赋能实体产业
- 苹果笔记本|如何让macbook合上时工作?解决苹果电脑合盖自动休眠问题-macw
- |如何分析“会员数据”,强化门店的竞争力?
- 拍照摄影|如何拍出赞爆朋友圈的自拍照?网红小姐姐公开拍照神器
- 目标检测|数据民工也能移动办公了:目标检测标注App上线,分分钟创建私人数据集
- IOS系统|苹果免签封装如何实现?苹果免签封装会不会掉签?
- 帧数|帧数提升70% NV黑科技DLSS如何开启
- 拍照摄影|即将进入大学的新生想入手一台相机,该如何选?
