Wireshark添加自定义协议解析

最终效果如下:

参考文档:https://mika-s.github.io/topics/

此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议

安装Wireshark

https://www.wireshark.org/上下载安装包安装即可。我的安装路径是`D:\Install\Wireshark`,在Wireshark的菜单:帮助-\>关于->文件夹中有安装位置:

要解析的协议

本次要解析的协议是UDP协议,在UDP基础上封装了一层应用层协议。协议明细如下:

编写脚本前需要明确的几个对象

  • Proto:协议对象,有一个name的属性,在构造函数第一个参数时传入,决定了这里显示什么(配合函数中的赋值)官方文档

  • ProtoField:协议字段,有如下方法。官方文档

    • uint8/int8(filter_string,display_name,display_type)
    • uint16/int16(filter_string,display_name,display_type)
    • uint32/int32(filter_string,display_name,display_type)
  • buffer:tvb对象 官方文档

编写插件脚本

lua文件的位置有两种位置可以放:

  • 任意位置,此时需要在init.lua中添加dofile把lua文件添加进去
  • plugins文件夹,此时wireshark启动时自动执行,按Ctr+Shift+L会重新加载
    我们采用第2中方式
    D:\Install\Wireshark\plugins中新建一个test.lua文件
    在lua脚本中添加如下代码:
lua 复制代码
--协议对象 构造函数第一个参数:显示在协议列,第二个参数:协议描述
local my_request=Proto('myrequst','my custom request')

-- 要显示的字段,构造函数第一个参数:用于上方搜索栏过滤的 第二个参数:显示在下方协议中的字段 第三个字段:显示十进制还是十六进制
local time_second=ProtoField.uint8("myrequst.time_second","秒",base.HEX)
local time_minute=ProtoField.uint8("myrequst.time_minute","分",base.HEX)
local time_hour=ProtoField.uint8("myrequst.time_hour","时",base.HEX)
local time_day=ProtoField.uint8("myrequst.time_day","天",base.HEX)
local time_month=ProtoField.uint8("myrequst.time_month","月",base.HEX)
local time_year=ProtoField.uint8("myrequst.time_year","年",base.HEX)

local group=ProtoField.uint8("myrequst.group","组",base.HEX)

local cmd=ProtoField.uint16("myrequst.cmd","命令",base.DEC)

local len=ProtoField.uint32("myrequst.length","body长度",base.DEC)

-- 将字段添加到协议对象
my_request.fields={time_second,time_minute,time_hour,time_day,time_month,time_year,group,cmd,len}

-- 此方法返回bool,返回true表示自定义的协议验证通过,会传入三个参数
-- buffer:包,去掉继承协议之后的内容。比如继承udp,那udp的报文就被去掉了,buffer只表示udp的应用层内容
-- pinfo:显示抓包内容列表的信息。赋值协议名称时会用到
-- tree:下方的树结构
local function checker(buffer,pinfo,tree)
    local length=buffer:len()

    if length<26 then
        return false
    end

    -- 头判断
    if  buffer(0,1):uint()~=0x48 or
        buffer(1,1):uint()~=0x54 or
        buffer(2,1):uint()~=0x56 or
        buffer(3,1):uint()~=0x58 or
        buffer(4,1):uint()~=0x41 or
        buffer(5,1):uint()~=0x58 or
        buffer(6,1):uint()~=0x42 or
        buffer(7,1):uint()~=0x58 or
        buffer(8,1):uint()~=0x49 or
        buffer(9,1):uint()~=0x58 then
        return false
    end

    -- 赋值协议列
    pinfo.cols.protocol=my_request.name

    --字段解析
    local subtree=tree:add(my_request,buffer(),"我自定义的请求")

    subtree:add(time_second,buffer(10,1))
    subtree:add(time_minute,buffer(11,1))
    subtree:add(time_hour,buffer(12,1))
    subtree:add(time_day,buffer(13,1))
    subtree:add(time_month,buffer(15,1))
    subtree:add(time_year,buffer(16,1))
    subtree:add(group,buffer(18,1))
    subtree:add_le(cmd,buffer(19,1))
    subtree:add(len,buffer(21,4))

    return true
end
-- 注册,让wireshark解析包的时候会调用checker
my_request:register_heuristic("udp",checker)

保存lua脚本之后,按Ctr+Shift+L就可以看到效果啦

相关推荐
星LZX3 小时前
WireShark入门学习笔记
笔记·学习·wireshark
迃幵chen16 小时前
wireshark-网络分析工具
网络·测试工具·wireshark
行者记2 天前
ffmpeg命令——从wireshark包中的rtp包中分离h264
测试工具·ffmpeg·wireshark
htt7896 天前
wireshark复制数据
网络·测试工具·wireshark
scoone6 天前
Ubuntu下网络抓包工具:Wireshark与Tcpdump实例解析
网络·wireshark·tcpdump
灯火不休ᝰ14 天前
[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)
网络协议·网络安全·https·wireshark·1024程序员节·网络信息安全·数据包
dadalaohua17 天前
【Wireshark笔记】如何在Wireshark中使用过滤器去除TCP Dup ACK
网络·笔记·学习·tcp/ip·wireshark
mzhan01717 天前
Linux: network: wireshark IO图的一个问题
网络·测试工具·wireshark
荣世蓥21 天前
5.计算机网络_抓包工具wireshark
linux·计算机网络·wireshark
风清扬_jd22 天前
wireshark 解密浏览器https数据包
服务器·https·wireshark