16. 在Wireshark中添加新协议
- WireShark编程基础
- 使用Lua开发简单扩展功能
- 使用WireShark开发新的协议解析器
- 测试新协议
WireShark支持Lua语言编写的脚本
16.1 WireShark编程基础
在WireShark中添加lua脚本
到WireShark安装目录中init.lua文件中进行配置
把需要加载的脚本加进来
协议解析
WireShark中主要是靠端口来判断协议的
可以打开视图——内部——解析器表——Integer Tables
应用层协议不是属于TCP就是UDP,因此我们找到TCP,可以看到解析是依靠端口
proto(name,desc)函数:注册协议,desc是描述
dissector(tvb,pinfo,tree):tvb表示要处理的报文缓存(应用层数据存到tvb中),pinfo表示报文,tree表示报文的解析树。
local foo123=Proto("foo1233","foo123 Protocol")
function foo123.dissector(tvb,pinfo,tree)
end
DissectorTable.get("tcp.port"):add(10005,foo123)
//该函数将协议添加到解析器表中,也就是说凡是发往10005端口的协议都按foo123协议来解析
保存为lua文件,放到WireShark安装目录中
编辑init.lua
如果脚本有问题的话,会报错
打开“视图——内部——解析器表”后会发现已经添加进解析器表了。
接下来设计协议 内容
使用lua构造协议
local foo123=Proto("foo1233","foo123 Protocol")
//注册字段
Trans_ID=ProtoField.uint16("foo123.ID","ID")
Msg_Type=ProtoField.uint16("foo123.Type","Type")
Msg_Data=ProtoField.uint32("foo123.Data","Data")
foo123.fields={Trans_ID,Msg_Type,Msg_Data}
function foo123.dissector(tvb,pinfo,tree)
pinfo.cols.protocol="foo123"//设置显示的协议名字
local subtree=tree:add(foo123,tvb(0))
subtree:add(Trans_ID,tvb(0,2))//添加到协议解析树中
subtree:add(Msg_Type,tvb(2,2))
subtree:add(Msg_Data,tvb(4,4))
end
DissectorTable.get("tcp.port"):add(10005,foo123)
构造数据包来验证
使用xcap这个工具,使用方法:
大体步骤:
1. 创建报文
2. 添加报文内容
3. 发送报文
- 创建报文组
右键报文组,创建报文组
- 添加报文
下一步,它是按照层来的,这个是数据链路层
网络层修改协议为TCP
目标端口改为10005
用全0填充就好了,保存,关闭
- 选择接口发送数据包,需要和WireShark抓包的网卡选择一样
启动接口
过滤foo123的数据包
发送数据包
可以看到能够解析foo123协议