Keyboard

Per celebrare le 400 e più visite nel mio blog dopo appena 10 giorni (non male, dai), sono riuscito nel mio tempo libero a scrivere un altro articolo, molto interessante, su un’altra popolare categoria di malware: i keylogger.

I keylogger sono una particolare forma di malware particolarmente insidiosa: sono dei software ideati per monitorare ogni tasto premuto sulla tastiera di un qualsiasi device.

A differenza di altri programmi maligni, quindi, non rappresentano un pericolo per il sistema in sé, ma possono diventare un fonte di minaccia infida per gli utenti, visto che possono essere usati per intercettare password, PIN, numeri di conto, informazioni confidenziali.

Ci sono diversi tipi di keylogger: hardware e software. I keylogger software sono più facili da scoprire rispetto a quelli hardware, la maggior parte degli antivirus infatti dovrebbe bloccare molti keylogger.

Keylogger di tipo hardware

Firmware malevolo

Un firmware modificato a livello del bios del sistema gestisce gli eventi del controller della tastiera e li registra quando vengono processati. Si deve avere necessariamente l’accesso fisico al computer o quanto meno un accesso di livello amministratore per poter caricare il firmware modificato nel BIOS, il quale è creato appositamente per la specifica tastiera in uso.

Sniffing di una tastiera wireless

Si sfrutta uno sniffer per intercettare i pacchetti dei dati trasferiti da una tastiera o un mouse senza fili e il suo ricevitore . Quando la comunicazione tra i dispositivi è criptata, è necessario un attacco per decifrarla o sfruttare eventuali falle di sicurezza per poter accedere ai dati. Una volta che l’attacco ha avuto successo è possibile non solo la lettura delle informazioni ma anche il controllo diretto del computer attraverso l’invio di comandi.

Emissioni elettromagnetiche

Una comune tastiera, come ogni altro dispositivo elettronico, emette radiazioni elettromagnetiche. È possibile catturare queste emissioni fino alla distanza di 20 metri, senza essere connessi fisicamente ad essa.

Keylogger di tipo software

A livello kernel

Un programma sulla macchina ottiene un accesso root (cioè con privilegi di amministratore) e si nasconde all’interno del sistema operativo, iniziando a intercettare i segnali delle digitazioni sulla tastiera che passano attraverso il kernel. Un keylogger che risiede a livello del kernel è difficilmente rilevabile, specialmente per applicazioni che non hanno diritti di amministratore. Spesso è implementato come un rootkit che sabota il kernel del sistema operativo per ottenere accessi non autorizzati all’hardware del computer. Diventa quindi molto potente, potendo agire come un driver di una tastiera e ottenendo l’accesso a qualsiasi informazione digitata che viene inviata al sistema operativo.

Uso delle API User Level

Un keylogger che aggancia le API della tastiera all’interno di una applicazione in esecuzione. Registra quindi gli eventi dalla tastiera come fosse un componente di un’applicazione legittima. Il keylogger riceve un evento ogni volta che l’utente preme o rilascia un tasto, quindi lo può registrare. API Windows come GetAsyncKeyState(), GetForegroundWindow() e simili sono utilizzate per acquisire in modo attivo lo stato della tastiera o per registrarsi a questi eventi. Può anche essere effettuato il polling dal BIOS dei codici di autenticazione precedenti al boot, non ancora eliminati dalla memoria.

Hooking

Il keylogger sviluppato da me utilizza una particolare tecnica chiamata Hooking; questo meccanismo permette di intercettare messaggi prima che questi vengano utilizzati dall’applicazione in questione. In questo caso userò un keyboard hook. Per la lista completa di questi hook, puoi visitare MSDN-644959. Ogni volta che un tasto viene premuto, si intercetta il messaggio/evento “tasto premuto” prima che l’applicazione lo riceva.

