使用lua作为wireshark的私有协议解析插件

本文介绍了如何使用Lua编写Wireshark的私有协议解析插件。通过创建Lua文件,定义协议、字段并创建解析器,详细阐述了如何处理数据流、构建协议解析树以及向Wireshark注册协议。最后,解释了如何根据端口号调整协议解析设置。
摘要由CSDN通过智能技术生成
--定义协议(第一个参数体现在过滤器中,第二个参数描述信息)
local hss_proto=Proto("Hss","Hss Protocol")

--定义字段(第一个参数为过滤条件,第二个参数为Tree列表中显示的名字,
--后面可以指定不同的进制显示方式:HEX为16进制,DEC为10进制)
--uint8,uint16,uint24,uint32分别表示1,2,3,4字节,即该字段的长度
local hss_proto_mark=ProtoField.uint16("hssMark","Mark",base.HEX,{[0x135d]="hss"})
local hss_proto_name=ProtoField.uint8("hssName","Name",base.HEX)
local hss_proto_version=ProtoField.uint8("hssVersion","Version",base.HEX)
local hss_proto_code=ProtoField.uint16("hssCode","Code",base.HEX,
						{
							[0x1B00]="JS_HSS_REGISTER_REQ",
							[0x1B01]="JS_HSS_REGISTER_ACK",
							[0X1B02]="JS_HSS_QUERY_REQ",
							[0X1B03]="JS_HSS_QUERY_ACK",
							[0X1B04]="JS_HSS_UNREGISTER_REQ",
							[0X1B05]="JS_HSS_UNREGISTER _ACK"
						}
					 )
local hss_proto_length=ProtoField.uint16("hssLength","Length",base.DEC)

local hss_proto_data=ProtoField.bytes("hssData","Data",base.NONE)
local data_tag=ProtoField.uint16("data_tag","Tag",base.HEX,
						{
							[0x1C00]="HANDLE",
							[0x1C01]="MSISDN",
							[0x1C02]="IMSI",
							[0x1C03]="IMEI",
							[0x1C04]="GWNAME",
							[0x1C05]="DOMAIN",
							[0x1C06]="EXPRIES",
							[0x1C07]="RESULT",
							[0x1C08]="ROUTER"
						}
					)
local data_length=ProtoField.uint16("data_length","Length",base.DEC)
local data_value_number=ProtoField.uint32("data_value_number","Value",base.DEC)
local data_value_string=ProtoField.string("data_value_string","Value")

--添加字段
hss_proto.fields={
	hss_proto_mark,
	hss_proto_name,
	hss_proto_version,
	hss_proto_code,
	hss_proto_length,
	hss_proto_data,
	data_tag,
	data_length,
	data_value_number,
	data_value_string
}


--buffer为数据流,pinfo为协议解析树上的信息,包括UI上的显示
function hss_proto.dissector(buffer,pinfo,tree)

	offset = pinfo.desegment_offset or 0
	--当前数据流长度
	local buffer_len=buffer:len()
	--该协议头部长度为8
	local hssheadlength=8
	local item=0

while true do
	item=item+1

 	if offset==buffer_len then
 		return
 	end

	--判断如果剩下的数据不到hssheadlength,即proto_length取不出来,就把pinfo.desegment_len返回
	--DESEGMENT_ONE_MORE_SEGMENT表示不知道后面传进来的数据有多少
	if offset+hssheadlength>buffer_len then
		pinfo.desegment_offset=offset
		pinfo.desegment_len=DESEGMENT_ONE_MORE_SEGMENT
		return pinfo.desegment_len
	end

	local proto_length=buffer(offset+6,2):le_uint()

	--剩下的数据能够取到hssheadlength的长度,判断剩下的数据能否够一条消息的长度,
	--如果不够也返回pinfo.desegment_len
	if offset+hssheadlength+proto_length>buffer_len then
		pinfo.desegment_len=DESEGMENT_ONE_MORE_SEGMENT
		pinfo.desegment_offset=offset
		return pinfo.desegment_len
	end

	--ui层显示hss
	pinfo.cols.protocol:set("hss")
	--ui上添加信息,源端口和目标端口
	pinfo.cols.info:set("hss protocol"..pinfo.src_port.."->"..pinfo.dst_port)

	--解析树上添加协议,取前8个字节(head头部信息),显示为Hss Proto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值