【wireshark】插件开发(四):Lua插件Post-dissector和Listener
1. Post-dissector
post-dissector和dissector不同,它会在所有dissectors都执行过后再被执行,这也就post前缀的由来。post-dissector的构建方式和dissector差不多,主要一个区别是注册的方式,post-dissector调用的是register_postdissetor接口。下面给出两个示例。
1.1 最简单的Post-dissector
这个示例主要是演示post-dissector脚本的骨架,它的功能是在packet list的所有info列加上了一个字符串"hello world"。
-- @brief A simple post-dissector, just append string to info column
-- @author zzq
-- @date 2015.08.13 local myproto = Proto("hello","Dummy proto to edit info column") -- the dissector function callback
function myproto.dissector(tvb,pinfo,tree)
pinfo.cols.info:append(" hello world")
end -- register our new dummy protocol for post-dissection
register_postdissector(myproto)
此插件运行效果如下图:
1.2 识别协议特征
这个示例简单地演示了如何使用post-dissector来识别协议特征。例子中,通过识别tcp载荷中是否含有字符串”weibo“来判断报文是否为weibo报文,如果是,则在packet list的protocol列标出,并在proto tree添加树节点,给出滑动特征在TCP载荷中的位置。
代码如下,其中有好多小问题,但这不是重点,重点是了解如何编写Lua插件。
-- @brief A post-dissector, to indentify pattern in payload
-- @author zzq
-- @date 2015.08.26 local weibo = Proto("weibo", "Weibo Service") local function get_payload_offset(data, proto_type)
local mac_len = ;
local total_len;
local ip_len = (data(, ):uint() - ) * ;
if (proto_type == 0x06) then
local tcp_len = (data(, ):uint()/) * ;
total_len = mac_len + ip_len + tcp_len;
elseif (proto_type == 0x11) then
local udp_len = ;
total_len = mac_len + ip_len + udp_len;
end
return total_len
end -- the dissector function callback
function weibo.dissector(tvb, pinfo, tree)
local proto_type = tvb(, ):uint();
if(proto_type ~= 0x06) then
return
end local offset = get_payload_offset(tvb, proto_type)
local data = tvb(offset):string();
local i, j = string.find(data, "weibo")
if(i) then
pinfo.cols.protocol = weibo.name
local subtree = tree:add(weibo, tvb(offset+i-))
subtree:append_text(", ptn_pos: " .. i .. "-" .. j)
end
end -- register our plugin for post-dissection
register_postdissector(weibo)
运行效果如下图。
2. Listener
Listner用来设置一个监听条件,当这个条件发生时,执行事先定义的动作。
实现一个Listner插件至少要实现以下接口:
- 创建Listener
listener = Listener.new([tap], [filter]),其中tap, filter分别是tap和过滤条件 - listener.packet
在条件命中时调用 - listener.draw
在每次需要重绘GUI时调用 - listener.reset
清理时调用
以上实现代码一般都包在一个封装函数中,最后把这个函数注册到GUI菜单:
register_menu(name, action, [group])
下面的示例代码对pcap文件中的http报文进行了简单的计数统计:
-- @brief a simple Listener plugin
-- @author zzq
-- @date 2015.08.13 local function zzq_listener()
local pkts =
local win = TextWindow.new("zzq Listener")
local tap = Listener.new(nil, "http") win:set_atclose(function() tap:remove() end) function tap.packet (pinfo, tvb, tapinfo)
pkts = pkts +
end function tap.draw()
win:set("http pkts: " .. pkts)
end function tap.reset()
pkts =
end -- Rescan all packets and just run taps - don’t reconstruct the display.
retap_packets()
end register_menu("freeland/zzq Listener", zzq_listener, MENU_STAT_GENERIC)
要查看运行结果,要选择”Statistics“菜单中的freeland/zzq Listerner子菜单来触发。此插件的运行效果如下图:
【wireshark】插件开发(四):Lua插件Post-dissector和Listener的更多相关文章
- Wireshark使用drcom_2011.lua插件协助分析drcom协议
drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
- 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 ...
- 【eclipse插件开发实战】 Eclipse插件开发5——时间插件Timer开发实例详解
Eclipse插件开发5--时间插件Timer开发实例详解 这里做的TimeHelper插件设定为在菜单栏.工具栏提供快捷方式,需要在相应地方设置扩展点,最后弹出窗体显示时间. 在上一篇文章里创建好了 ...
- 【wireshark】插件开发(三):Lua插件 Dissector
// TODO: 部分内容需要修改 1. 骨架 首先新建一个文件,命名为foo.lua,注意此文件的编码方式不能是带BOM的UTF8,否则wireshark加载它时会出错(不识别BOM): -- @b ...
- Jenkins插件开发(四)-- 插件发布
上一篇blog介绍了插件开发中要注意的一些问题, 我们再来介绍插件开发完成后,如何上传到jenkins的插件中心(这里假设你的代码是放在github上的,使用svn或其他版本管理工具的请参考其他文章) ...
- jQuery插件开发,jquery插件
关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...
随机推荐
- cnn 反向bp这个地方怎么推导??
- C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)
( 原书第四章,General Concepts) 只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述. namespace std:新的std子空间包括: std::tr1, ...
- 在命令提示符(cmd)下怎样复制粘贴
我们把鼠标放在面板的上方,右击,界面显示如下: 我们选择“属性”,单击,界面显示如下: 我们点选“快速编辑模式”,再点击“确定”,这样设置就完成了,界面显示如下: 我们在面板中随意选择 ...
- 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)
传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...
- 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...
- 2018.08.29 NOIP模拟 pmatrix(线性筛)
[问题描述] 根据哥德巴赫猜想(每个不小于 6 的偶数都可以表示为两个奇素数之和),定义 哥德巴赫矩阵 A 如下:对于正整数对(i,j),若 i+j 为偶数且 i,j 均为奇素数,则 Ai,j = 1 ...
- C语言之预处理命令与用typedef命名已有类型
预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”.比如头文件. 有以下三类:宏定义 ...
- ZUFE2389: Occult的卡片升级计划(DP) 2016-05-17 23:12 113人阅读 评论(0) 收藏
2389: Occult的卡片升级计划 Description Occult喜欢玩一款手游,手游中有很多好看的卡片.他想要升级这些卡. 现在他有m块经验石,目标是强化一张卡片,卡片最开始的时候是0级, ...
- PAT甲 1002. A+B for Polynomials (25) 2016-09-09 22:50 64人阅读 评论(0) 收藏
1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...
- 图形与游戏中3D数学基础的说明
1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系 ...