# 常规通用lua插件写法
-- 初始化插件
local myproto = Proto("myproto", "My Protocol")
-- 创建字段对象
local fields = myproto.fields
local field1 = fields.field1
local field2 = fields.field2
-- 解析函数
function myproto.dissector(buffer, pinfo, tree)
-- 创建协议树节点
local subtree = tree:add(myproto, buffer())
-- 解析字段值
local value1 = buffer(0, 2):uint()
local value2 = buffer(2, 2):uint()
-- 在协议树节点上添加字段
subtree:add(field1, buffer(0, 2)):append_text(" (Value 1: " .. value1 .. ")")
subtree:add(field2, buffer(2, 2)):append_text(" (Value 2: " .. value2 .. ")")
end
-- 注册插件
local tcp_port = DissectorTable.get("tcp.port")
tcp_port:add(1234, myproto)
以上定义一个名为myproto的解剖器(Dissector),并且将myprot注册到解剖器表(DissectorTable)中,通过端口进行关联,但是如果协议不指定端口的时候,解析起来就需要手动指定协议,比较麻烦。
# 以下是获取所有frame字节buffer的lua插件写法
-- 自定义协议
my_udppayload=Proto("my_udp_payload","my_udp_payload")
function my_udppayload.dissector(buffer, pkt, tree)
-- 这里的buffer是整个frame的字节
local data = tostring(buffer:bytes())
-- 搜索字节序列
-- 定位http协议的get方法
local get_pattern = "474554" -- 搜索get 16进制编码474554
local start_pos, end_pos = string.find(data, get_pattern)
-- 通过字节搜索,定位http协议结尾的\r\n\r\n
local http_end="0D0A0D0A"
local start_pos1, end_pos1 = string.find(data, http_end)
-- 如果找到了字节序列
if start_pos ~= nil then
if start_pos1 ~= nil then
netflow_start=tonumber(end_pos1, 10)/2
print(netflow_start)
print(buffer:len())
if (netflow_start+86)==buffer:len() then
-- 自定义解析器,定位到你想要解析的位置
my_plugin.dissector(buffer(netflow_start,82):tvb(),pkt,tree)
end
end
end
end
-- 注册插件 不需要绑定传输层端口
register_postdissector(my_udppayload)