Hooks se implementan de muchas maneras:
- Modificar instrucciones de salto legítimas para que apunten a los ganchos en lugar del código normal.
- Enlace de la tabla de llamadas de usuario (IAT): modificación de las direcciones de las API de modo de usuario en un proceso.
- Enlace de la tabla de llamadas al kernel (por ejemplo, SSDT / GDT): reemplaza un puntero de la tabla de llamadas con la dirección de tu enlace.
- Enganches WndProc (por ejemplo,
PeekMessage
): se enganchan en los mensajes de notificación de la ventana.
- devoluciones de llamada legítimas como
PsSetCreateProcessNotifyRoutine
.
Supongo que está más interesado en los dos primeros tipos.
Los ganchos de salto pueden crearse en un número casi infinito de formas. Esto hace que sea casi imposible escribir una herramienta para identificar los ganchos. Sin embargo, puede utilizar trucos de comprobación de integridad, por ejemplo, comparando el código en el archivo binario (por ejemplo, exe
o dll
) con el código en la memoria. También puede enlazar WriteProcessMemory
y otras API similares para detectar la modificación de la memoria del proceso, aunque esto solo funciona contra ataques de modo de usuario.
Los ganchos IAT son un poco más fáciles de verificar. Tome una instantánea de la IAT de un proceso cuando se inicie (por ejemplo, desde el binario estático) y compare la IAT en memoria con las direcciones reales de las funciones que deberían estar allí. Por ejemplo, si conoce la entrada IAT 4 puntos a user32.MessageBoxA
, puede usar GetProcAddress
para encontrar la dirección real de esa función y comparar la dirección en el IAT con eso. Si no coinciden, sabes que se ha enganchado.
Para más información, hay un gran documento sobre el tema, y recomiendo encarecidamente leer "< a href="http://rads.stackoverflow.com/amzn/click/144962636X"> The Rootkit Arsenal "por Bill Blunden.