【wireshark】插件开发(三):Lua插件 Dissector
// TODO: 部分内容需要修改
1. 骨架
首先新建一个文件,命名为foo.lua,注意此文件的编码方式不能是带BOM的UTF8,否则wireshark加载它时会出错(不识别BOM):
-- @brief Foo Protocol dissector plugin
-- @author zzq
-- @date 2015.08.12 -- create a new dissector
local NAME = "foo"
local PORT =
local foo = Proto(NAME, "Foo Protocol") -- dissect packet
function foo.dissector (tvb, pinfo, tree)
end -- register this dissector
DissectorTable.get("udp.port"):add(PORT, foo)
这是一个lua解析器的骨架:创建解析器对象、解析器函数、将解析器注册到wireshark解析表。
写完之后,将foo.lua拷贝到plugins/<版本号>目录即可,然后用文件打开之前抓的foo协议的Pcap文件foo.pcap。

是的,wireshark没有提示错误,然而什么变化也没有:当然,因为我们没有编写实际的解析代码。
依次打开”Internals”、”Dissector tables“菜单,选中”Interger tables”标签页,下拉滚动条,找到“UDP port“树节点,展开,再往下来,会发现FOO协议赫然在列,证明foo插件确实被正确加载了:

2. 完善
下面需要写一些具体的代码,首先是定义foo协议的各个字段:
-- create fields of foo
local fields = foo.fields
fields.type = ProtoField.uint8 (NAME .. ".type", "Type")
fields.flags = ProtoField.uint8 (NAME .. ".flags", "Flags")
fields.seqno = ProtoField.uint16(NAME .. ".seqno", "Seq No.")
fields.ipaddr = ProtoField.ipv4(NAME .. ".ipaddr", "IPv4 Address")
根据foo协议字段类型的不同,分别调用ProtoField的不同方法创建它们,其中第一个参数是字段的缩写,第2个参数是字段的全名,另外还有一些可选参数表示进制,掩码之类,这里略去。
然后编写具体的解析函数:
-- dissect packet
function foo.dissector (tvb, pinfo, tree)
local subtree = tree:add(foo, tvb())
local offset = -- show protocol name in protocol column
pinfo.cols.protocol = foo.name -- dissect field one by one, and add to protocol tree
local type = tvb(offset, )
subtree:add(fields.type, type)
subtree:append_text(", type: " .. type:uint())
offset = offset + subtree:add(fields.flags, tvb(offset, ))
offset = offset +
subtree:add(fields.seqno, tvb(offset, ))
offset = offset +
subtree:add(fields.ipaddr, tvb(offset, ))
end
wireshark约定解析器函数接口有3个参数,第一个是报文数据buffer tvb,第2个是报文信息结构pinfo,第3个是协议解析树tree。
subtree = tree:add(foo, tvb())为foo协议往协议解析树上添加了一个新节点subtree;
pinfo.cols.protocol = foo.name把wireshark报文列表上的”Protocol“列的文本置为foo协议名称”Foo”;
接下来,根据Foo协议的规范依次解析各字段,并把它们的信息加入到协议解析树。
编写完成后把新的foo.lua拷贝到插件目录,重启wireshark打开foo.pcap,显示效果如下:

也可以对foo协议应用显示过滤器:

【wireshark】插件开发(三):Lua插件 Dissector的更多相关文章
- Wireshark使用drcom_2011.lua插件协助分析drcom协议
drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...
- sonarqube插件开发(三) 调试插件
环境 windows + eclipse +sonarqube server 5.6.4 准备 新建一个maven项目,其中加入了一些插件所用的jar <project xmlns=" ...
- 【wireshark】插件开发(四):Lua插件Post-dissector和Listener
1. Post-dissector post-dissector和dissector不同,它会在所有dissectors都执行过后再被执行,这也就post前缀的由来.post-dissector的构建 ...
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
- 【eclipse插件开发实战】 Eclipse插件开发5——时间插件Timer开发实例详解
Eclipse插件开发5--时间插件Timer开发实例详解 这里做的TimeHelper插件设定为在菜单栏.工具栏提供快捷方式,需要在相应地方设置扩展点,最后弹出窗体显示时间. 在上一篇文章里创建好了 ...
- Bootstrap <基础三十一>插件概览
在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...
- word插件开发 运行时,插件不启动.
word插件开发 运行时,插件不启动. 查看插件信息时. 在禁用的应用程序加载项中. 启动禁用的插件: 点击转到. 选择你要启动的插件就可以了.
- Visual Studio2012 Lua插件--BabeLua
之前,找了好久VS2012的Lua插件,没有找到. 今天在http://www.cocoachina.com/bbs/read.php? tid-205043.html 看到了.cocos2dx-qu ...
- Lua IDE工具-Intellij IDEA+lua插件配置教程(Chianr出品)
Lua 编译工具IDE-Intellij IDEA 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Ch ...
随机推荐
- adb占用
输入netstat -ano | findstr "5037" .然后会弹出提示告诉你哪些进程占用了该端口,记住非0地址的后面的数字 打开任务管理器,点击“进程“,“查看”-“选择 ...
- ejb 和pojo , jboss 和 tomcat
EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范,因为企业信息系统开发中需要一个可伸缩的性能和事务.安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系 ...
- AMD、CMD、UMD 模块的写法
简介 最近几年,我们可以选择的Javascript组件的生态系统一直在稳步增长.虽然陡增的选择范围是极好的,但当组件混合匹配使用时就会出现很尴尬的局面.开发新手们会很快发现不是所有组件都能彼此“和平相 ...
- 构造函数constructor 与析构函数destructor(三)
(1)构造函数初始化列表: 1 class Test{ 2 int i; 3 public: 4 Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列 ...
- 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)
传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...
- 201709019工作日记--Java中的各种锁--未解决
1. Syncronized与ReentrantLock Synchronized比ReentrantLock进java标准早,因此一开始大家都是用它.相当于Java提供了一种封装的互斥锁机制,对于用 ...
- Java设计模式 -- 简单工厂模式(SimpleFactory)
一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...
- MFC中添加新的对话框
MFC工程中,除了系统自动生成的一些对话框之外,还需要根据自己的需求,添加新的对话框.这里总结下自己最近使用的方法. 首先,找到Resource View中自己新建的工程,然后右键,选择Add Cla ...
- AtCoder - 4351 Median of Medians(二分+线段树求顺序对)
D - Median of Medians Time limit : 2sec / Memory limit : 1024MB Score : 700 pointsProblem Statement ...
- html监听,键盘事件
<script type="text/javascript" language=JavaScript charset="UTF-8"> v ...