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就可以看到效果啦

相关推荐
z***y8624 天前
GitGraphQLAPI
oracle·udp·wireshark
00后程序员张6 天前
全面解析网络抓包工具使用:Wireshark和TCPDUMP教程
网络·ios·小程序·uni-app·wireshark·iphone·tcpdump
inter_peng7 天前
【DICOM网络问题】基于tcpdump和wireshark解决服务器无法连接打印机打印胶片的问题
测试工具·wireshark·tcpdump
BINGCHN7 天前
流量分析入门(二):wireshark的使用
网络·测试工具·wireshark
AI绘画小337 天前
【网络安全】Wireshark 抓包过滤:源 / 目的 IP 过滤 + 命令大全
数据库·tcp/ip·测试工具·安全·web安全·wireshark
IT199515 天前
Wireshark笔记-DNS流程与数据包解析
笔记·测试工具·wireshark
minglie118 天前
Wireshark抓HTTPS协议包
网络·测试工具·wireshark
2501_9160088921 天前
HTTPS 请求抓包,从原理到落地排查的工程化指南(Charles / tcpdump / Wireshark / Sniffmaster)
ios·小程序·https·uni-app·wireshark·iphone·tcpdump
微小冷1 个月前
WireShark抓包http,解密https
http·https·edge·wireshark·ssl·解密