用lua语言编写Wireshark插件解析汇报自定义协议详情

文章描述:-2022年4月14日发(作者:石洞)word用lua语言编写Wireshark插件解析自定义协议(y-01)Wireshark默认支持大量网络协议,我们可以在Wireshark主菜单“Internals>SupportProtocols(slow!)〞查看当前支持的所有协议。Wireshark1.6.2版本已支持1170种协议,包括我们熟悉的Diameter、GTP、FTP、SCTP等协议。上述

-

用lua语言编写Wireshark插件解析汇报自定义协议详情
2022年4月14日发
(作者:石洞)

word

用lua语言编写Wireshark插件解析自定义协议

(y-01)

Wireshark默认支持大量网络协议,我们可以在Wireshark主菜单“Internals>Support

Protocols(slow!)〞查看当前支持的所有协议。Wireshark1.6.2版本已支持1170种协议,包括

我们熟悉的Diameter、GTP、FTP、SCTP等协议。

上述都是业界的通用协议,然而对我们产品的自定义协议,Wireshark是不得而知的,抓

包后只能看到一串二进制码流,导致开发调试或者测试分析效率较低。

有什么方法让Wireshark也能解析自定义协议呢?本文介绍的用lua编写Wireshark解析

器插件就是一种常用方法。Wireshark软件内嵌一个lua语言执行引擎并提供一系列lua函数

接口,从而满足用户各种各样的协议解析目的。

下面以一个简单的自定义协议为例,演示如何编写Wireshark解析插件。不过本文只是

业余学习的笔记和简单实践,不能覆盖“lua编写Wireshark解析器插件〞的所有知识点〔

全面的介绍请参考Wireshark软件自带手册第11章“LuaSupportinWireshark〞,只是开源软件的手册

似乎总是不够详尽。

〕。

1.配置Wireshark执行lua脚本

通过Wireshark主菜单“Help>AboutWireshark〞可以查看当前安装版本已经内嵌Lua

5.1执行引擎。默认安装情况下Wireshark会在安装路径下生成一个,它是Wireshark

启动过程执行的第一个lua脚本。一般来说,我们可以在此文件中添加dofile函数调用其他

lua脚本,实现各种扩展目的。例如,默认安装后文件末尾有一句:

dofile(DATA_DIR.."")

此语句执行了安装目录下的脚本,该脚本也是Wireshark自带的,用途是在主菜单Tool下创

建一个子菜单Lua。我们甚至可以在上述语句之前添加注释--符来取消它。

dofile是lua根底库提供的一个函数,用途如下:

dofile(filename)

lledwithoutarguments,

dofileexecutesthecontentsofthestandardinput(stdin).Returnsallvaluesreturnedbythec.

Incaseoferrors,dofilepropagatestheerrortoitscaller(thatis,dofiledoesnotruninprotected

mode).我们下来编写的解析器也是以.lua脚本形式保存,然后在文件末尾中添加一个

dofile调用即可。

2.需要解析的自定义协议假设我们需要基于UDP协议实现一种根据员工ID查询员工某某的信息服务,客户端向

服务器端的12345端口发送QueryRequest,服务器返回应答QueryRespe,数据结构如下:

消息名称

QueryRequest

QueryRespe

消息结构

Uint16usMsgType;//消息类型,查询请求=0

Uint32uiEmployeeID;//员工工号

Uint16usMsgType;//消息类型,查询应答=1

Uint32uiEmployeeID;//员工工号

word

Uint16usQueryResult;

//查询操作结果,成功=0,失败=1

Char[32]szEmployeeame;//查询结果,如果成功,填写员工某某;

否如此填写失败原因假设员工数据库信息有两条记录如下:

员工ID

1

2

员工某某

LiuDehua

ZhangXueyou

将上述协议实现之后,服务器端部署在192.168.56.1,客户端在192.168.56.22。以下就是

启动1次查询过程的

Wireshark抓包结果:

上图是QueryRequest消息,uEmployeeID指定为1。

上图是QueryRespe消息,返回uEmployeeID=1的查询结果。

从上面2个图可见,Wireshark已经自动地把以太网帧、IP报文、UDP数据报都解析出

来,唯独我们自定义协议的消息无法解析,以Data来显示。把上述抓包结果保存到一个pcap

文件中。下面我们逐步实现对该协议的解析。

ark的lua函数接口

协议

在Wireshark中Proto主要用途是声明一个新的协议,进而可以给它编写解析器函数。

3.1.1.:声明一个新的协议

例如:

