一、lua脚本调用
旧版本的wireshark需要手动引入,而新的会自动加载。
先找到wireshark的安装目录: 帮助–>关于Wireshark –>文件夹 可以查看所有的路径,重新加载各种lua脚本快捷键是: ctrl+shift+L

自动加载:
将自定义的lua脚本放到 xxx \ Wireshark \ plugins 下
手动加载:
在安装目录下找到 init.lua文件,这是脚本的入口。在文件的最后引入你的文件

二、创建解析自定义数据的lua脚本

主要分为四个部分:

1、创建解析器对象
2、声明协议字段
3、定义解释器函数
4、把解析器注册到Wireshark解析表

完整脚本如下:

–[[
11.6.7.2. ProtoField.uint8(abbr, [name], [base], [valuestring], [mask], [desc])

Creates a ProtoField of an unsigned 8-bit integer (i.e., a byte).

Arguments

abbr
Abbreviated name of the field (the string used in filters).
name (optional)
Actual name of the field (the string that appears in the tree).
base (optional)
One of base.DEC, base.HEX or base.OCT.
valuestring (optional)
A table containing the text that corresponds to the values.
mask (optional)
Integer mask of this field.
desc (optional)
Description of the field.
Returns

A ProtoField object to be added to a table set to the Proto.fields attribute.
]]

–[[
0000 00 00 5e 01 01 01 00 24 ac ff fc 02 08 00 45 00
0010 00 48 00 00 00 00 01 11 d6 dc 01 01 01 01 e0 00
0020 00 c7 2d 1e 27 10 00 34 5e 65 01 00 1c 00 00 00
0030 00 00 00 00 00 00 00 00 00 00 01 00 00 24 ac ff
0040 fc 02 fa 00 00 00 00 00 00 00 00 00 00 00 5b 01
0050 4e 00 00 00 00 00

udp头后面是shrp头(16字节,4个u32)

u32 vesion:16:    01 00length:16; 1c 00u32 module:16,  00 00msg_type:16;  00 00u32 seq_id;         00 00 00 00u32 err_id;          00 00 00 00

shrp头后面是数据(28字节)

u16 status:8,     01nextheader:8; 00u8    mac[6];       (本机心跳口mac)  00 24 ac ff   fc 02s32 priority;       优先级fa  fa 00 00 00s32 interval;      00 00 00 00s32 hold_time;  00 00 00 00s32 jiffies;         5b 01   4e 00s32 switch_state;  00 00 00 00 00

]]
第一步:定义一个新协议
local NAME = “heartbeatProto”
local heartbeatProto = Proto(NAME, “hotb PROTOCOL”)

第二步: 声明协议的字段

vesion = ProtoField.uint16(NAME … “vesion”, “vesion”, base.HEX)
length = ProtoField.uint16(NAME … “length”, “length”, base.HEX)
module = ProtoField.uint16(NAME … “module”, “module”, base.HEX)
msg_type = ProtoField.uint16(NAME … “msg_type”, “msg_type”, base.HEX)
seq_id = ProtoField.uint32(NAME … “seq_id”, “seq_id”, base.DEC)
err_id = ProtoField.uint32(NAME … “err_id”, “err_id”, base.DEC)
status = ProtoField.uint8(NAME … “status”, “status”, base.DEC)
nextheader = ProtoField.uint8(NAME … “nextheader”, “nextheader”, base.DEC)
mac = ProtoField.ether(NAME … “mac”, “mac”)
priority = ProtoField.uint32(NAME … “priority”, “priority”, base.HEX_DEC)
interval = ProtoField.uint32(NAME … “interval”, “interval”, base.DEC)
hold_time = ProtoField.uint32(NAME … “hold_time”, “hold_time”, base.DEC)
jiffies = ProtoField.uint32(NAME … “jiffies”, “jiffies”, base.DEC)
switch_state = ProtoField.uint32(NAME … “switch_state”, “switch_state”, base.DEC)

heartbeatProto.fields = { vesion,length ,module,msg_type,seq_id,err_id,status,nextheader,mac,priority,interval,hold_time,jiffies,switch_state}
–local data_dis = Dissector.get(“data”)
– 解析器函数
–[[
下面定义VniProto解析器的主函数,这个函数由wireshark调用
第一个参数是 tvb 类型,表示的是需要此解析器解析的数据;
第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示;
第三个参数是 TreeItem 类型,表示上一级解析树;
–]]

第三步:定义解释器函数
function heartbeatProto.dissector(buffer, pinfo, tree)
if buffer:len() == 0 then return end
pinfo.cols.protocol = heartbeatProto.name --显示在wireshark界面的protocol列的名字

local subtree = tree:add(heartbeatProto, buffer(), "heartbeat Proto") --显示在数据查看-- 把udp的负载数据解析成两个分支在wireshark上显示,分别是shrp和payload
local shrp = subtree:add(heartbeatProto, buffer(0,16), "shrp Proto")
local payload = subtree:add(heartbeatProto, buffer(16,28), "payload Proto")--id_tree:append_text(", id: 0x" .. buffer(0,4))shrp:add(vesion, buffer(0,2))--字段信息添加到shrp分支shrp:add(length, buffer(2,2))shrp:add(module, buffer(4,2))shrp:add(msg_type, buffer(6,2))shrp:add(seq_id, buffer(8,4))shrp:add(err_id, buffer(12,4))payload:add(status, buffer(16,1))---字段信息添加到payload分支payload:add(nextheader, buffer(17,1))payload:add(mac, buffer(18,6))payload:add_le(priority, buffer(24,4))--little-endian,从0位置解析4个字节;big endian use add.payload:add(interval, buffer(28,4))payload:add(hold_time, buffer(32,4))payload:add(jiffies, buffer(36,4))payload:add(switch_state, buffer(40,4))
--subtree:add(fields.seq, buffer(4, 2)):append_text(" (0x"..buffer(4,2)..")")--local raw_data = buffer(6, buffer:len() - 6)
--Dissector.get("ip"):call(raw_data:tvb(), pinfo, tree)
-- 后续内容交给ip解析器继续解析,这里只进行vni头部解析

