APC Injection
QueueUserAPC
Última actualización
QueueUserAPC
Última actualización
En esta entrada se dará introducción a otra forma de ejecutar una carga útil (payload) sin tener que crear un nuevo hilo. Esta técnica se conoce como inyección APC.
Las llamadas a procedimientos asíncronos son un mecanismo del sistema operativo Windows que permite a los programas ejecutar tareas de forma asíncrona mientras continúan ejecutando otras tareas. Las APC se implementan como rutinas en modo kernel que se ejecutan en el contexto de un hilo específico. El malware puede aprovechar los APC para poner en cola una carga útil y hacer que se ejecute cuando se programe.
No todos los subprocesos pueden ejecutar una función APC en cola, sólo los subprocesos en estado de alerta pueden hacerlo.
Un subproceso en estado de alerta es un subproceso en estado de espera. Cuando un subproceso entra en estado de alerta, se coloca en una cola de subprocesos de alerta, lo que le permite ejecutar funciones APC en cola.
Para poner en cola una función APC en un subproceso, la dirección de la función APC debe pasarse a la WinAPI QueueUserAPC.
Según la documentación de Microsoft,
An application queues an APC to a thread by calling the QueueUserAPC function. The calling thread specifies the address of an APC function in the call to QueueUserAPC.
La dirección de la carga útil inyectada se pasará a QueueUserAPC para que se ejecute. Antes de hacerlo, un hilo en el proceso local debe ser colocado en un estado de alerta.
QueueUserAPC se muestra a continuación y acepta 3 argumentos:
pfnAPC
- La dirección de la función APC a llamar.
hThread
- Un "handle" a un hilo alertado o suspendido.
dwData
- Si la función APC requiere parámetros, pueden pasarse aquí.
El subproceso que ejecutará la función en cola debe estar en estado de alerta. Esto puede hacerse creando un hilo y utilizando una de las siguientes WinAPIs:
Estas funciones se utilizan para sincronizar hilos y mejorar el rendimiento y la capacidad de respuesta en las aplicaciones, sin embargo en este caso, pasar un handle a un evento ficticio es suficiente. Pasar los parámetros correctos a estas funciones no es necesario, ya que el simple uso de una de las funciones es suficiente para colocar el hilo en un estado de alerta.
Para crear un evento ficticio, se utilizará la WinAPI CreateEvent . El objeto evento recién creado es un objeto de sincronización que permite a los hilos comunicarse entre sí mediante la señalización y la espera de eventos. Dado que la salida de CreateEvent es irrelevante, cualquier evento válido puede ser pasado a las WinAPIs mostradas anteriormente.