my_proto=Proto("myProto","MyProtocolforQueryEmployee","MySelf-definedProtocol")

3.1.2.:解析器函数

例如:

functionmy_tor(buffer,pinfo,tree)

ol:set("myProto")

:set("ThisisamessageofmyProto")

end

dissector函数的第一个参数buffer对应需要解析的二进制码流,第二个参数pinfo对应Packet

List窗口的信息,tree是PacketDetails窗口的树结构,如如下图所示:

word

Wireshark已经为我们提供了处理这三个参数的接口了。有关buffer的luaAPI,可以参

考官方手册“forhandlingpacketdata〞,如如下图所示:

有关pinfo的luaAPI,可以参考官方手册“ingpacketinformation〞,如如下

图所示:

有关tree的luaAPI,可以参考官方手册“informationtothedissectiontree〞,

如如下图所示:

把上述代码保存到一个d:/脚本中,并在脚本中末尾增加一句:

word

dofile("d:/")

然后启动Wireshark程序,就可以在协议列表中到我们定义的协议了,如如下图所示:

3.2ProtoField协议字段(域)但凡协议都有具体的字段,Wireshark提供了25种函数可以创建各种类型字段〔详细请

参考帮助文档ield〕。我前面定义的协议字段类型很简单,只有16位无符号整

数、32位无符号整数、32字符长度的字符串三种。下面是各字段的具体lua代码实现:字段定义

Uint16usMsgType

Uint32uiEmployeeID

Uint16usQueryResult

Char[32]

szEmployeeame

Lua定义

localf_usMsgType=(“usMsgType〞,“MsgType〞,,{[0]

="QueryRequest",[1]="QueryRespe"})

localf_uiEmployeeID=32(“uiEmployeeID〞,

“EmployeeID〞,)

localf_usQueryResult=32(“usQueryResult〞,

“QueryResult〞,,{[0]="Success",[1]="Failed"})

localf_szEmployeeame=ProtoField.

(“szEmployeeame〞,“Employeeame〞)

string

然后我们把这些字段加到前面定义的Proto中去:

my_={f_usMsgType,f_uiEmployeeID,f_usQueryResult,f_szEmployeeame}

把上述代码追加到d:/脚本中,重启Wireshark就可以看到MYPROTO协议已经

具有4个字段了:

我们还可以在主窗口的“显示过滤表达式〞快捷方式中,指定上述字段来做过滤:

word

如如下图所示,左侧Fieldname窗口中选择了usMsgType后,右侧显示了我们前面预定义

的两个取值:

torTable协议解析器表

DissectorTable就是假如干协议解析器(Dissector)聚集成Table,Wireshark默认支持了一系

列Dissector和DissectorTable,在主菜单“Internals>Dissectortables〞可以查看当前已支持

的DissectorTable,如如下图所示:

图中所示的UDPport就是一个DissectorTable,它底下包含很多不同端口号,根据具体

UDP端口号调用具体Dissector来解析协议消息。例如UDP端口号69是TFTP协议采用的

知名端口,Wireshark遇到这种消息将自动调用TFTP协议解析器来处理。本文介绍的自定

义协议基于UDP端口号12345,所以我也把它添加到UDPport这个DissectorTable下。

3.2.1.:返回指定的DissectorTable实例

下面的代码首先通过获取了“〞表:

Localudp_port_table=("")

3.2.2dissectortable:add

:向DissectorTable实例中添加dissector

Localmy_port=12345

Udp_port_table:add(my_port,my_proto)

word

把上述代码追加到d:/脚本中,重启Wireshark就可以看到

MYPROTO已经增

加UDPport下面:不但如此,我们打开前面抓包的文件,可以看到有些东西悄悄变化了:说明前面的解析器函数已经被正确调用了,至此我们已经完成了一个解析器雏形。下面将

完善解析器函数,使之真正能够解析协议消息。

4.自定义协议的解析器函数我们要怎么呈现解析结果呢?看看如下图是Wireshark默认对UDP协议的解析结果:

我们自定义协议的解析也将生成一个类似的树状结构。前面我们已经写了一个简单的

my函数函数如下所示:

functionmy_tor(buffer,pinfo,tree)

ol:set("myProto")

:set("ThisisamessageofmyProto")

end

参数tree

就是我们要构造的树状结构的根节点,通过下面两句代码添加一个子节点代表

自定义协议:

localbuffer_len=buffer:len()

