Semplice dissector per ping (protocollo ICMP, Wireshark+Lua)…
Qualche giorno fa stavo provando l’ultima versione rilasciata di Wireshark, la v1.2.0 (sempre più “cool”, anche esteticamente ora) e, tanto per gradire, ho scritto un piccolo dissector in Lua per riconoscere i pacchetti di una semplice sessione ping, protocollo ICMP quindi.
Approfitto quindi dell’occasione per spiegare due cosette che mi sono accorto di aver tralasciato nelle “puntate” precedenti.
Quando si scrive un dissector per Wireshark – sia esso in C o in Lua – il primo passo è capire a quale tabella di dissezione (DissectorTable) è necessario “agganciarsi” o, nel caso peggiore, dover creare.
Dalla documentazione di Wireshark:
10.4.6.2. DissectorTable
A table of subdissectors of a particular protocol (e.g. TCP subdissectors like http, smtp, sip are added to table “tcp.port”). Useful to add more dissectors to a table so that they appear in the Decode As… dialog.
Ogni protocollo principale dispone quindi di una sua tabella di dissezione, alla quale sono “appesi” eventuali sottoprotocolli.
Nel caso dell protocollo ICMP, questo è incapsulato direttamente dentro quello IP (livello 3, stack ISO-OSI) per cui bisogna trovare un modo per “selezionarlo” partendo dalla tabella di dissezione di quest’ultimo.
Dato che Wireshark “rispetta” i numeri di protocollo di IANA, il protocollo ICMP ha decimal 1 (decimal => codice identificativo univoco, id).
Per cui la soluzione finale è collegarsi alla tabella IP impostando adeguatamente il campo (sotto-)protocollo (“ip.proto“).
Di seguito vi riporto un breve codice che mostra il tutto in funzione.
Ciao! ^^
Il codice!
--[[
FILE: ping.lua
AUTHOR: Gian Paolo "JP" Ghilardi
LICENSE: released under the terms of GPL v2.0 ("only")
PURPOSE: example of a simple dissector for Ping packets (ICMP protocol)
VERSION: 1.0.1
TESTED ON:
- Wireshark 1.2.0 on Windows XP x86-32 SP2, Lua 5.1
- Wireshark 1.2.0 on MacOSX 10.5.7 PPC 32-bit, Lua 5.1
REFERENCES:
[1]: https://www.darkcornersoftware.com/confluence/display/open/Helen+Wireshark+Dissector+Plugin
[2]: http://www.wireshark.org/docs/wsug_html_chunked/wsluarm_modules.html#lua_module_Proto
[3]: http://wiki.wireshark.org/Lua/Examples
[4]: http://www.wireshark.org/docs/wsug_html_chunked/wslua_dissector_example.html
[5]: http://www.lua.org/manual/5.1/manual.html
[6]: http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol
[7]: http://www.gammon.com.au/forum/?id=8715
[8]: http://www.iana.org/assignments/protocol-numbers/
]]--
-- we'll handle just 3 ICMP packet-types (for Ping)
ping_types =
{
[0x00] = "answer (ECHO REPLY)",
[0x03] = "error (DESTINATION UNREACHABLE)",
[0x08] = "request (ECHO REQUEST)"
}
-- ICMP type-3 error-codes [6]
ping_du_codes =
{
[0x00] = "Destination network unreachable",
[0x01] = "Destination host unreachable",
[0x02] = "Destination protocol unreachable",
[0x03] = "Destination port unreachable",
[0x04] = "Fragmentation required, and DF flag set",
[0x05] = "Source route failed",
[0x06] = "Destination network unknown",
[0x07] = "Destination host unknown",
[0x08] = "Source host isolated",
[0x09] = "Network administratively prohibited",
[0x0A] = "Host administratively prohibited",
[0x0B] = "Network unreachable for TOS",
[0x0C] = "Host unreachable for TOS",
[0x0D] = "Communication administratively prohibited"
}
icmp_proto = Proto("ping","PING","Ping") -- please, refer to [1,2,3,4,5]
function icmp_proto.dissector(buffer,pinfo,tree)
pinfo.cols.protocol = "Ping (ICMP)"
local treeitem = tree:add(pmv_proto, buffer(), "Ping (ICMP Protocol)")
local pType = buffer(0, 1):uint() -- extract the type [2,6]
sType = ping_types[pType] -- try to identify the packet type
if sType ~= nil then
treeitem:add(buffer(0, 1), "Type : " .. sType)
if pType == 0x03 then -- in case of errors...
local pCode = buffer(1, 1):uint() -- extract the code [2,6]
sCode = ping_du_codes[pCode]; -- get the error description
treeitem:add(buffer(1, 1), "Error : " .. sCode)
end
pinfo.cols.info = "Ping " .. sType
else
treeitem:add(buffer(0, 1), "Type : unknown/unsupported!")
end
end
local ip_table = DissectorTable.get("ip.proto") -- get access to IP dissector table
-- (using proto field)
ip_table:add(1, icmp_proto) -- setting protocol id (ICMP has id #1 [8])
Il dissector dal vivo


Grazie per la segnalazione ! Ero rimasto alla versione 1.0 di Wireshark ma quest’ultima è molto più interessante.
Dovrei anch’io scrivere un paio di dissector per dei protocolli proprietari ma, a causa del poco tempo a disposizione, non ho mai potuto nemmeno iniziare. Quando sarà il momento, di sicuro rispolvererò i tuoi tutorial .. !
Beh, spero che i miei scrippettini tornino comodi a qualcuno, prima o poi…
Wireshark v1.2.0 mi piace davvero molto anche se non ho ben capito se include anche dei miglioramenti al supporto a Lua o solamente bugfix…
Ho provato a dare un’occhiata ai sorgenti ma non ho così tanto tempo per poterlo fare seriamente..
Sul fronte packet analyzer sto sperimentando anche altre “soluzioni” => to be continued…
Mini-BUMP!
- Sistemato un poco il codice
- Testato anche su Mac (e già che c’ero ho messo anche uno screenshoot)
Ciao! ^^
Spettacolare con LUA! Se penso che l’unico dissector un po’ serio che ho scritto per Ethereal (in C per linux) mi ha fatto soffrire come un cane, pagine e pagine di puntatori che ballavano la salsapariglia, ci ho messo settimane a dargli consistenza e robustezza. Senza contare il fatto che dopo sei mesi avevano cambiato le api e il modulo non compilava più…
Io avevo iniziato a imparare a scrivere un dissector in C quando nel mentre che leggevo la documentazione ho letto la parola magica “Lua” …e ho pensato che era un ottimo modo per prendere due piccioni con una fava…
Ciau & bentornato su queste lande! ^^
buongiorno,
sono un profano di programmazione e desideravo solo una soluzione al problema.
dopo aver installato il programma free di ” freepopos ” sul pc windows xp 2 , all’apertura della pagina di firefox e comunque ogni 2 minuti mi compare la scritta:
“Firefox non sa come aprire questo indirizzo, dato che il protocollo (place) non è associato ad alcun programma.”
Che soluzione posso usare?
grazie, alex!!
Freepops vien usato per scaricare posta attraverso un client di posta come Thunderbird o Outlook, non con un browser come Firefox (a meno che non si usi qualche plugin che consenta ciò).
Il manuale utente spiega bene come configurare Freepops per l’utilizzo con i vari client di posta.
Spero di essere stato di aiuto.
Ciao! ^^
IL FREEPOPS FUNZIONA CORRETTAMENTE ED I PARAMETRI SU OUTLOOK SONO CONFIGURATI COME TU MI DESCRIVI. IL PROBLEMA E’ UN AVVISO FASTIDIOSO E CONTINUO CHE COMPARE DURANTE LA NAVIGAZIONE SU QUALSIASI PAGINA USANDO FIREFOX.
COME POSSO RISOLVERE IL PROBLEMA?
GRAZIE, ALEX!
Uhm… Ho guardato in giro e non ho trovato nulla su quel problema. Non è che hai qualche plugin strano installato? Hai provato a disabilitarli uno a uno per vedere se sono loro la causa?
Ciao!