【wireshark】插件开发(二):Lua插件开发介绍
1. Wireshark对Lua的支持
本节相关内容可参考Wireshark开发指南第10章”Lua Support in Wireshark”。
Wireshark集成了Lua解释器,以支持Lua脚本(自己编译的话根据编译配置决定是否支持Lua)。
启动wireshark,依次点击“Help”,”About Wireshark“菜单,在打开的对话框中的”Wireshark”标签页上观察版本信息,如果如下图一样显示With Lua,说明此版本支持Lua插件。

然后打开wireshark主目录下的init.lua文件,确保disable_lua的值为false,即开启了lua:

在Wireshark中,可以使用Lua编写以下几种插件:
- Dissectors
协议解析器,用于解析报文 - Post-dissectors
后置解析器,在其他解析器之后被调用 - Listeners
监听器,用来收集解析后的信息
还需要注意:
- wireshark启动时,会调用下图目录中的init.lua,顺序是先调用global目录的,再调用personal目录的;

- 通过命令行参数:
-X lua_script:my.lua
传入的my.lua将会在Init.lua之后被调用 - 所有的Lua脚本会在解析器注册过程的最后被调用,而这一过程是在wireshark启动时就发生的,早于报文被读取的时刻。
2. Lua插件API简介
本节相关内容可参考Wireshark开发指南第11节”Wireshark’s Lua API Reference”。
Wireshark提供了丰富的Lua API供开发者使用,这里只介绍下文需要用到的一些。
2.1 Proto
表示一个新的Protocol,在Wireshark中Protocol对象有很多用处,解析器是其中主要的一个。主要接口有:
| 接口 | 说明 |
|
proto:__call (name,desc) |
创建Proto对象。name和desc分别是对象的名称和描述,前者可用于过滤器等 |
| proto.name | get名称 |
| proto.fields | get/set字段 |
| proto.prefs | get配置项 |
| proto.init | 初始化,无参数 |
| proto.dissector | 解析函数,3个参数tvb,pinfo,tree,分别是报文内容,报文信息和解析树结构 |
|
proto:register_heuristic (listname, func) |
为Proto注册一个启发式解析器,被调用时,参数func将被传入与dissector方法相同的3个参数 |
2.2 ProtoField
表示协议字段,一般用于解析字段后往解析树上添加节点。根据字段类型不同,其接口可以分为两大类。
整型:
• ProtoField.{type} (abbr, [name], [desc],[base], [valuestring], [mask])
type包括:uint8, uint16, uint24,
uint32, uint64, framenum
其他类型
• ProtoField.{type} (abbr, [name], [desc])
type包括:float, double, string,
stringz, bytes, bool, ipv4, ipv6, ether,oid, guid
这些接口都会返回一个新的字段对象。方括号内是可选字段,花括号内是可替换的类型字段。
2.3 Tvb
Tvb(Testy Virtual Buffer)表示报文缓存,也就是实际的报文数据,可以通过下面介绍的TvbRange从报文数据中解出信息。主要接口有:
| 接口 | 说明 |
| tvb:__tostring() | 将报文数据转化为字符串,可用于调试 |
| tvb:reported_len() | get tvb的(not captured)长度 |
| tvb:len() | get tvb的(captured)长度 |
| tvb:reported_length_remaining() | 获取当前tvb的剩余长度,如果偏移值大于报文长度,则返回-1 |
| tvb:offset() | 返回原始偏移 |
2.4 TvbRange
表示Tvb的可用范围,常用来从Tvb中解出信息。主要接口有
| 接口 | 说明 |
|
tvb:range([offset], [length]) |
从tvb创建TvbRange,可选参数分别是偏移和长度,默认值分别是0和总长度 |
| tvbrange:{type}() | 将tvbrange所表示范围内的数据转换成type类型的值,type包括但不限于:uint,uint64,int,int64,float,ipv4,ether,nstime,string,ustring,bytes,bitfield等,其中某些类型的方法可以带一些参数 |
2.5 Pinfo
报文信息(packet information)。主要接口有:
| 接口 | 说明 |
|
pinfo.len pinfo.caplen |
get报文长度 |
| pinfo.abs_ts | get报文捕获时间 |
| pinfo.number | get报文编号 |
|
pinfo.src pinfo.dst |
get/set报文的源地址、目的地址 |
|
pinfo.columns pinfo.cols |
get报文列表列(界面) |
取得报文列表列后,就可以设置该列的文本,比如
pinfo.cols.info = “hello world”
将Info列的文本设为hello world。
2.6 TreeItem
表示报文解析树中的一个树节点。主要接口有:
| 接口 | 说明 |
|
treeitem:add([protofield], [tvbrange], [value], [label]) |
向当前树节点添加一个子节点 |
| treeitem:set_text(text) | 设置当前树节点的文本 |
| treeitem:prepend_text(text) | 在当前树节点文本的前面加上text |
| treeitem:append_text(text) | 在当前树节点文本的后面加上text |
2.7 DissectorTable
表示一个具体协议的解析表,比如,协议TCP的解析表”tcp.port”包括http,smtp,ftp等。可以依次点击wireshark菜单“Internals”、“Dissector tables”,来查看当前的所有解析表。tcp.port解析表在“Integer tables”选项卡中,顾名思义,它是通过类型为整型的tcp端口号来识别下游协议的:

