--定义协议(第一个参数体现在过滤器中,第二个参数描述信息)
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
使用lua作为wireshark的私有协议解析插件
最新推荐文章于 2024-06-08 17:36:05 发布
本文介绍了如何使用Lua编写Wireshark的私有协议解析插件。通过创建Lua文件,定义协议、字段并创建解析器,详细阐述了如何处理数据流、构建协议解析树以及向Wireshark注册协议。最后,解释了如何根据端口号调整协议解析设置。
摘要由CSDN通过智能技术生成