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


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

正如您在else语句中看到的那样(在关闭调试模式的情况下编译会进入此语句) , 该函数会检查客户端证书和服务器证书是否匹配 。 但是 , 看看在调试模式下发生了什么——它只会返回true , 并且发生在客户端……我们的客户端可以执行同样的操作以启动与服务器的有效SSL通信 。 让我们记住这一点并继续 。 接下来发生的事情有些棘手 , 在Client类的第290行中 , 将调用OnClientState , 但是因为从Client类中调用了OnClientState , 所以事件注册功能会生效 , 而事件处理功能将不会生效:
|如何创建自己的Tracker
本文插图

我们必须手动找到QuasarClient类 , 然后从那里进入到OnClientState 函数(我建议读者多读几次源码并充分理解其含义 , 这对于理解其工作原理有相当大的帮助) 。 但我们应该如何找到它?答案很简单 , 让我们回到Class0 , 即Program.cs
|如何创建自己的Tracker
本文插图

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

因此 , Gclass27是QuasarClient , 为其重命名以便之后找到它更方便 , 接下来我们将通过双击该类并尝试手动查找OnClientState来访问该类:
|如何创建自己的Tracker
本文插图

让我们在第79行设置一个断点 , 并在之前的PayloadWriter WriteBytes函数内设置一个断点 , 该函数位于Stream1的method02 。 在第79 行 , 创建Class18 , 然后将其传递给send函数中 。 Class18在Quasar源码中为ClientIdentification:
|如何创建自己的Tracker
本文插图

这是消息构造函数 , 如果我们继续执行到 payload writer , 可以看到该消息的内容:
|如何创建自己的Tracker
本文插图

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

我们仅是截取了整个消息 。 但是我注意到一些奇怪的事情——ClientIdentification类中只有14个成员 , 为什么这里却有28个成员?
|如何创建自己的Tracker
本文插图

另外 , 在第38行中 , 会将消息复制到数据流中并进行序列化 , 然后发送消息的长度 , 以及由序列化函数返回的原始字节 。 我尝试查看序列化后消息的内容 。 首先 , 让我们调试该程序到第40行 , 右键单击该变量 , 然后选择show memory window , 以查看该数组变量的内容:
除了一些文本内容 , 其它的部分没有任何意义 。
0x03 消息序列化与Google Protocol Buffer
为了节省读者时间 , 我简单解释下什么是序列化 。 序列化是一种压缩消息大小并提高处理效率的方法 。 序列化有诸多类型——其中一种是将消息压缩为json格式或XML格式 , 然后将其发送 , 接收方会按照预先约定好的协议对消息进行反序列化 。 可以在此处了解有关序列化的信息 。
Quasar使用了由Google开发的Protobuf , Protobuf是一消息序列化程序 。 (希望您在看完上述视频后明白其原理)
这就是我们之前看到的这些ProtoMember:
|如何创建自己的Tracker
本文插图


推荐阅读