使用lua编写Wireshark(Ethereal)的dissector插件

使用lua编写Wireshark(Ethereal)dissector插件

 

dissector插件可以用来对特定的协议内容进行分析展示,在分析自己实现的应用层协议时还是很有用的。dissector插件一般用C来实现,具体如何实现可以参考Wireshark代码目录下面的/epan/dissectors中的源代码和plugins目录下面的源代码。 一些简单的对性能要求不高的dissector插件也可以使用Lua来实现。Wireshark已经嵌入了对Lua的支持。下面就是一个简单的例子: 

-- 定义协议,可以在wireshark中使用trivial过滤

trivial_proto = Proto("trivial","TRIVIAL","Trivial Protocol")

 

-- dissector函数

function trivial_proto.dissector(buffer,pinfo,tree)

   

    --pinfo的成员可以参考用户手册

    pinfo.cols.protocol = "TRIVIAL"

    pinfo.cols.info = "TRIVIAL data"

   

    local subtree = tree:add(trivial_proto,buffer(),"Trivial Protocol")

          

    --不对应任何数据

    subtree:add(buffer(0,0),"Message Header: ")

   

    --版本号对应于第一个字节

    subtree:add(buffer(0,1),"Version: " .. buffer(0,1):uint())

   

    --类型对应于第二个字节

    type = buffer(1,1):uint()

    type_str = "Unknown"

    if type == 1 then

        type_str = "REQUEST"

    elseif type == 2 then

        type_str = "RESPONSE"

    end

    subtree:add(buffer(1,1), "Type: " .. type_str)

 

    --从第三个字节开始是数据

    size = buffer:len()

    subtree:add(buffer(2,size-2), "Data: ")

      

end

 

tcp_table = DissectorTable.get("tcp.port")

--注册到tcp8888端口

tcp_table:add(8888,trivial_proto)

插件编写完成后保持为test.lua文件,我们就可以抓包测试一下了。首先请确认你的Wireshark支持lua,如果Wireshark目录下面有init.lua文件就说明支持Lua。其次需要启动对Lua的支持,默认不启动对Lua的支持。编辑init.lua文件,注释掉“disable_lua = true;”这一行,然后在文件的最后添加一行dofile("test.lua"),这样Wireshark启动时就会自动调用test.lua。也可以在命令行指定需要执行的脚本文件, 比如“wireshark  -X lua_script:test.lua”。

你可能感兴趣的:(tree,header,table,lua,buffer,plugins)