end

第四步:把解析器注册到Wireshark解析表
local udp_encap_table = DissectorTable.get(“udp.port”)
udp_encap_table:add(10000,heartbeatProto)

解析后效果如下图:

了解更多信息请参考:
https://www.wireshark.org/docs/wsdg_html_chunked/wsluarm.html

https://mika-s.github.io/wireshark/lua/dissector/2017/11/04/creating-a-wireshark-dissector-in-lua-1.html

wireshark解析自定义协议相关推荐

  1. lua语言学习之自定义wireshark插件来解析自定义协议

    lua语言学习之自定义wireshark插件来解析自定义协议 关于wireshark这个抓包工具 关于lua 使用lua写wireshark插件 wireshark接口文档 如何在wireshark使 ...

  2. wireshark解析rtp协议,流媒体中的AMR/H263/H264包的方法

    原文教程:http://hi.baidu.com/zjxiaoyu3/blog/item/22f9f18f32b45de5f11f3670.html 抓到完整的流媒体包之后,用wireshark打开, ...

  3. 自定义协议的命令解析器

    文章目录 前言 Switch...case类型命令解析的弊端 程序的改进目标 对命令解析器的分析 命令解析器的代码示例 用于代码工程需要解决的问题 可用于代码工程的命令解析器实现 一些新的认识 前言 ...

  4. 物联网架构成长之路(35)-利用Netty解析物联网自定义协议

    一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...

  5. 微软大佬带你深入解析websocket丨tcp自定义协议的设计丨服务器高并发场景的优化

    各个方面都离不开的websocket,只是你没有注意到 1. websocket的应用场景 2. tcp自定义协议的设计 3. 服务器高并发场景的优化 [Linux服务器开发系列]微软大佬带你深入解析 ...

  6. python爬虫最为核心的HTTP协议解析,及自定义协议的分析

    机器之间的协议就是机器通信的语法,只有按照这种语法发来的信息,机器之间才能相互理解内容,也可以理解为信息的一种格式. HTTP/IP协议是互联网最为重要的协议,没有HTTP/IP协议,也就没有互联跟不 ...

  7. JAVA自定义协议解析

    在JAVA中, 一般来说自定义协议都是涉及到物联网平台.字节数组和对象操作特别多. 使用netty, 然后使用byteBuffer 进行解包 或者 封包操作. 平时来说这个是没什么问题的. 但是 很多 ...

  8. 【Win10 UWP】URI Scheme(二):自定义协议的处理和适用场景

    上一篇提到Windows Store协议的使用,其实Windows Store协议仅是系统内建的一种协议规则.我们也可以自己定义一套规范的URI-Scheme,除了可以给其他App调用外,本应用也可以 ...

  9. 上下位机通讯协议_嵌入式中自定义协议的一些典型例子

    关于自定义协议,对于会的人很简单,对于不会的人就摸不着头脑.下面分享一些关于自定义协议的笔记. 什么是协议? 协议这个概念我觉得挺杂的.就像嵌入式的概念一样,说法不一,比如大家常常争论FPGA是不是嵌 ...

最新文章

  1. SpreadJS 在 Angular2 中支持绑定哪些属性?
  2. python统计并输出文件的行数_python实用统计文件行数 类似wc命令
  3. linux make menuconfig 快速查找
  4. VB.NET 从main函数里启动窗口
  5. 关于排版中经常见的问题的解决方法
  6. Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署
  7. 《Java大学教程》—第5章 数组
  8. LeetCode-剑指 Offer 03. 数组中重复的数字
  9. 机器人无限火力无限e符文_LOL:无限火力开黑指南 三大玩法让你快乐加倍
  10. 深入理解字符编码(ASCII、Unicode、UTF-8、UTF-16、UTF-32)
  11. vue中如何实现用JavaScript调用函数的方式使用一个通用的通知组件
  12. 一个小爱好竟然改变了全世界!Linux30年都经历了什么?
  13. linux ftp 实例
  14. LINUX下载编译tiff
  15. win7系统如何安装python_python安装教程详解|python下载安装教程步骤
  16. 计算垂直平面与三维线段交点
  17. MATLAB dir函数文件名排序问题
  18. android手机管理器在哪里打开,安卓手机re管理器在哪里打开图文教程
  19. 康奈尔大学计算机科学与工程,康奈尔大学的计算机专业介绍
  20. Qgis教程11:三维效果

热门文章

  1. 《Windows程序设计》读书笔十 菜单和其他资源
  2. 汽车早讯丨庞大集团董事长回应高管降薪;一嗨租车达成新私有化协议
  3. 网站关键词优化之seo标题写法,快速学会搜索引擎分词技术!
  4. 设计一个镜面影射算法,将一个二叉树的每个节点的左,右子结点交换位置
  5. 诗经 - 小雅 - 菁菁者莪
  6. 无痕模式后如何找到历史_辞职后,如何找到合适的工作?
  7. 7.4 反编译、篡改漏洞检测和重现
  8. 总结的pandas数据结构 和需要掌握的知识点
  9. SQL人的优势:实战大数据开发10分钟入门
  10. HEVC 序列参数集 SPS说明