• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【wireshark】插件开发(三):Lua插件 Dissector

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

// 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 = 9877
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 = 0
    
    -- 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, 1)
    subtree:add(fields.type, type)
    subtree:append_text(", type: " .. type:uint())
    offset = offset + 1
    
    subtree:add(fields.flags, tvb(offset, 1))
    offset = offset + 1
    subtree:add(fields.seqno, tvb(offset, 2))
    offset = offset + 2
    subtree:add(fields.ipaddr, tvb(offset, 4))
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协议应用显示过滤器:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua5.2版本在VS2010下的环境搭建发布时间:2022-07-22
下一篇:
Lua面向对象----类、继承、多继承、单例的实现发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap