WireShark 自定义协议Lua插件编程备忘

项目上需要用到UDP传输私有协议栈数据

需要抓包分析数据的正确性

与其一包包看原始数据,不如自己编一个插件直接解析

我主要是参考了这个大佬的教程

你的阳光

虽然写于11年前,但是依然很有参考价值

但是其中有些语法现在的Wireshark不支持了,改了!!

 我这里附上自己编的插件的Lua源码供参考,涉及公司的部分已经去掉了【20-11-22更新很多新玩法】

do
-----------------------------------------------------------------

-----------------------------------------------------------------
--基于UDP协议  
local udp_table = DissectorTable.get("udp.port")
local xxxx = Proto("xxxx", "xxxxxxxx","xxxx")
-- xxxx表示你自己的协议名字,后面第一个引号是协议显示的名字,在后面的就是描述了
--协议端口号
local NAME = "xxxx"
--注意这里端口号其实可以绑定多个
local local_port = 14220
-- local local_port1 = 14221
-- local local_port1 = 14222
-- local local_port1 = 14223
-- 绑定你希望的端口号


--定义协议解析字段树
local fields = xxxx.fields

fields.XXX = ProtoField.uint8(NAME.. ".XXX","XXX",base.DEC)
-- XXX就是协议中字段的名字,uint8就是数据的类型,base.DEC是指十进制
-- 具体语法,参考WireShark Lua API https://www.wireshark.org/docs/wsdg_html_chunked/wsluarm_modules.html
-- (NAME.. ".XXX","XXX",base.DEC)这样写就可以实现自定义协议字段的筛选
-- 也就是你在过滤器那里打协议名.【点】,然后你就可以看到你填写的字段,然后就可以做筛选了


--协议分析器
function xxxx.dissector(buffer, pinfo, tree)
pinfo.cols.protocol:set("xxxx")

local len = buffer:len()
-- local xxxx_ProtoTree =tree:add(xxxx, buffer(0, len),"xxxx")用这句可以把数据提取到一个树下
-- 然后一个解析器,你可以弄多个树,因为有些协议不同数据域有不同的含义
-- 这样显示出来就很美观了
-- 对应字段在添加的时候就需要你填写对应的树下
-- tree树是最顶层的树

local xxxx_ProtoTree = tree:add(xxxx, buffer(0, len),"xxxx")
-- tree:add(xxxx, buffer(0, len),"xxxx")把读取到指定长度len的数据都添加进来
local offset = 0
-- tree:add_le(XXX, buffer(offset, 1))
-- 这里的add_le是数据按小端的方式添加到对应字段,大端就是add
-- buffer(offset, 1),取0-1位数据,共一个字节
-- 以此类推
-- offset = offset + 1就可以偏移到你希望的数据上
-- if((buffer(1,1):uint() == 128) or ((buffer(1,1):uint() == 129)))
-- 类似这样可以取某位数据做判断
-- xxxx_ProtoTree:append_text(": hhhhhh" )  
-- 这个表示字段添加一个文字描述

-- 这两句可以提取出数据的源端口号和目的端口号
-- local src_port = pinfo.src_port
-- local dst_port = pinfo.dst_port
-- 这两句可以提取出MAC地址,如果是查得到的地址,则是厂家名,如果没有就是数字的MAC地址
-- local src_net_addr = pinfo.dl_src
-- local dst_net_addr = pinfo.dl_dst
-- 用这些可以特定识别出数据来自哪里,如果你很懂lua编程的话
-- 下面这句可以在info栏打印出信息,至于打啥,可以自己试试,我比较需要端口号
-- pinfo.cols.info="XXXXX".."("..src_port.."->"..dst_port..")"
-- 其他的语法就参考Lua和API 手册了
end

--增加协议到Wireshark中,有几个端口号写几条
udp_table:add(local_port, xxxx)
-- udp_table:add(local_port1, xxxx)
-- udp_table:add(local_port2, xxxx)
-- udp_table:add(local_port3, xxxx)
-- ...
end

如果你按照上面试着编一编,可以得出很不错的解析效果【涉及的敏感隐私字段都打码了】

Info区可以显示出必要的信息,而且可以支持显示中文的。。

数据可以分开两段显示解析,方便解析读数据

协议字段可以筛选

 

搜一搜还有不少人用到这个插件功能的,希望能帮到你 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值