localmyProtoTree=tree:add(my_proto,buffer(0,buffer_len),"MyProtocolforQueryEmployee

Information")

第1句表示获取buffer参数的字节长度;第二句调用了tree:add方法创建一个子节点并复制

给myProtoTree,第1个参数是协议,第2个参数是buffer数据X围,第3个参数是子节点

的标题,作用类似于〞UserDatagramProtocol….〞那一行。下面是解析第1个字段〞消息类型〞的代码:

word

localoffset=0

localusMsgType=buffer(offset,2):le_uint()

ifusMsgType<=1then

myProtoTree:add_le(f_usMsgType,buffer(offset,2))

else

:set("InvalidMessageType("..usMsgType..")")

return

end

offset=offset+2

第1句定义一个局部变量offset表示当前字段在buffer缓冲区的偏移量,后续每解析一个字

段都要设置一下偏移量。第2句表示获取buffer的前2个字节并按小字节序将之转换成无符

号整数;下来是根据usMsgType取值X围做一个简单的有效性判断,如果小于等于1就在

树状结构下增加一个节点,否如此就打印非法消息类型并立即退出。下面解析是第2个字段“员工工号〞的代码:

myProtoTree:add_le(f_uiEmployeeID,buffer(offset,4))

offset=offset+4

ifusMsgType==0thenreturn

end

第1句继续增加了一个节点,获取buffer的下4个字节,然后按小字节序将之转换成无符号

整数复制给f_uiEmployeeID;第3句判断如果当前消息是QueryRequest,如此解析完成。

下面解析是QueryRespe的第3个字段“查询操作结果〞的代码:

myProtoTree:add_le(f_usQueryResult,buffer(offset,2))

offset=offset+2

下面解析是QueryRespe的第4个字段“查询结果〞的代码:

myProtoTree:add(f_szEmployeeame,buffer(offset,buffer_len-offset))

return把上述代码添加到my末尾,然后重启Wireshark打开抓包文件。这个时候解析自定义

协议的结果如下:

QueryRequest消息的解析:

QueryRespe消息的解析:

word

至此,我们完成了一个简单的自定义协议解析插件。回顾一下,发现上图每一行的Info列都只是打印“ThisisamessageofmyProto〞显得呆

板哈,何不打印些有用的信息呢?所以稍加改良就显示如下:

5.附件

本文完成的lua

脚本:

本机Wireshark的

脚本:

本文自定义协议的抓包文件:

本文自定义协议的服务器端和客户端ruby

实现:

-

用lua语言编写Wireshark插件解析汇报自定义协议详情

发布时间:2022-04-14 11:22:09
文章版权声明:除非注明,否则均为IT技术网-学习WEB前端开发等IT技术的网络平台原创文章,转载或复制请以超链接形式并注明出处。

发表评论

评论列表 (有 18 条评论,46人围观)
上海恒盛豪庭V铁粉30 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
set("ThisisamessageofmyProto")enddissector函数的第一个参数buffer对应需要解析的二进制码流
风行工作室V铁粉13 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
左侧Fieldname窗口中选择了usMsgType后
qqaV铁粉15 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
不过本文只是业余学习的笔记和简单实践
过敏性鼻炎的偏方V铁粉9 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
然而对我们产品的自定义协议
生殖系统图V铁粉19 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
然后在文件末尾中添加一个dofile调用即可
任务栏修复V铁粉27 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
2)
南洋V铁粉28 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
pinfo
中国家电V铁粉11 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
抓包后只能看到一串二进制码流
包租公V铁粉27 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
set("myProto")
济南吃喝玩乐V铁粉8 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
GTP
儿童医院网站V铁粉25 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
右侧显示了我们前面预定义的两个取值:torTable协议解析器表DissectorTable就是假如干协议解析器(Dissector)聚集成Table
腹泻食疗V铁粉18 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
Wireshark已经自动地把以太网帧
机选双色球V铁粉20 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
如果成功
中国国家形象宣传片V铁粉12 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
“Employeeame〞)string然后我们把这些字段加到前面定义的Proto中去:my_={f_usMsgType
限购城市V铁粉8 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
重启Wireshark就可以看到MYPROTO协议已经具有4个字段了:我们还可以在主窗口的“显示过滤表达式〞快捷方式中
tuxedoV铁粉26 minutes ago Google Chrome 93.0.4577.82 Windows 10 x64
我们可以在Wireshark主菜单“Internals>SupportProtocols(slow!)〞查看当前支持的所有协议
默默软件V铁粉1 minute ago Google Chrome 93.0.4577.82 Windows 10 x64
并在脚本中末尾增加一句:worddofile("d

最近发表

随便看看

热门文章

标签列表