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
    监听器,用来收集解析后的信息

还需要注意:

  1. wireshark启动时,会调用下图目录中的init.lua,顺序是先调用global目录的,再调用personal目录的;
  2. 通过命令行参数:
           -X lua_script:my.lua
    传入的my.lua将会在Init.lua之后被调用
  3. 所有的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插件开发介绍的更多相关文章

  1. Kylin系列之二:原理介绍

    Kylin系列之二:原理介绍 2018年4月15日 15:52 因何而生 Kylin和hive的区别 1. hive主要是离线分析平台,适用于已经有成熟的报表体系,每天只要定时运行即可. 2. Kyl ...

  2. {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二

    python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...

  3. 二、redis介绍

    二.redis介绍 2.1.定义 Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库,是 ...

  4. 锋利的Jquery解惑系列(二)------插件开发大总结

    申明:插件开发是实际项目就经常用到的,不过也是挺吃力的.笔者自己做项目时,看着我们老大写的jQuery一头桨糊,那叫个痛苦.后面果断买了本参考书以及浏览别人的博客,现在也算慢慢入门了.现在总结自己的一 ...

  5. sonarqube插件开发(二) 开发插件

    一.环境准备 java 1.8, maven 3.1 检查自己的环境是否支持 sonarqube的插件开发 java -version mvn -version 二.创建maven项目 pom.xml ...

  6. lua语法介绍(二)

    一.语法简要 在学习任何语法之前,我们都需要知道该门语言是怎样定义的,是怎样运行的,话说白了,就是到了人家的山头得唱人家山头的歌.下面介绍lua的语法 1.变量的定义 特点: 1.变量在使用前必须声明 ...

  7. fiddler 插件开发二

    本篇主要讲解Fildder插件开发中的涉及到的主要接口与类. 1.IFiddlerExtension 接口 如果要开发的自定义插件有UI界面,则需要实现IFiddlerExtension 接口.你程序 ...

  8. WORDPRESS插件开发(二)HELLO WORLD改进版

    在上一篇文章中WORDPRESS插件开发(一)HELLO WORLD,演示了Hello World的最简单实现,只是在每篇文章的后面加入Hello World字符,而且字符也是写死的. 如果用户需要自 ...

  9. 二、python介绍

    python第一篇-------python介绍 一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语 ...

随机推荐

  1. cxf soap rest webservice spring

    1. 导入 jar 包 2. 编写接口 3. 编写实现 4. 配置spring 配置文件 5. 配置web.xml servlet 6. 访问 package com.diancai.test; im ...

  2. Android无线调试_adbWireless

    NC的ADB驱动是个很让人头疼的问题,纵使老玩家有时候也是反复装装不上,有时候就算装上了,换一个ROM就又不行了,真是让人扣心扣肺,欲哭无泪,欲罢不能啊...现在好了,有了adbWireless不但可 ...

  3. 内建类型,与用户自定义类型,返回值为const

    1对内建类型来说,按值返回的是否为const,是无关紧要的,因为编译器已经不让它成为一个坐直,因为它总是一个值,而不是一个变量(thing in c++ page192) 2当处理用户自定义的类型时, ...

  4. 2018.06.29 NOIP模拟 Minimum(最小生成树)

    Minimum 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一幅由 n 个点 m 条边构成的无向带权图. 其中有些点是黑点,另外点是白点. 现在每个白点都要与他距离最近的所有黑 ...

  5. hdu-1070(水题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1070 题意:一个人喝牛奶,有三个原则: 1.牛奶的日期不超过6天,就是最多5天. 2.每次只喝200m ...

  6. Django(4)

    https://www.cnblogs.com/yuanchenqi/articles/7439088.html

  7. Django入门与实践-第22章:基于类的视图

    http://127.0.0.1:8000/boards/1/topics/2/posts/2/edit/ http://127.0.0.1:8000/ #boards/views.py from d ...

  8. [转]一个CMake编译问题的解决过程

    问题的提出 公司的一个power-pc平台的产品,有个协议进行了修改,过程中出现了比较奇怪的情况.直接将修改后的动态库下载到设备上(原始设备是有文件系统和其他的依赖文件的,相当于部分更新应用),设备和 ...

  9. 12) maven-compiler-plugin

    The Compiler Plugin is used to compile the sources of your project. At present the default source se ...

  10. 201521123035-个人作业4——alpha阶段个人总结

    个人总结 在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 第一部分 类别 具体技能和面试问题 现在的回答(大三) 语言 最拿手的计算机语言是一?,代码量多少?(偏前端 ...