Compilare Wireshark da sorgente e creare un dissector personalizzato (anche da IDL CORBA)
Quando basta un dissector in Lua, come si compila Wireshark oggi su Linux e su Windows, come si genera un dissector dai file IDL CORBA con idl2wrs e una nota sui timestamp in Windows.
https://www.electronics-engineering.com/articolo_4228-come_compilare_wireshark_e_potenziare_le_sue_funzionalita.htm
Wireshark legge centinaia di protocolli, ma prima o poi capita di lavorare con uno che non conosce: un protocollo proprietario, un formato di messaggi interno, una comunicazione CORBA descritta da file IDL. Anni fa mi sono trovato esattamente in questa situazione: per vedere in chiaro i messaggi IDL di un sistema ho dovuto compilare Wireshark da sorgente e aggiungergli un dissector generato dagli IDL. Questa pagina racconta come si fa oggi, che la procedura è molto cambiata, e quando invece conviene evitare di ricompilare.
Prima di compilare: forse basta Lua
Wireshark esegue dissector scritti in Lua senza ricompilare nulla. Per un protocollo semplice è la strada più rapida: si scrive un file .lua, lo si copia nella cartella dei plugin personali (la si trova in Aiuto → Informazioni su Wireshark → Cartelle) e si riavvia il programma.
-- mioproto.lua: messaggio con tipo (1 byte), lunghezza (2 byte) e dati
local p = Proto("mioproto", "Il mio protocollo")
local f_tipo = ProtoField.uint8("mioproto.tipo", "Tipo", base.DEC)
local f_len = ProtoField.uint16("mioproto.len", "Lunghezza", base.DEC)
local f_dati = ProtoField.bytes("mioproto.dati", "Dati")
p.fields = { f_tipo, f_len, f_dati }
function p.dissector(buf, pinfo, tree)
pinfo.cols.protocol = "MIOPROTO"
local t = tree:add(p, buf(), "Il mio protocollo")
t:add(f_tipo, buf(0, 1))
t:add(f_len, buf(1, 2))
t:add(f_dati, buf(3, buf(1, 2):uint()))
end
DissectorTable.get("tcp.port"):add(5000, p)Un dissector in C serve quando il traffico è tanto e la velocità conta, quando si vuole distribuire una versione di Wireshark già pronta ai colleghi, o quando il dissector viene generato automaticamente, come nel caso degli IDL CORBA.
Compilare Wireshark su Linux
Su Debian e Ubuntu è questione di pochi comandi. Il sorgente è su GitLab e contiene uno script che installa tutte le dipendenze:
git clone https://gitlab.com/wireshark/wireshark.git
cd wireshark
sudo tools/debian-setup.sh --install-optional
mkdir build && cd build
cmake -G Ninja ..
ninja
./run/wiresharkLa prima compilazione richiede qualche minuto; quelle successive ricompilano solo i file modificati. Per Fedora e derivate c’è lo script equivalente tools/rpm-setup.sh.
Compilare Wireshark su Windows
Rispetto ai tempi di Visual C++ 2008, Cygwin e nmake, oggi il percorso è più lineare: CMake genera la soluzione di Visual Studio e le librerie esterne vengono scaricate da sole. Servono:
- Visual Studio 2022 (anche la Community, gratuita) con il carico di lavoro “Sviluppo di applicazioni desktop con C++”;
- Qt 6 per l’interfaccia, installato con il programma di installazione online di Qt (componente MSVC 64 bit e modulo Qt5Compat);
- Git, CMake, Python 3, Strawberry Perl e winflexbison, comodi da installare con Chocolatey:
choco install -y git cmake python3 strawberryperl winflexbison3.
Poi si imposta la variabile d’ambiente WIRESHARK_BASE_DIR (per esempio C:\Development, dove finiranno le librerie esterne) e si indica dove si trova Qt con CMAKE_PREFIX_PATH. Da un “x64 Native Tools Command Prompt for VS 2022”:
cd C:\Development
git clone https://gitlab.com/wireshark/wireshark.git
mkdir wsbuild64 && cd wsbuild64
cmake -G "Visual Studio 17 2022" -A x64 ..\wireshark
msbuild /m /p:Configuration=RelWithDebInfo Wireshark.sln
run\RelWithDebInfo\Wireshark.exePer creare un programma di installazione da dare ad altri servono anche NSIS e i progetti wireshark_nsis_prep e wireshark_nsis, che si compilano con lo stesso msbuild. La guida ufficiale per sviluppatori (Wireshark Developer’s Guide) descrive ogni dettaglio e va controllata quando si cambia versione, perché i requisiti si aggiornano spesso.
Un dissector generato dai file IDL
Wireshark riconosce il protocollo GIOP/IIOP di CORBA, ma senza la descrizione dei messaggi mostra solo byte. La descrizione sta nei file IDL, e Wireshark include uno strumento che li trasforma in un dissector C: idl2wrs, nella cartella tools del sorgente. Si appoggia al compilatore IDL di omniORB (omniidl), che va installato prima.
idl2wrs messaggi.idl > packet-messaggi.cIl file generato diventa un plugin: lo si mette in una cartella sotto plugins/epan/ insieme a un CMakeLists.txt (si può copiare quello di un plugin esistente, come plugins/epan/gryphon, cambiando i nomi), e si aggiunge la cartella all’elenco dei plugin personalizzati copiando CMakeListsCustom.txt.example in CMakeListsCustom.txt. Una nuova compilazione produce la DLL o la libreria del plugin.
Qualche consiglio dall’esperienza:
- Se gli IDL sono tanti, raccoglili in un’unica cartella mantenendo la struttura delle sottocartelle e genera i file con uno script, così ripetere l’operazione a ogni revisione degli IDL è questione di minuti.
- Il codice generato non sempre compila al primo colpo con le versioni recenti del compilatore: variabili non usate e dichiarazioni duplicate sono gli errori più comuni. I messaggi del compilatore indicano esattamente dove intervenire.
- Distinguere la tua versione da quella ufficiale aiuta molto: aggiungi un suffisso riconoscibile alla versione del progetto (nel
CMakeLists.txtprincipale) e vedrai subito, nella finestra Informazioni, quale build stai usando e con quale revisione degli IDL.
La procedura completa che usavo su Linux, dagli IDL al dissector compilato dentro Wireshark, è raccolta in questa guida in PDF (in inglese), che puoi sfogliare qui sotto o scaricare. Ci sono comandi e versioni di quegli anni: i passaggi descritti sopra sono quelli aggiornati, il PDF resta utile come esempio concreto di tutto il percorso. La stessa guida è anche nell’articolo How to Compile Wireshark with IDL in a Linux Environment.
Una nota sui timestamp in Windows
Ai tempi di WinPcap, su alcune macchine virtuali multiprocessore i timestamp dei pacchetti potevano risultare non monotoni, e la soluzione era cambiare la modalità di temporizzazione del driver nel registro di sistema, rinunciando ai microsecondi. Oggi Wireshark usa Npcap, che permette di scegliere il tipo di timestamp direttamente dalle opzioni di cattura. Se misuri tempi di risposta al millisecondo, controlla comunque la sincronizzazione dell’orologio e cattura, quando puoi, su una macchina fisica.
Se hai bisogno di aiuto per compilare o per scrivere un dissector, lascia un commento qui sotto.






Sono l'autore di questa pagina su «Compilare Wireshark da sorgente e creare un dissector personalizzato (anche da IDL CORBA)». Se qualcosa non è chiaro, se vi serve un esempio in più o volete approfondire un punto, scrivetelo qui sotto nei commenti: rispondo personalmente. Se la pagina vi è stata utile, lasciate un voto con le stelle in cima all'articolo.I am the author of this page on “Building Wireshark from source and writing a custom dissector (including CORBA IDL)”. If something is unclear, if you need another example or want to go deeper into a point, write it in the comments below: I answer personally. If the page was useful, leave a star rating at the top of the article.