Как добавить фильтр в поле в Wireshark

Я пытаюсь добавить фильтр в поле в Wireshak.
Моего диссектора зовут: "базовый".
у него есть 3 поля - field1, field2, field3.
каждое поле может иметь значение строки.
Я хочу, чтобы на Wireshark я мог фильтровать по определенному полю, например: basic.field1. (так же, как вы ищете tcp.len)

Как я могу это сделать?

1 ответ

Решение

Вы должны объявить поля, назначить их вашему протоколу и при необходимости добавить их в дерево. В настоящее время Lua поддерживает 2 различных типа строк, типа ftypes.STRING, который используется для строк известной, фиксированной длины и типа ftypes.STRINGZ, которая является строкой, определяемой NULL (нулем), поэтому то, как вы объявите поля, будет зависеть от того, какой из 2 типов они являются.

К сожалению, несмотря на листинг документации ftypes.UINT_STRING как поддерживаемый тип, это не так, как можно увидеть в исходном коде для wslua_proto_field.c, Этот тип строки применим, когда поле длины предшествует строке, чтобы указать длину строки в байтах. В любом случае, в настоящее время он недоступен для диссекторов на базе Lua.

Итак, в качестве примера, давайте предположим, что ваш протокол использует UDP/33333 в качестве своего транспорта и номера порта, и его 3 поля состоят из каждого из 3 типов строк, описанных выше, а именно:

  • field1: строка фиксированной длины из 12 байтов.
  • field2: строка с произвольной длиной произвольной длины.
  • 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 вы можете обратиться к одному или нескольким из следующих:

Другие вопросы по тегам