Análisis de la tecnología de inyección de secuestro de subprocesos remotos DLL

Inyección de diez procesos (1)

Análisis de la tecnología de inyección de secuestro de subprocesos remotos DLL

La inyección de proceso es una técnica ampliamente utilizada para evitar la detección de malware o ataques sin archivos. Necesita ejecutar código especialmente diseñado en el espacio de direcciones de otro proceso, la inyección del proceso mejora la invisibilidad y algunas tecnologías también logran persistencia.

La llamada inyección DLL es la técnica más utilizada entre muchos métodos de inyección de proceso. El malware escribe la ruta de la biblioteca de enlaces dinámicos maliciosos en el espacio de direcciones virtuales de otro proceso y garantiza que el proceso remoto lo cargue creando un subproceso remoto en el proceso de destino. Y debido a que el proceso infectado carga la propia DLL y el archivo PE no realiza demasiadas operaciones confidenciales en el sistema, esta tecnología tiene un tipo de ocultación muy fuerte.
Inserte la descripción de la imagen aquí

Principio de inyección 0x01

La función clave: CreateRemoteThread ()
Inserte la descripción de la imagen aquí
utiliza el mecanismo de subproceso remoto de Windows, debe abrir y ejecutar un subproceso en otros procesos a través de la función CreateRemoteThread en el proceso local. Por lo tanto, la función LoadLibrary se usa como la función de subproceso abierta por CreateRemoteThread, y la ruta de la DLL que se va a cargar se usa como parámetro de la función de subproceso.

Para permitir que el proceso remoto ejecute la función LoadLibrary para cargar el archivo DLL, se enfrenta a dos problemas difíciles:
¿cómo pasar la ruta DLL que se cargará al proceso remoto? ----------- ①
¿Cómo obtener la dirección de la función LoadLibrary en el proceso remoto? ----------- ②

Para resolver estos problemas, daremos soluciones una por una más tarde

Proceso de inyección 0x02

Para resolver el problema ①, podemos escribir la ruta al proceso remoto a través de la función API de Windows, que incluye principalmente: OpenProcess (), VirtualAllowEx (), WriteProcessMemory (), VirtualFreeEx (), etc. para cargar la ruta DLL en el proceso remoto. El proceso específico es el siguiente

  1. Obtenga el identificador del proceso de destino
    Utilice la función OpenProcess () para abrir el identificador del proceso remoto.
    Inserte la descripción de la imagen aquí
  2. Asignar espacio de memoria en el proceso de destino
    Use la función VirtualAllowEx () para asignar suficiente espacio de memoria en el proceso de destino para guardar la ruta para cargar la DLL.
    Inserte la descripción de la imagen aquí
  3. Escribir la ruta DLL en el proceso de destino
    Use la función WriteProcessMemory () para escribir la ruta DLL que se cargará en el espacio de memoria asignado por el proceso remoto.
    Inserte la descripción de la imagen aquí
  4. Obtenga la dirección LoadLibraryW
    Para resolver el problema ②, necesitamos aclarar que Kernel32.dll es la biblioteca básica del sistema, y ​​en el sistema Windows, la dirección base del módulo Kernel32.dll es fija y consistente en todos los procesos, por lo que solo es necesario obtener la dirección LoadLibrary en el proceso local. De manera similar, la función LoadLibraryW se encuentra en kernel32.dll y la DLL central del sistema se cargará en una dirección fija, por lo que la dirección de la función LoadLibraryW de todos los procesos en el sistema es la misma. Utilice la función GetProcAddress para obtener la dirección de LoadLibraryW del proceso local.
    Inserte la descripción de la imagen aquí
  5. Ejecute el subproceso remoto en el proceso de destino
    Use la función CreateRemoteThread para crear un subproceso en el proceso remoto, deje que el nuevo subproceso llame a la función LoadLibrary correcta y pase la dirección de memoria asignada en el paso 2 en los parámetros. En este momento, la DLL ha sido inyectada en el espacio de direcciones del proceso remoto, y la función DllMain de la DLL recibirá la notificación DLL_PROCESS_ATTACH y puede ejecutar el código que queremos ejecutar. Cuando vuelve DllMain, el subproceso remoto volverá a la función BaseThreadStart de la llamada LoadLibraryW / A. La función BaseThreadStart luego llama a ExitThread para terminar el hilo remoto.
    Inserte la descripción de la imagen aquí

Método de defensa 0x03

  1. Refuerce su propio programa, recorra el archivo dll debajo de la ruta y asegúrese de que el MD5 y la firma digital estén seguros antes de la carga posterior.
  2. Instale una herramienta para matar caballos de Troya para monitorear llamadas de subprocesos remotos en tiempo real
  3. Compruebe si hay puertos desconocidos abiertos y controle la comunicación del puerto.
  4. Intercepte su propia función LoadLibraryExW para evitar que los subprocesos remotos carguen archivos DLL en sus propios programas
Publicó 21 artículos originales · ganó 14 · visitó 4075

Supongo que te gusta

Origin blog.csdn.net/m0_38103658/article/details/101197045
Recomendado
Clasificación