私有协议

现在的互联网,谁不想造一个像Ether、IP、TCP这种网络领域鹤立鸡群的通信协议。
就连很火的QUIC,也是伴随着RFC落地,才正式被人认可是公共的HTTP协议。

所以,大多数人都还是在创造协议时,给自己贴上个“私有协议”的标签。这很常规,并不俗套。

甚至teamviewer这类的商业软件就把自家的teamview协议叫做私有协议。

一个私有协议完成自己的工作,是自己基本的能力。但如果想让它被真正的“用起来”,最起码还需要做这样一份工作,私有协议的解密游戏

为什么这么说呢?因为,一个私有协议在网络中跟着数据包一起传输,它们都必然是“以字节这样的形式”传递的。很显然,这是计算机熟悉的规则,并不是人熟悉的。所以,这项解密游戏必须要有破局者!

如何破局?想必熟悉网络的人都会想到它,就是wireshark!

Wireshark

wireshark是最通用的网络协议分析器,主要用于分析网络上的通信协议,通过解析数据包去细粒度地观察网络发生的事件。

但自定义的私有协议不会被wireshark所支持。这太明显,你也没告诉wireshark,这是个啥东西,但wireshark很聪明,它明白会有这样一个重要的需求,所以wireshark提供了一种插件式的能力,帮助wireshark开发者在wireshark上解析他们想要的私有协议。

这点,wireshark 可太懂了!

如今的wireshark支持C和lua语言去定义“如何将私有协议从秘文转换为明文”。因为wireshark提供的API很强大,所以基本的能力,选择任何一种都可以解决“解析私有协议”的问题。大部分开发,选择lua是因为其是轻盈小巧的脚本语言,可以很容易的嵌入到wireshark应用程序中,当然tshark也可以-X 选择解析特定私有协议的lua脚本,完成相同的工作。

解密私有协议

一个协议最好单独用一个lua脚本诠释,在wireshark上定义私有协议可以分成几个部分。

  1. 定义协议和字段
  2. 定义协议解析器
  3. 选择导入的方式

首先,要对协议的全部内容有对应的定义。wireshark提供的API里有Proto、ProtoField、Prefs等几个大类的定义,Proto表示协议对象,ProtoField表示协议字段对象,Prefs表示协议表选项对象。在脚本的最开始应该把需要定义的对象全部陈列清楚,方便后面定义协议解析器的具体实现。

第二,要对协议的解析有清晰的定义。wireshark默认每一个协议都有一个对应的解析器对象,这个解析器用来解析协议上数据帧的全部字节,并映射到解析树上。解析器对象有三个重要的变量,tvb/buffer表示需要解析的数据缓存,本质上是字节数组;pinfo表示在wireshark主窗口数据帧的信息;tree表示解析树,因为数据包是以树结构解析的,这样子的结构使得wireshark的协议层次化。

第三,协议需要编排进wireshark中,使得wireshark找到自定义的协议并同意按解析器对象定义的规则解析数据包上的对应字节。一般在Ethernet链接层上是以协议类型区分不同协议的,
IP层亦是通过IP首部的协议字段区分不同协议的,TCP、UDP等传输层协议除了用协议类型区分,更多的采用端口区分不同上层协议(但协议类型是区分不同协议更通用的方法,所以wireshark更希望协议有唯一的固定字段,私有化协议可以依赖固定字段注册到相应的前序协议)。

注意:
我们称这个唯一的固定字段是MAGIC,我们希望这个MAGIC是4个字节的ASCII码,这不仅为了区分协议,更为了在“捕获过滤器”和“读过滤器”等等工具上,可以依赖MAGIC去识别协议和进一步处理。

解析策略

wireshark提供了几种不同的解析策略。

每一个协议都会定义一个解析器,用于解析协议内的字节。

  • dissector 最通用的解析器
  • heuristic dissector 启发式解析器
  • post dissector 后序解析器
  • chained dissector 链式解析器

第一种解析器,是最常用的解析器。往往没有协议特征匹配,只是按照协议上的字节映射相应的内容。这适合单个私有协议,可以依赖wireshark自身实现的解析表,只需要关注定义协议、字段和解析器即可。

