декодирование эвристического разделителя wireshark как части пакета

#lua #wireshark #wireshark-dissector

#lua #wireshark #wireshark-разделитель

Вопрос:

Я написал разделитель ixia lua. У меня такая же проблема с другим подобным разделителем.

Да, я знаю, что диссектор уже написан на c, но он не работает «из коробки», по крайней мере, не для моей трассировки — и я также попробовал обходной путь, предложенный для «Фиксированной длины трейлера ethernet» до 19. Возможно, не сработало, потому что мой пакет туннелирован, поэтому у меня есть 2 уровня ethernet.

Мне удалось проанализировать трейлер ixia.

Моя проблема в том, что crc eth_trailer анализируется моим разделителем

С добавленным кодом crc теперь отображается перед уровнем ixia, вместо этого под деревом уровня ethernet. Есть ли возможность отобразить crc на уровне ethernet, как для пакета без ixia?

 if offset_ixia == 4 then 
    local subtree = tree:add(ixia_trailer_proto, buffer(0,offset_ixia),"eth.trailer")   
end

local subtree = tree:add(ixia_trailer_proto, buffer(offset_ixia,length-offset_ixia),"Ixia trailer")
  

crc трейлера ethernet до ixia

В обычном пакете это выглядит следующим образом:

введите описание изображения здесь

Вот полный упрощенный код, показывающий проблему:

 ixia_trailer_proto = Proto("ixia_trailer","Ixia-lua Trailer")

-- Header fields
source = ProtoField.uint8("ixia_trailer_proto.source"    , "Source"    , base.HEX)
ixia_trailer_proto.fields = {source}
offset_ixia = 0

-- create a function to dissect it
local function is_ixia_trailer(buffer,pinfo,tree)
    local length = buffer:len()
    --eth   ip
    if length < 15 then return false end
    if length == 15 then 
        type_offset = 11
    elseif length == 19 then -- 15   crc size
        type_offset = 15
        offset_ixia = 4
    end
    local type = buffer( type_offset , 2):uint()
    if type == 0xaf12 then  
        ixia_trailer_proto.dissector(buffer, pinfo, tree)   
        return true 
    end

    return false
end

function ixia_trailer_proto.dissector(buffer, pinfo, tree)
    length = buffer:len()

    if offset_ixia == 4 then 
        local subtree = tree:add(ixia_trailer_proto, buffer(0,offset_ixia),"eth.trailer")   
    end

    local subtree = tree:add(ixia_trailer_proto, buffer(offset_ixia,length-offset_ixia),"Ixia trailer")

    subtree:add(source, buffer(offset_ixia   0,1))
end

ixia_trailer_proto:register_heuristic("eth.trailer", is_ixia_trailer)
  

Вот пример файла pcap с трейлером https://transfernow.net/019rp7t214kv

Комментарии:

1. Можете ли вы предоставить общий доступ к файлу захвата где-нибудь?

2. Единственный способ, который я могу придумать, чтобы сделать эту работу надежной, — запросить новый тип заголовка канального уровня, который выглядит как фрейм Ethernet, но с дополнительными фиксированными 15 байтами в конце для трейлера Ixia. См tcpdump.org/linktypes.html . Явный тип канального уровня мог бы позволить передавать все, кроме последних 15 байт, в диссектор Ethernet, чтобы он должным образом анализировал FCS, а затем после этого конечные 15 байт могли бы передаваться в диссектор Ixia trailer. Я не знаю, может быть, есть другой способ выполнить то, что вам нужно, но я могу придумать что угодно.