Вы должны объявить поля, назначить их своему протоколу и при необходимости добавить их в дерево. В настоящее время Lua поддерживает 2 разных типа строк, которые относятся к типу ftypes.STRING
, который используется для строк известной фиксированной длины и типа ftypes.STRINGZ
, который является NULL (ноль) -терминированной строкой, поэтому, как вы объявляете поля будет зависеть от того, какой из двух типов они являются.
К сожалению, несмотря на то, что documentation содержит ftypes.UINT_STRING
в качестве поддерживаемого типа, это не так, как можно видеть в исходном коде для wslua_proto_field.c
. Этот тип строки применим, когда поле длины предшествует строке, чтобы указать длину строки в байтах. В любом случае в настоящее время он не доступен для дисузеров на основе Lua.
Так, в качестве примера, давайте предположим, что ваш протокол использует UDP/33333 в качестве транспорта и номер порта, и его 3-х полей состоят из каждого из 3-х типов строк, описанных выше, а именно:
- field1 : строка с фиксированной длиной 12 байт.
- field2: строка с произвольной длиной в NULL.
- field3: подсчитанная строка, которой предшествует поле длиной 2 байта в байтовом порядке по-бай-ину (сети).
Учитывая эти предположения, следующие будут рассекать пакеты:
-- 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 в файл, например, как basic.lua в вашем персональном каталоге плагинов (Найдено через Help -> About Wireshark -> Folders -> Personal Plugins
). Затем вы можете использовать следующие шестигранные байт, чтобы проверить это:
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 диссекторов, вы можете обратиться к одному или более из следующих действий: