编写Wireshark的LUA插件是一个很好的方式来扩展其功能,比如添加自定义协议解析器。以下是一个简单的例程,以及如何在Wireshark中加载该插件的步骤。

完整的LUA插件例程

假设我们想要解析一个简单的自定义协议,该协议在TCP端口5555上运行,并包含一个固定长度的消息头,其中包含一些基本字段。

-- 定义一个新的协议
local p_myproto = Proto("myproto", "My Protocol")

-- 定义协议中的各个字段
local f_command = ProtoField.uint16("myproto.command", "Command", base.HEX)
local f_length = ProtoField.uint16("myproto.length", "Length", base.DEC)
local f_data = ProtoField.string("myproto.data", "Data", base.ASCII)

p_myproto.fields = { f_command, f_length, f_data }

-- 定义协议解析器的逻辑
function p_myproto.dissector(buffer, pinfo, tree)
    pinfo.cols.protocol = p_myproto.name

    local subtree = tree:add(p_myproto, buffer())
    subtree:add(f_command, buffer(0,2))
    subtree:add(f_length, buffer(2,2))
    local data_length = buffer(2,2):uint()
    subtree:add(f_data, buffer(4, data_length))
end

-- 将协议解析器与一个端口关联
local tcp_port = DissectorTable.get("tcp.port")
tcp_port:add(5555, p_myproto)

解释说明

  • Proto:这是创建新协议的基础函数。"myproto"是协议的内部名称,"My Protocol"是显示在Wireshark中的名称。
  • ProtoField:用于定义协议中的字段。我们定义了三个字段:命令、长度和数据。
  • p_myproto.fields:这行代码将这些字段关联到我们的协议对象上。
  • p_myproto.dissector:这是一个函数,Wireshark会调用它来解析网络数据。
  • buffer:包含网络数据的对象。
  • pinfo:包含关于当前处理数据包的信息(例如,它可以用来更新顶部显示的协议列)。
  • tree:用于在Wireshark的包详情窗格中添加条目。
  • tcp_port:add(5555, p_myproto):这行代码告诉Wireshark,当数据包是发往或来自TCP端口5555时,应使用此协议解析器。

如何加载插件

  1. 保存插件脚本:将上面的脚本保存为myproto.lua
  2. 配置Wireshark以使用LUA插件
  • 打开Wireshark。
  • 从菜单选择"帮助" -> "关于Wireshark" -> "文件夹"标签,找到并记下"个人插件"文件夹的路径。
  • myproto.lua文件复制到这个文件夹中。
  1. 启动Wireshark:重新启动Wireshark后,如果你在TCP端口5555上有数据流动,你应该能看到协议被标记为"My Protocol"。

这样,你就成功地创建并加载了一个Wireshark LUA插件。这个插件现在可以用来解析指定端口上的自定义协议数据。