wireshark解析自定义协议
加载配置
安装根目录下init.lua
文件为wireshark打开之后、读取或者抓取数据之前加载的配置文件,这里面包含wireshark对数据的解析配置,如果想要加载自己编写的lua插件,可在此文件末尾追加dofile(DATA_DIR.."dtd_gen.lua")
解析原理
协议使用端口查看:视图--内部--支持协议列表(Dissector Tables)--Integer Tables--TCP port
新协议注册
- 添加新协议:
local test=Proto(name,desc)
- 添加解析器:
function test.dissector(tvb.pinfo,tree) end
- 注册新协议到wireshark中:
DissectorTable.get('表名'):add(端口,test)
保存lua文件到全局配置
中
(全局配置位置:帮助--关于wireshark--文件夹--全局Lua插件) - Lua插件
local learn = Proto('learn','Learn Protocol')
function learn.dissector(tvb,pinfo,tree)
end
DissectorTable.get('tcp.port'):add(10002,learn)
# (tvb,pinfo,tree)
# tvb 缓冲数据包
# pinfo 协议信息
# tree 展示的树状结构
解释器编写
- dissector函数,具体数据包解析在wireshark中的树状结构
- 明确协议格式:Learn协议
2.1 Trans_ID(16bit)
2.2 Msg_Type(16bit)
2.3 Msg_Data(32bit)
2.4 Lua语言中的ProtoField表示协议字段
可使用uint8、uint16、uint32等类型
ProtoField.uint16("learn.ID","ID")
ProtoField.uint16("learn.Type","Type")
ProtoField.uint32("learn.Data","Data")
2.5 合并字段
learn.fields={Trans_ID,Msg_Type,Msg_Data} - 解析函数
3.1 设置wireshark报文列表上protocol列文本
pinfo.cols.protocol=learn.name
或者直接指定协议名称
pinfo.cols.protocol = "learn"
3.2 添加树状新节点
local subtree = tree:add(learn,tvb(0))
3.3 添加协议解析树
subtree:add(Trans_ID,tvb(0,2))
subtree:add(Msg_Type,tvb(2,2))
subtree:add(Msg_Data,tvb(4,4)) # tvb(4,4) 起始位置为4,偏移4字节
- Lua插件(learn.lua)
local learn = Proto('learn','Learn Protocol')
Trans_ID = ProtoField.uint16("learn.ID","ID")
Msg_Type = ProtoField.uint16("learn.Type","Type")
Msg_Data = ProtoField.uint32("learn.Data","Data")
learn.fields = {Trans_ID,Msg_Type,Msg_Data}
function learn.dissector(tvb,pinfo,tree)
pinfo.cols.protocol = "learn"
local subtree = tree:add(learn,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(10002,learn)
新协议测试
- xcap介绍
下载 - 新建数据包
packergroup(报文组)--creat packet group(创建报文组)--名称“learn_packet”--报文界面左上角+号,添加报文--双击添加到报文进行编辑
注意:上图中Marker(Hex)的值全部设为0
- wireshark抓包看新协议