项目上需要用到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区可以显示出必要的信息,而且可以支持显示中文的。。
数据可以分开两段显示解析,方便解析读数据
协议字段可以筛选
搜一搜还有不少人用到这个插件功能的,希望能帮到你