您现在的位置:首页 > 技术服务 > 技术资料

用Lua语言为wireshark编写HDLC协议解析插件

 

背景知识


Wireshark是最常用的抓包工具,除了免费开源、功能强大的优点外,还能够为自定义协议编写解析插件。

如果要分析调试HDLC协议,我们可以利用HDLC协议转换器,把HDLC帧转换为UDP报文,就可以利用wireshark抓取协议数据进行分析了。

Wireshark不支持的HDLC协议的解析,因此要自己编写协议解析插件(dissector)。

Lua是编写解析插件最佳的语言。

Wireshark对Lua的支持
Wireshark已经内置了lua支持,如下图所示。

阅读wireshark帮助的Lua Support in Wireshark章节,有比较详细的帮助和介绍。

编写hdlc.lua脚本文件

HDLC帧格式说明见:HDLC协议知识简介

我们现在编写一个脚本,把HDLC帧的地址字段、控制字段、信息字段和FCS字段解析出来,代码如下:

do
-- 增加协议
local yacer_hdlc_proto = Proto("yacer-HDLC","yacer UDP HDLC")
-- 定义协议字段
local hdlc_address = ProtoField.uint8("address","address",base.HEX)
local hdlc_control = ProtoField.uint8("control","control",base.HEX)
local hdlc_info = ProtoField.bytes("infomation","information",base.HEX)
local hdlc_crc = ProtoField.uint16("crc","crc",base.HEX)
yacer_hdlc_proto.fields = {hdlc_address,hdlc_control,hdlc_info,hdlc_crc}
-- 解析
function yacer_hdlc_proto.dissector(buf,pkt,root)
local buflen = buf:len()
local t = root:add(yacer_hdlc_proto,buf(0,buflen),"HDLC Frame")
t:add(hdlc_address,buf(0,1))
t:add(hdlc_control,buf(1,1))
t:add(hdlc_info,buf(2,buflen-4))
t:add(hdlc_crc,buf(buflen-2,2))
end

-- 声明UDP端口
local udp_encap_table = DissectorTable.get("udp.port")
udp_encap_table:add(8421,yacer_hdlc_proto)

end
文件保存为hdlc.lua,假设保存在D盘,文件完整路径为:d:/hdlc.lua。

加载hdlc.lua

默认安装情况下Wireshark会在安装路径下生成一个init.lua,它是Wireshark启动过程执行的第一个lua脚本。一般来说,我们可以在此文件中添加dofile函数调用其他lua脚本,实现各种扩展目的。

在init.lua最后增加一行: dofile("d:/hdlc.lua")。

解析效果
启动wireshark,抓取HDLC报文,从下图可看出解析器已经工作。

如果您希望进一步解析HDLC帧的信息字段,可以在hdlc.lua基础上继续完善,以显示更多的自定义字段。
这里是hdlc.lua的源代码,欢迎下载。

如果您愿意分享自己的定制版本,可以把源代码及说明发至 yacer@yacer.cn ,我们统一整理后放在亚ce官网上,从而让更多的参与者能够对其检查、修改、完善和使用。