解析器:Proto.dissector(tvb,pinfo,tree)
注册:DissectorTable:add(port/field,Proto)

第二种解析器,启发式解析器。可以根据条件判断不同协议。在解析前,提前根据不同条件过滤不满足的协议,这使得私有协议可以利用更多的“证据”证明自身的唯一性,很适合在公共协议上注册使用,能防止相似的协议混淆(公共协议上注册的意思是向ip、tcp、udp这类公开的协议上注册)。

解析器:condition_function(tvb,pinfo,tree)Proto.dissector(tvb,pinfo,tree)
注册:DissectorTable:register_heuristic("protoname",condition_function)

第三种解析器,后序解析器。在所有解析器都处理后,统一对每一个数据帧处理的一种解析器。这使得wireshark上的每个数据帧都会再经过一层解析器处理,这个解析器不需要注册到任何一种协议上。

解析器:Proto.dissector(tvb,pinfo,tree)
注册:register_postdissector(Proto)

第四种解析器,链式解析器。这类解析器可以基于已有的解析器扩展能力,而不需要重新写一个新的。它和后序解析器相同的是,都是在所有解析器都处理完,再进行解析。这种解析器有一个好处,对于没有“被扩展的解析器”处理的数据包是不需要从头开始处理的。

解析器:Proto.dissector(tvb,pinfo,tree)
注册:  do ... end / DissectorTable:add(port/field,Proto)

后序和链式解析器

这里解释一下后序解析器和链式解析器,因为两者都是在最后生效的,但有自己的使用场景。后序解析器算是一种新的解析器,这类解析器是最后对每一个数据包进行处理,当有新的字段设置或者新的特征匹配,需要进一步处理时,后序解析器很适用;而链式解析器更像是一种装饰器,它包裹原来的解析器,当所有解析器处理完后,针对被原始解析器处理的数据包做进一步处理,可以修改/添加/删除原先解析器处理的字段等,以适应新的进化协议。

解析器和解析表

解析器是Dissector,每一个协议都需要定义一个专门的解析器,负责该协议字段的解析;解析表是DissectorTable,主要用于存储注册的解析器,负责调用解析器处理后续的payload。当每个协议被注册到不同的前序协议的解析表时,本质上是注册解析器。当上一层协议解析完,都会在自己的解析表中查找注册的相应解析器,经过特征匹配后,满足条件方才调用解析器。

wireshark的DissectorTable有几种类型,但提供给开发者自定义的只有两种,一种是整型的解析表,另一种是字符串型的解析表,两者的区别是注册解析器时,注册方法是字节整形还是字符串。

//解析表
local table = DissectorTable.new("dissectorTablename","DissectorTable-filter",ftypes.UINT16,base.HEX,Proto)

协议注册到解析表上,解析表就有了解析器。

function Proto.init()
DissectorTable.get("dissectorTablename"):add(0x1111,Proto)
end

这样,有解析表的协议可以根据协议后的两个字节判断是否有注册的解析器。

local identity = buf(0,2):uint()
local next_protocol = table:get_dissector(identity)//  判断是否有注册协议if next_protocol then //根据字节数组的整型特征隐式调用解析器解析后面的字段table:try(identity,buf,pinfo,tree)end

最后

最后,还教大家一个简单直接的调用方法。如果仅存在一个或两个协议时,可以直接调用解析器,而不需要创建一个解析表。

原因很简单,因为解析器定义是全局函数。
Dissector.get("protoName"):call(buf,pinfo,tree)

最后的最后,wiresahrk上别忘了注册脚本!脚本注册在init.lua。

do_file(.....proto_file.lua)

