请教大家关于wireshark添加lua自定义规则解析模块的问题

来源:互联网 发布:软件开发工作流 编辑:程序博客网 时间:2024/06/06 09:00

我的lua代码如下所示,打开wireshar直接死掉。。希望大家忙我看看哪里有问题,谢谢。

do

--[[
创建一个新的协议结构 foo_proto
第一个参数是协议名称会体现在过滤器中
第二个参数是协议的描述信息,无关紧要
--]]
local sf_app = Proto("SFAPP", "SIFANG Protocol, reserved by www.sf-auto.com")

--[[
下面定义字段
--]]
local pf_maintype = ProtoField.uint8("sfcan.maintype", "MainType", base.NONE)
local pf_subtype = ProtoField.uint8("sfcan.subtype", "SubType", base.NONE)
local pf_devtype = ProtoField.uint8("sfcan.devtype", "DevType", base.NONE)
local pf_framecnt = ProtoField.uint8("sfcan.framecnt", "FrameCnt", base.NONE)
local pf_framesn = ProtoField.uint16("sfcan.framesn", "FrameSn", base.NONE)
local pf_appdatalen = ProtoField.uint16("sfcan.appdatalen", "AppDataLen", base.NONE)
local pf_appdata = ProtoField.string("sfcan.appdata", "AppData", base.NONE)
local pf_appdatacrc = ProtoField.uint8("sfcan.appdatacrc", "APPDataCrc", base.NONE)

-- 将字段添加都协议中
sf_app.fields = {
pf_maintype,
pf_subtype,
pf_devtype,
pf_framecnt,
pf_framesn,
pf_appdatalen,
pf_appdata,
pf_appdatacrc
}

--[[
下面定义 foo 解析器的主函数,这个函数由 wireshark调用
第一个参数是 Tvb 类型,表示的是需要此解析器解析的数据
第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示
第三个参数是 TreeItem 类型,表示上一级解析树
--]]
function sf_app.dissector(tvb, pinfo, tree)

-- 设置一些 UI 上面的信息
pinfo.cols.protocol:set("SFAPP")
pinfo.cols.info:set("SFAPP Protocol")

local offset = 0
local datalen = 0
local buf_len = tvb:len()

-- 在上一级解析树上创建 foo 的根节点
local root = treeitem:add(sf_app, tvb:range(offset))

-- 下面是想该根节点上添加子节点,也就是自定义协议的各个字段
-- 注意 range 这个方法的两个参数的意义,第一个表示此时的偏移量
-- 第二个参数代表的是字段占用数据的长度
root:add(pf_maintype, tvb:range(offset, 1))
offset = offset+1
root:add(pf_subtype, tvb:range(offset, 1))
offset = offset+1
root:add(pf_devtype, tvb:range(offset, 1))
offset = offset+1
root:add(pf_framecnt, tvb:range(offset, 1))
offset = offset+1
root:add(pf_framesn, tvb:range(offset, 2))
offset = offset+2
root:add(pf_appdatalen, tvb:range(offset, 2))
offset = offset+2

-- 计算消息内容的长度
local sfapp_content_len = tvb:range(6, 2):uint()
root:add(pf_appdata, tvb:range(offset, sfapp_content_len))
offset = offset+sfapp_content_len

root:add(pf_appdatacrc, tvb:range(offset, 1))
offset = offset+1
end

-- 向 wireshark 注册协议插件被调用的条件
local eth_table = DissectorTable.get("ethertype")
eth_table:add(16640, sf_app)

end
0 0
原创粉丝点击