Mi sorpresa fue que no funcionó, cosa que si sucede con otras APIs como LoadLibrary o GetModuleHandle (y muchas mas). Entonces decidí realizar una inyección directa, es decir sin dlls, del código necesario para liberar la dll del proceso deseado.
Lo que aquí publico son las bases de la inyección directa de código, prescindiendo de dlls. He de aclarar que todo el código de este tutorial está escrito en C y es completamente funcional. Tenéis una descarga en delphi que he añadido a última hora, simplemente es la traducción del código expuesto en C implementado en una pequeña aplicación.
La primera cuestión a conocer son las API de manejo de memoria:
VirtualAllocEx: Nos localiza memoria en el espacio de direcciones de un proceso.
VirtualFreeEx: Libera la memoria localizada con VirtualAllocEx
WriteProcessMemory: Escribe en un bloque de memoria de otro proceso previamente localizada con VirtualAllocEx
GetProcAddress: Nos proporciona la dirección de una función exportada de una DLL
CreateRemoteThread: Crea un hilo en un proceso remoto.
Hasta aquí, es el conocimiento necesario para inyectar código, tanto con dll como de forma directa. Esto es válido tanto para C/C++ como para delphi.
Saludos.
Edito para resubir los archivos de ejemplo.