我正在尝试在Wireshak中为字段添加过滤器
我的解剖器名称是:“basic”。
它有3个字段 - field1,field2,field3
每个字段都可以有一个字符串值
我希望在Wireshark上我能够按特定字段过滤,例如:basic.field1。 (就像你寻找 tcp.len 一样)
我该怎么做?
答案 0 :(得分:1)
您必须声明字段,将它们分配给协议并在适当时将它们添加到树中。目前有两种不同类型的字符串由Lua支持,类型为ftypes.STRING
,用于已知固定长度的字符串,类型为ftypes.STRINGZ
,这是一个NULL(零)终止字符串,所以你如何声明字段将取决于它们中的哪两种类型。
不幸的是,尽管documentation列出了ftypes.UINT_STRING
作为受支持的类型,但它并不是wslua_proto_field.c
的源代码中所见。当字符串前面的长度字段指示字符串的长度(以字节为单位)时,此类型的字符串适用。无论如何,它目前不适用于基于Lua的解剖器。
因此,举例来说,假设您的协议使用UDP / 33333作为其传输和端口号,其3个字段由上述3种类型的字符串组成,即:
鉴于这些假设,以下内容将剖析数据包:
-- Protocol
local p_basic = Proto("basic", "Basic Protocol")
-- Fields
local f_basic_field1 = ProtoField.string("basic.field1", "Field1")
local f_basic_field2 = ProtoField.stringz("basic.field2", "Field2")
local f_basic_field3 = ProtoField.string("basic.field3", "Field3")
p_basic.fields = { f_basic_field1, f_basic_field2, f_basic_field3 }
-- Dissection
function p_basic.dissector(buf, pinfo, tree)
local basic_tree = tree:add(p_basic, buf(0,-1))
pinfo.cols.protocol:set("BASIC")
basic_tree:add(f_basic_field1, buf(0, 12))
local strz = buf(12):stringz()
local field2_len = string.len(strz) + 1
basic_tree:add(f_basic_field2, buf(12, field2_len))
local field3_len = buf:range(12 + field2_len, 2):uint()
basic_tree:add(f_basic_field3, buf(12 + field2_len + 2, field3_len))
end
-- Registration
local udp_table = DissectorTable.get("udp.port")
udp_table:add(33333, p_basic)
如果要对此进行测试,请先将上述lua代码保存到个人插件目录(通过Help -> About Wireshark -> Folders -> Personal Plugins
找到)中的basic.lua等文件中。然后,您可以使用以下十六进制字节来测试它:
0000 00 0e b6 00 00 02 00 0e b6 00 00 01 08 00 45 00
0010 00 37 00 00 40 00 40 11 b5 ea c0 00 02 65 c0 00
0020 02 66 82 35 82 35 00 23 22 32 48 65 6c 6c 6f 20
0030 77 6f 72 6c 64 21 48 69 20 74 68 65 72 65 00 00
0040 04 42 79 65 21
将这些字节保存到文本文件中,例如basic.txt
。启动Wireshark并通过File -> Import from Hex Dump... -> Filename:basic.txt -> OK
导入文件。你应该看到3个字段被解析为"基本协议" 的一部分。
有关Lua解剖器的进一步帮助,您可能需要参考以下一项或多项: