
Una prueba de concepto que demuestra callbacks de instrumentación en Windows 10 21h1 con una variable TLS para asegurar que todas las syscalls sean capturadas.
Los callbacks de instrumentación son una parte bastante divertida y no documentada de Windows. Todo el código en este repositorio se publica bajo la licencia MIT. Este repositorio utiliza el espaciado de C++ al estilo de Google.
Las PRs son bienvenidas si encuentras problemas, errores o crees que se debería agregar una función específica.
Los callbacks de instrumentación te permitirán manejar todas las syscalls (¡y excepciones!) despachadas por un proceso en el que hayas colocado un callback.
Por supuesto, cada syscall será capturada, así que mientras el callback se está ejecutando, normalmente no deberías emitir más syscalls dentro de él a menos que quieras terminar recursando para siempre.
Esto limitaría en gran medida lo que puedes hacer dentro del callback, o al menos plantearía algún tipo de desafío de diseño, pero en el siguiente párrafo verás una solución bastante elegante al problema.
No es perfecto, ya que un atacante eventual podría establecer intencionadamente la variable para deshabilitar el callback, pero es casi perfecto para fines de análisis.
Una solución a este problema podría ser establecer una bandera a verdadero/falso que habilite y deshabilite las capacidades de análisis del callback, dejando pasar esencialmente cada syscall si ya se está manejando otra syscall.
Sin embargo, esto dejará pasar la mayoría de las syscalls.
Este repositorio, en cambio, resuelve el problema de no poder emitir syscalls dentro de un callback estableciendo una variable dependiente de TLS, asegurándonos de manejar todas las syscalls de todos los hilos mientras podemos llamarlas nosotros mismos; las únicas syscalls que nos perderemos son las que emitamos desde dentro del callback, las cuales (en la mayoría de situaciones, como aquellas en las que estamos analizando software) probablemente no nos importan.
Los callbacks de instrumentación tienen muchos usos posibles, uno de ellos podría ser con fines anti-trampas: podrías analizar las syscalls provenientes del proceso y determinar si provienen de un espacio de direcciones ilegítimo o si se están utilizando con fines maliciosos sin necesidad de llenar las DLL del sistema con parches y hooks.
También podrías usarlos para ganar ejecución de código dentro de un proceso; si puedes asignar y escribir en memoria y luego establecer la información del proceso, podrás secuestrar un hilo que ejecuta una syscall haciendo que llame a un callback tuyo.
Por supuesto, no apruebo el uso de ningún código en este repositorio ni en mis otros repositorios para desarrollar software de trampas o malicioso.
Lo que hagas con esto es tu propia responsabilidad.