Estoy inyectando código x86 nativo en una aplicación .NET, a través de una devolución de llamada TLS en la imagen binaria. Desafortunadamente, los ejecutables .NET solo importan mscorlib.dll
dentro del PE y tienen kernel32.dll
asignado automáticamente en el espacio de memoria en tiempo de ejecución. No quiero inyectar ninguna importación. Esto hace que la búsqueda de las direcciones de LoadLibrary
y GetProcAddress
sea torpe.
Mi primer pensamiento para una solución fue encontrar el PEB a través de mov eax, dword ptr [fs:030h]
, luego cargar PEB->Ldr
y PEB->Ldr.InMemoryOrderModuleList.Flink
desde allí, y usarlos para encontrar el módulo en la memoria. Desde allí, podría tomar la dirección base de kernel32.dll
en la memoria, y desplazarme al encabezado PE y al directorio RVA de exportación. Desde allí, puedo escanear las entradas de importación para la exportación por nombre y encontrar la dirección.
Esto tiene los siguientes problemas:
- Un montón de código para algo tan trivial como una llamada a la API.
- La cadena ASCII que representa el nombre de la API debería estar incrustada en el código.
- El almacenamiento en caché de las direcciones encontradas en un largo tiempo de ejecución / múltiples subprocesos es incómodo.
¿Hay una forma más limpia de hacerlo que resuelva estos problemas, sin recurrir a la importación de inyección? Tenga en cuenta que no puedo cambiar el EP de la imagen, porque CLR se basa en que el EP es un salto al IL administrado.