DissectorTable的主要接口有:
| 接口 | 说明 |
| DissectorTable.get(name) | get名为name的解析表的引用 |
|
dissectortable:add(pattern, dissector) |
将Proto或Dissector对象添加到解析表,即注册。pattern可以是整型值,整型值范围或字符串,这取决于当前解析表的类型 |
|
dissectortable:remove(pattern, dissector) |
将满足pattern的一个或一组Proto、Dissector对象从解析表中删除 |
3. 参考
【wireshark】插件开发(二):Lua插件开发介绍的更多相关文章
- Kylin系列之二:原理介绍
Kylin系列之二:原理介绍 2018年4月15日 15:52 因何而生 Kylin和hive的区别 1. hive主要是离线分析平台,适用于已经有成熟的报表体系,每天只要定时运行即可. 2. Kyl ...
- {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二
python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...
- 二、redis介绍
二.redis介绍 2.1.定义 Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库,是 ...
- 锋利的Jquery解惑系列(二)------插件开发大总结
申明:插件开发是实际项目就经常用到的,不过也是挺吃力的.笔者自己做项目时,看着我们老大写的jQuery一头桨糊,那叫个痛苦.后面果断买了本参考书以及浏览别人的博客,现在也算慢慢入门了.现在总结自己的一 ...
- sonarqube插件开发(二) 开发插件
一.环境准备 java 1.8, maven 3.1 检查自己的环境是否支持 sonarqube的插件开发 java -version mvn -version 二.创建maven项目 pom.xml ...
- lua语法介绍(二)
一.语法简要 在学习任何语法之前,我们都需要知道该门语言是怎样定义的,是怎样运行的,话说白了,就是到了人家的山头得唱人家山头的歌.下面介绍lua的语法 1.变量的定义 特点: 1.变量在使用前必须声明 ...
- fiddler 插件开发二
本篇主要讲解Fildder插件开发中的涉及到的主要接口与类. 1.IFiddlerExtension 接口 如果要开发的自定义插件有UI界面,则需要实现IFiddlerExtension 接口.你程序 ...
- WORDPRESS插件开发(二)HELLO WORLD改进版
在上一篇文章中WORDPRESS插件开发(一)HELLO WORLD,演示了Hello World的最简单实现,只是在每篇文章的后面加入Hello World字符,而且字符也是写死的. 如果用户需要自 ...
- 二、python介绍
python第一篇-------python介绍 一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语 ...
随机推荐
- 记unit of work与事务提交
https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using- ...
- 8.15 自定义tr行 滚动 信息行的滚动
<table class="zixun-con-table"> <tr class="hover"> <th style=&quo ...
- 2018.10.02 NOIP模拟 序列维护(线段树+广义欧拉定理)
传送门 一道比较好的线段树. 考试时线性筛打错了于是弃疗. 60分暴力中有20分的快速幂乘爆了于是最后40分滚粗. 正解并不难想. 每次区间加打懒标记就行了. 区间查询要用到广义欧拉定理. 我们会发现 ...
- Map的常用操作
public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map. ...
- UVa 12174 Shuffle (滑动窗口)
题意:你正在使用的音乐播放器有一个所谓的乱序播放功能,即随机打乱歌曲的播放顺序.假设一共有s首歌, 则一开始会给这s首歌随机排序,全部播放完毕后再重新随机排序.继续播放,依次类推.注意,当s首歌播放完 ...
- Winfrom 嵌入word、excel实现源码
效果图: winform中嵌入word的方法有多种:调用API,使用webBroser或使用DSOFRAMER控件: API过于繁琐: webbroser读取小文件还行,大文件就太痛苦了: 所以还是选 ...
- 小强 ROS 机器人教程
首先请您自行依据线标提示将小强接线连接好,完整结构如下两图所示: 小强是属于Turtlebot机器人.它由底盘.主机.Kinect相机(通过USB连接主机)组成,没有显示屏.如果要通过显示器查看主机的 ...
- (用了map) Registration system
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93241#problem/C (654123) http://codeforces.com ...
- eclipse如何恢复误删文件
刚刚真的要吓死宝宝了,不是说宝宝心里素质差,是因为刚刚误删的文件实在是太重要了,废话不多说了,正题 如何恢复eclipse误删的文件 1,当时被误删了,可立即 Ctrl+z 即可恢复误删文件; 2,时 ...
- DUBBO配置规则详解
研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它, ...