Vai al contenuto
ELECTRONICS ENGINEERINGelectronics-engineering.com
Freeware per PC Reti di Telecomunicazione

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

Ti è stata utile questa pagina? Votala:
media 4,0 su 1 voto

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/wireshark

La 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.exe

Per 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.c

Il 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.txt principale) 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.

Iscriviti
Notificami
guest
1 commento
Vecchi
Più recenti Le più votate
1
0
Esprimete la vostra opinione commentando.x