Script y módulo de inyección de DLL para Windows

Versión: 2.5+.

Inyección de DLL: una técnica para ejecutar tu código (contenido en una DLL) en un proceso tercero. Se trata de reservar la memoria necesaria en el objetivo, almacenar el código contenido en vuestras DLLs (generalmente creadas en C/C++) y luego lanzar un nuevo hilo el cual comenzará a ejecutar el entry point (punto de entrada, función DllMain()) de la librería.

Existen también otras técnicas, como la inyección de código directo vía shellcode, o la inyección de archivos .so en Linux. Sin embargo, el artículo y módulo sólo abarcan la comentada previamente.

Descargas

Antes de comenzar con la descripción del script y módulo, aquí están las descargas correspondientes.

Ambos TestDLL.zip y TestTarget.zip incluyen el archivo en binario compilado utlilizando MinGW y sus respectivos proyectos en CodeBlocks.

Script

El inyector puede ejecutarse como un script de la siguiente manera:

injector.py [ruta_dll] [nombre_o_id_del_proceso]

Es importante que la ruta de la librería esté completa. Si ésta contiene espacios, deberás usar comillas para que el intérprete no separe de forma errónea los argumentos. Ejemplos:

injector.py "C:\Mis documentos\TestDLL\TestDLL.dll" TestTarget.exe
injector.py C:\Documents\TestDLL\TestDLL.dll 11025

El inyector no informará ningún error si has indicado una ruta incorrecta. Por ejemplo, ambos ejemplos a continuación fallarán silenciosamente:

injector.py C:\Mis documentos\TestDLL\TestDLL.dll TestTarget.exe
injector.py TestDLL.dll 11025

En la primera llamada, la ruta contiene espacios pero no se han colocado las comillas. En la segunda, no se ha especificado la ruta completa.

Puedes encontrar el ID del proceso en el que quieras inyectar en el Administrador de Tareas, yendo a la pestaña Detalles.

Vista previa

En Windows XP, si la columna PID no está visible, dirígete al menú Ver, presiona en la opción Seleccionar columnas… y marca la casilla Identificador de proceso (PID). Presiona Aceptar al finalizar.

Módulo

El archivo injector.py exporta una pequeña API para que pueda ser utilizado como un módulo integrado en otros proyectos.

Según el documento PEP 8 el estilo de nombramiento convencional en Python es utilizando minúsculas_con_guiones_bajos. Sin embargo, para mantener la consistencia con la API de Windows, el módulo internamente utiliza PalabrasConMayúscula para las funciones y minúsculaMayúscula para objetos / variables. Para también mantener la compatibilidad con el resto de tu código que, seguramente, utilizará la convención tradicional, exporta sus funciones con ambas nomenclaturas. Dichas funciones son las siguientes:

InjectLibrary / inject_library (ruta_dll, id_proceso, output=False) – Inyecta la DLL especificada en ruta_dll en el proceso con ID id_proceso. El argumento opcional output indica si se imprimirán mensajes de error en la salida estándar. En caso de producirse un error, las excepciones MemoryError y RuntimeError son lanzadas, junto con su respectivo mensaje.

GetProcessIdByName / get_process_id_by_name (nombre_proceso) – Retorna el ID del primer proceso encontrado con el nombre nombre_proceso. Si no se encuentra o no se ha podido determinar, el valor de retorno es None. La excepción RuntimeError será lanzada en caso de producirse un error, junto con su respectivo mensaje.

GetLastError / get_last_error – Retorna el código (numérico) del último error producido. Véase GetLastError en la MSDN.

Aclaraciones

Tanto para el módulo como para el script, cabe aclarar que inyectores que sean ejecutados por el intérprete de Python de 32 bits no podrán cargar DLLs en procesos de 64 bits. Como tampoco lo podrán hacer inyectores de 64 en procesos de 32. Y no está demás decir que en caso de producirse ésto, no habrá mensajes de error, simplemente fallará silenciosamente.

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

2 comentarios.

  1. pero de que sirve inyectar asi, sin python en cada maquina no sirve de nada. si quiero compartir una textura para reemplazar en windows. yo quiero una inyeccción que sea basica pero que la agarren por medio de exes.por ejemplo en un bat: rundll32 TaskbarContextMenu.dll,Inject, la logro inyectar pero es temporal no es permanente, incluso se puede agregar el bat añadido al arranque, pero molesta esa ventana en msdos parpadeando en cada inicio.

    • Recursos Python says:

      Primero, podés convertir cualquier programa de Python en un archivo ejecutable para que corra sin necesidad de que el intérprete esté instalado. Segundo, ese comando que pusiste no inyecta una DLL, así que estamos hablando de cosas diferentes.

      Saludos.

Deja una respuesta