Prima di spiegare i dettagli tecnici, dobbiamo precisare che esistono due tipi di codici usati nel keyboard hooking:

  • Virtual Key Code: la Virtual Key Code è un codice indipendente dalla tastiera utilizzata, usata dal sistema operativo stesso. Per ogni tasto esiste una chiave univoca, ad esempio per il tasto Shift, la key per VK_SHIFT è (0x10).

  • Scan Code: Lo Scan Code è un codice dipendente dalla tastiera utilizzata, ciò significa che ogni tastiera ha il suo diverso scan code. Quando noi premiamo un tasto sulla tastiera, la keyboard genera uno scan code che il sistema operativo poi traduce in Virtual Key Code.

API utilizzate

SetWindowsHookEx

SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LowLevelKeyboardProc, hExe, 0);
ParametroSignificato
WH_KEYBOARD_LLInstalla una procedura hook che monitora gli eventi input della tastiera
LowLevelKeyboardProcUn pointer che viene chiamato quando succede un evento della tastiera
hExeCollegamento alla DLL che contiene la procedura Hook
dwThreadIdLa procedura Hook è associata a tutti i servizi sul sistema

UnHookWindowsEx

UnhookWindowsHookEx(hKeyHook);
ParametroSignificato
hKeyHookCollegamento con l’hook che deve essere rimosso

GetAsyncKeyState

Determina se un carattere è associato a un altro carattere come SHIFT. Nel nostro caso, servirà a sapere se un tasto sarà maiuscolo o minuscolo.

GetAsyncKeyState(VK_SHIFT);
ParametroSignificato
VK_SHIFTVirtual Key Code per SHIFT, questo parametro si può cambiare. Ulteriori informazioni qui: https://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx

GetKeyNameText

Restituisce una stringa che rappresenta il nome del tasto premuto.

GetKeyNameText(dwMsg,key,15);
ParametroSignificato
dwMsgContiene lo scan code
KeyIl buffer che riceverà il nome della key
CchSizeIl numero massimo di caratteri del nome della key, incluso l’ultimo carattere null che determina la fine della stringa (deve essere minore di 15).

CallNextHookEx

Passa le informazioni sul hook attuale a eventuali hook successivi

CallNextHookEx(NULL, nCode, wParam, lParam);
ParametroSignificato
HhkOpzionale
nCodeLa procedura hook successiva
wParamIl valore di wParam passato all’attuale hook
lParamIl valore di lParam passato all’attuale hook

Algoritmo

  1. Creare un thread per iniziare l’evento “Keylogger”
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) KeyLoggerStart, (LPVOID) argv[0], 0, NULL);
  1. Installare l’hook della tastiera con SetWindowsHookEx
SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC) LowLevelKeyboardFun, hInstance, 0);
  1. Controllare la virtual key per ogni pulsante premuto e scriverlo in un file
  2. Chiamare CallNextHook per passare l’hook all’applicazione
CallNextHookEx(NULL, nCode, wParam, lParam);
  1. Registrare un tasto per l’uscita dal programma
RegisterHotKey(NULL, 1, MOD_CONTROL, 0x39);
  1. Liberare le risorse per l’hook successivo
UnhookWindowsHookEx(hKeyHook);

Dopo aver implementato l’algoritmo, ero curioso di sapere se il sistema me lo bloccasse; Il risultato? No, Windows non blocca alcun programma con un comportamento del genere. Non ho ben capito perché gli ingegneri della Microsoft non abbbiano bloccato alcune funzioni per programmi esterni al sistema come il mio.

In fondo, è possibile riconoscere effettivamente un programma dannoso da uno non dannoso? In questo caso è difficile discriminare cosa è dannoso e cosa non lo è. Potresti dire che per identificarli basta vedere quali programmi accedono alla tastiera, tuttavia ogni programma accede alla tastiera, anche per fare operazioni banali (come risponde un programma ad una sollecitazione di un tasto?). Non è ammissibile bloccare ogni accesso alla tastiera.

Sperando che qualche antivirus me lo bloccasse, ho provato a fare uno scan su Virus Total, ma sorpresa: nessun antivirus mi ha bloccato. Come è possibile che nel 2017 ancora non ci siano antivirus in grado di bloccare dei keylogger? Per giunta, sviluppati dal sottoscritto, quindi neanche perfetti.