2015-07-12 5 views
1

я написал два простых диссекторы Wireshark Lua для прикованных протоколов:Wireshark Lua диссекторы: как расширить вместе

local proto1 = Proto("proto1","First Layer") 
local page = ProtoField.uint16("proto1.page", "Page", base.HEX) 
proto1.fields = {page} 

function proto1.dissector(buffer, pinfo, tree) 
    pinfo.cols.protocol = proto1.name; 
    local ptree = tree:add(proto1,buffer(1,5)) 
    ptree:add(page, buffer(1,2)) 
    Dissector.get("proto2"):call(buffer(6, 4):tvb(), pinfo, tree) 
end 

local proto2 = Proto("proto2","Second Layer") 
local len = ProtoField.uint8("proto2.len", "Payload Length") 
proto2.fields = {len} 

function proto2.dissector(buffer, pinfo, tree) 
    pinfo.cols.protocol = proto2.name; 
    local ptree = tree:add(proto2,buffer()) 
    ptree:add(len, buffer(1,2)) 
end 

DissectorTable.get("tcp.port"):add(3456, proto1) 

В диссекторах сделать работу и отображать протоколы в дереве один за другим. Теперь, если я разворачиваю один из протоколов (так видимый протофилд) и нажимаем на другой пакет, то как proto1, так и proto2 в дереве расширяются по неизвестной причине. Если я сейчас обрушиваю один из протоколов и нажимаю на другой пакет, то оба будут свернуты.

Любой совет, как этого избежать? Мои протоколы сложнее, чем показано здесь, поэтому это расширение затрудняет анализ.

ответ

0

Это ошибка. Я мог бы поклясться, что был исправлен раньше, а затем работал правильно. Отправьте сообщение об ошибке bugs.wireshark.org.

В то же время, вы можете подделать:

local proto1 = Proto("proto1","First Layer") 

local page = ProtoField.uint16("proto1.page", "Page", base.HEX) 
local proto2 = ProtoField.bytes("proto2","Second Layer") 
local len  = ProtoField.uint8("proto2.len", "Payload Length") 

proto1.fields = {page, proto2, len} 


local function proto2_dissect(buffer, pinfo, tree) 
    pinfo.cols.protocol = "proto2" 
    local ptree = tree:add(proto2, buffer()):set_text("Second Layer") 
    ptree:add(len, buffer(1,2)) 
end 

function proto1.dissector(buffer, pinfo, tree) 
    pinfo.cols.protocol = proto1.name; 
    local ptree = tree:add(proto1,buffer(1,5)) 
    ptree:add(page, buffer(1,2)) 
    proto2_dissect(buffer(6,4):tvb(), pinfo, tree) 
end 

DissectorTable.get("tcp.port"):add(3456, proto1) 
+0

Ваш пример действительно работает, спасибо. У меня есть эти протоколы в отдельных файлах - возможно ли использовать ваше «поддельное» решение в этом случае без смешивания функций и полей в одном файле? Я попытался и получил много ошибок. – johnjey

+0

Ну, для этой работы вам нужно зарегистрировать весь протокол ProtoField только для одного протокола Proto. Конечно, вы можете создавать объекты ProtoField в другом файле Lua, если другие файлы Lua загружаются до того, как основной устанавливает «Proto.fields» - либо с помощью функции Lua 'require' (если они 'написано как модули Lua) или с помощью 'dofile()'. Мне вообще не нравится использование 'dofile()' для загрузки плагинов Wireshark, но это разумно для загрузки других файлов Lua одного и того же плагина. – hadriel

+0

BTW, если вы хотите просто немного подождать, ошибка уже выполняется, и вы должны иметь возможность загружать фиксированную версию завтра утром с [сайта автоматизированных сборок] [1]. Он не будет в официальном выпуске до следующего релиза 1.12.x, но это обычно довольно часто. [1]: https://www.wireshark.org/download/automated/ – hadriel