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脚本中添加如下代码:
--协议对象 构造函数第一个参数:显示在协议列,第二个参数:协议描述
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就可以看到效果啦

Wireshark是一款功能强大的网络协议分析工具,提供了丰富的功能和可扩展性。Wireshark编程接口为开发者提供了一组功能丰富的库,以便他们可以基于Wireshark进行自定义开发和集成。 Wireshark编程接口的核心是libwireshark库,它包含了与协议分析相关的重要函数和数据结构。使用libwireshark,开发者可以自定义Wireshark协议解析逻辑、捕获和分析数据包、以及生成分析报告。 Wireshark编程接口可以用于多种用途。首先,开发者可以使用编程接口开发自定义Wireshark插件。这些插件可以添加新的功能和特性,如协议解析、数据包过滤、统计功能等,从而满足特定的分析需求。 其次,开发者可以使用Wireshark编程接口开发自己的网络协议解析器。通过编程接口,开发者可以注册自定义协议解析器,使Wireshark能够解析和显示特定的网络协议,从而支持更广泛的网络协议分析。 此外,Wireshark编程接口还支持将Wireshark集成到其他应用程序中。开发者可以使用编程接口将Wireshark的核心功能嵌入到自己的应用程序中,从而实现网络协议分析的集成解决方案。 总之,Wireshark编程接口为开发者提供了丰富的功能和灵活性,使他们可以根据特定需求进行自定义开发和集成,从而更好地满足网络协议分析的需求。它为Wireshark的扩展和定制化提供了广阔的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值