Gli hook sono implementati in molti modi:
- Modifica delle istruzioni di salto legittime in modo che puntino agli hook anziché al codice normale.
- Aggancio tabella chiamate utente (IAT) - modifica degli indirizzi delle API in modalità utente in un processo.
- Aggancio tabella chiamate Kernel (ad esempio SSDT / GDT) - sostituendo un puntatore della tabella chiamate con l'indirizzo del proprio hook.
- Ami WndProc (ad esempio
PeekMessage
) - si agganciano ai messaggi di notifica della finestra.
- Richiami legittimi come
PsSetCreateProcessNotifyRoutine
.
Suppongo che tu sia più interessato ai primi due tipi.
I jump hook possono essere creati in un numero quasi infinito di modi. Ciò rende quasi impossibile scrivere uno strumento per identificare i ganci. Tuttavia, puoi utilizzare trucchi per il controllo dell'integrità, ad es. confronto del codice nel file binario (ad esempio exe
o dll
) al codice in memoria. Puoi anche agganciare WriteProcessMemory
e altre API di questo tipo per rilevare la modifica della memoria del processo, sebbene funzioni solo contro gli attacchi in modalità utente.
I ganci IAT sono un po 'più facili da controllare. Scatta un'istantanea dello IAT di un processo quando inizia (ad esempio, dal binario statico) e confronta lo IAT in memoria con gli indirizzi reali delle funzioni che dovrebbero essere lì. Ad esempio, se si conosce la voce IAT 4 punti su user32.MessageBoxA
, è possibile utilizzare GetProcAddress
per trovare l'indirizzo reale di tale funzione e confrontare l'indirizzo nell'IAT con quello. Se non corrispondono, sai che è stato agganciato.
Per ulteriori approfondimenti, c'è un ottimo paper sull'argomento, e consiglio vivamente di leggere "< a href="http://rads.stackoverflow.com/amzn/click/144962636X"> The Rootkit Arsenal "di Bill Blunden.