私有协议的解密游戏:从秘文到明文相关推荐

  1. 基于Netty实现TCP私有协议

    什么是协议 从生活角度去理解:协议大部分情况下是指两个或两个以上实体为了开展某项活动,经过协商后双方达成的一致意见.例如租房合同协议.劳动合同协议等. 从互联网角度去理解:协议是指网络通信的参与方必须 ...

  2. 封包协议,加密解密,线程发包,recv,明文收包

    一.封包,协议 什么是封包?封包就是按照某种协议组成的一段字节集.这个很容易理解 那为什么要按照某种协议呢?这个我们一会再说 所有联网的软件,包括网络游戏,客户端和服务端进行通信都是通过封包进行的. ...

  3. 简单的网络3D解密游戏

    <计算机网络与通信>课程项目汇报 二.项目目标 本项目实现供多人联机(局域网/互联网)的解密游戏,主要功能有:游戏通关.多人联机.制作聊天室和死亡重生功能,并且我们在游戏的基础上,以Wir ...

  4. 接口和协议组成 聊一聊游戏的接口测试落地

    转载:https://testerhome.com/topics/6698 目录 什么是游戏的接口测试 游戏接口测试的必要性 接口测试的落地 项目1 项目2 项目3 录制的原理 测试工具UI的编写 参 ...

  5. 通过修改注册表,实现网页链接中的私有协议启用本地exe进程

    私有协议为 coffeeclass://xxxxxx.mp4 注册表如下 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\coffeecl ...

  6. LigoWave(力格微)无线网桥稳定性探秘——私有协议

    文章开端,首先让我们来分析下目前国内3公里以内网桥产品的主要生产方式: 第一.无线路由器主板+射频天线+路由器软件: 第二.自己设计网桥主板+抄板射频天线+免费开放软件: 第三.抄板网桥主板+抄板射频 ...

  7. 关于Darwin接入私有协议、私有SDK码流的讨论

    关于Darwin接入私有协议.私有SDK码流的讨论 最近做到云视频/云监控的项目,跟团队伙伴讨论到一个架构问题,就是将私有协议的码流数据接入到Darwin,再通过Darwin对外提供高效的RTSP/R ...

  8. 视频监控系统上云解决方案EasyCVR集成海康EHome私有协议系列——文件查找操作流程

    视频监控系统采用云模式进行规划.建设和部署,实现了资源的共享.数据的融通.算力的提升:而开放的生态和业务的智能,让视频监控系统更好地为公安实战服务,让城市更安全.TSINGSEE青犀视频团队研发的Ea ...

  9. html打开浏览器协议,通过私有协议在Chrome浏览器网页中打开本地程序

    最近甲方有这样一个需求:两套系统,一套基于Chrome开发,一套基于IE开发,想要在Chrome中增加一个链接,然后进入IE开发的系统.也就是说,想要在Chrome中创建链接跳转到IE浏览器指定页面, ...

最新文章

  1. java 注解报错_java注解验证接收参数 返回注解字段的错误
  2. 转-Redis学习手册(目录)
  3. 大白话解析模拟退火算法、遗传算法入门
  4. JAVA显式锁,各种锁分类
  5. DAL层修改sql表数据
  6. Python字符串的编码与解码(encode与decode)
  7. asp.net定时执行任务-解决应用池回收问题----转载
  8. springboot 删除路径下面所有文件_springboot文件上传删除下载
  9. 编写简单的连接MongoDB数据库C++程序 解决编译C++程序时链接MongoDB动态库失败的问题...
  10. 微软紧急更新 Windows 8.1 和 Server 2012 R2,修复两个严重漏洞
  11. 移动端页面开发资源总结
  12. axure 坐标扩散效果
  13. 【AI视野·今日CV 计算机视觉论文速览 第178期】Fri, 17 Jan 2020
  14. Sql server 2008
  15. 2017-11-11 白银下跌简要分析
  16. Android 点击屏幕空白处隐藏软键盘
  17. 《都挺好》苏明哲为什么会失业,美国程序员不好找工作吗?
  18. 计蒜客 - 蒜头君的任务
  19. postman传数组
  20. Int里-128到127的学问

热门文章

  1. LVC 播放器buffer自定义读写的方法
  2. 打开php文件url格式,url格式是什么
  3. 2021年冬季PAT乙级题解(C/C++语言)
  4. coldfusion_ColdFusion中的一周:1月30日至2月5日:一切
  5. Understanding Vertica Epochs
  6. LayoutTransiton实现简单的录制按钮
  7. centos7下搭建lnmp环境包含yum源直接安装和源码编译安装,以及php5.3和php7.6版本
  8. 微信公众号 创建菜单post数据格式
  9. Bootstrap免费字体和图标网站
  10. 录屏存储为gif图片