WinKnock v2 — client Windows per knockd riscritto in WPF

Nel gennaio 2023 avevo pubblicato WinKnock, un piccolo client Windows scritto in C# con WinForms per interfacciarsi con knockd. Niente di ambizioso: non trovavo uno strumento che facesse quello che mi serviva, così ne ho scritto uno. Supportava l'invio misto TCP/UDP, il salvataggio di sequenze con descrizione e l'invio in ordine inverso — comodo per chi usa la stessa sequenza rovesciata per chiudere il servizio che la sequenza normale apre. Tutto salvato in un file di testo, niente dipendenze, niente installer.

Quella versione ha fatto il suo lavoro per qualche tempo. Col passare dei mesi però l'interfaccia iniziava a mostrare i limiti di WinForms: layout rigido, aspetto datato, difficoltà a scalare su schermi HiDPI. Ho deciso di riscriverla.

La nuova versione

Il progetto usa WPF come framework UI. La scelta di WPF rispetto ad alternative più moderne come WinUI 3 o Avalonia è stata pragmatica: il target è Windows, il progetto è piccolo, e WPF offre la flessibilità sui template necessaria per costruire un tema coerente senza introdurre dipendenze esterne pesanti.

L'interfaccia segue un tema scuro. Ogni controllo — pulsanti, text box, combo box — è stato ridefinito con template personalizzati per avere un aspetto uniforme. Questa parte ha richiesto più attenzione del previsto: WPF ha alcune sottigliezze nella risoluzione degli stili che si manifestano solo a runtime e non in fase di design.

Un caso concreto: i pulsanti mostravano testo bianco su sfondo chiaro anche con un tema dark correttamente configurato. Il problema stava nel modo in cui WPF gestisce il ContentPresenter quando il contenuto è una stringa. In quel caso viene creato internamente un TextBlock implicito che risolve il proprio stile risalendo l'albero logico — non quello visuale del template — trovando e applicando lo stile globale definito in App.xaml prima di qualunque risorsa definita nel template stesso. La soluzione è stata sostituire il ContentPresenter con un TextBlock esplicito e binding diretto su Foreground.

Funzionalità

Rispetto alla versione precedente le funzionalità core rimangono le stesse: invio misto TCP/UDP, sequenze salvabili con descrizione, ordine inverso. Il cambio principale è nell'usabilità: la gestione dei profili è più accessibile, il feedback visivo durante l'invio dei pacchetti è più chiaro, e l'interfaccia scala correttamente su display ad alta densità.

Schermata Profiles — lista dei profili salvati con hostname e numero di porte

La schermata principale elenca i profili salvati. Da qui si può creare, duplicare o eliminare un profilo, e attivare l'esecuzione automatica all'avvio.

Schermata Sequence Editor — configurazione della sequenza di porte per un profilo

Il Sequence Editor mostra la sequenza associata al profilo selezionato. Per ogni porta si configura numero, protocollo (TCP/UDP) e delay in millisecondi. I pulsanti SEND e REVERSE eseguono rispettivamente la sequenza normale e quella invertita.

Integrazione CLI e PuTTY

L'applicazione può essere invocata senza aprire l'interfaccia grafica, il che la rende utilizzabile direttamente da script batch o come pre-comando in PuTTY.

# Esegui un profilo ed esci
winknock.exe --run "My VPS"

# Esegui in ordine inverso (teardown)
winknock.exe --run "My VPS" --reverse

# Elenca i profili salvati
winknock.exe --list

# Wrapper PuTTY: knock e poi connetti
@echo off
winknock.exe --run "My VPS"
if %errorlevel%==0 putty.exe -load "My VPS Session"

Il wrapper per PuTTY è il caso d'uso più comune: si lancia lo script, la sequenza viene inviata, e solo se va a buon fine viene aperta la sessione SSH. Niente finestre grafiche, niente interazione manuale.

Download

Considerazioni finali

Non è un progetto che nasce dall'ambizione di costruire qualcosa di nuovo. knockd esiste da vent'anni, il port knocking è una tecnica consolidata, e i client Windows per farlo sono pochi ma esistono. Questo strumento risponde a un'esigenza concreta nel mio flusso di lavoro, ed è scritto nel modo più semplice possibile per soddisfarla.

Il codice sarà disponibile a breve.