2012-05-01 4 views
6

Prima di tutto, sono del tutto nuovo a Lua del tutto, e questo è il mio primo tentativo di scrivere un dissettore per il filo spinato.Wireshark Dissector in Lua

Il mio protocollo è semplice: un campo di lunghezza di 2 byte, seguito da una stringa di quella lunghezza.

Quando eseguo il codice tramite la console Lua, tutto funziona come previsto.

Quando il codice viene aggiunto alla directory dei plugin Wireshark, ottengo l'errore

Lua Error: [string "C:\Users...\AppData\Roaming\Wireshark..."]:15: calling 'add' on bad self (number expected, got string)

Linea 15 corrisponde è la linea t:add(f_text....

Qualcuno può spiegare la discrepanza tra i metodi di esecuzione?

do 
    local p_multi = Proto("aggregator","Aggregator"); 

    local f_len = ProtoField.int16("aggregator.length","Length",base.DEC) 
    local f_text = ProtoField.string("aggregator.text","Text") 

    p_multi.fields = { f_len, f_text } 

    local data_dis = Dissector.get("data") 

    function p_multi.dissector(buf,pkt,root) 
      pkt.cols.protocol = "Aggregator" 
      local len = buf(0,2):int() 
      local t = root:add(p_multi,buf(0,len+2)) 
      t:add(f_len,buf(0,2),"Length: " .. buf(0,2):int()) 
      t:add(f_text,buf(2,len),"Text: " .. buf(2,len):string()) 
    end 

    local tcp_encap_table = DissectorTable.get("tcp.port") 
    tcp_encap_table:add(4321,p_multi) 
end 
+0

Noterò che ho utilizzato http: //www.wireshark .org/docs/wsug_html_chunked/wslua_dissector_example.html e http://wiki.wireshark.org/Lua/Dissectors per l'ispirazione. Esistono buone fonti di documentazione API? – Edgemaster

+0

[Capitolo 11] (http://www.wireshark.org/docs/wsug_html_chunked/wsluarm.html) della Guida dell'utente è la documentazione API per l'interfaccia Lua. Le sezioni 11.10, 11.11 e 11.12 sono l'interfaccia funzionale. Oltre a ciò, non c'è davvero alcuna documentazione da avere. Mi sembra che il tuo dissettore debba funzionare come scritto. Il codice mostra che si ottiene un riferimento al separatore di dati ('local data_dis = Dissector.get (" data ")'), ma che non lo si usa. È questo il tuo codice di dissertazione completo? In caso contrario, potreste alterare accidentalmente 't' da qualche parte non mostrato qui. – multipleinterfaces

+0

È il mio codice di dissertazione completo, data_dis è un hang-over degli esempi collegati. – Edgemaster

risposta

6

Il tuo codice di dissector è molto vicino alla correzione, ma stai facendo un lavoro extra che l'interfaccia non accetterà. Se si cambia la funzione dissector in questo modo,

function p_multi.dissector(buf,pkt,root) 
     pkt.cols.protocol = "Aggregator" 
     local len = buf(0,2):int() 
     local t = root:add(p_multi,buf(0,len+2)) 
     t:add(f_len,buf(0,2)) --let Wireshark do the hard work 
     t:add(f_text,buf(2,len)) --you've already defined their labels etc. 
end 

si otterrà il comportamento desiderato. Le etichette "Testo" e "Lunghezza" sono già definite per i campi, quindi non è necessario fornirle nuovamente sulle righe 15 e 16.

+0

Grazie. Ho postato questa domanda in fretta prima di lasciare il lavoro, e dedicandomi del tempo per pensarci più ha più senso ora. Anche se, sono ancora confuso sul motivo per cui ha funzionato attraverso la console Lua! – Edgemaster