2009-03-12 15 views
10

Como dice la pregunta, quiero cargar una DLL desde una ubicación en la memoria en lugar de un archivo, de forma similar a LoadLibrary (Ex). No soy un experto en WinAPI, así que busqué en Google un poco y encontré this article junto con la biblioteca de MemoryModule que más se ajusta a mis necesidades.Cargando la DLL desde una ubicación en la memoria

Por otro lado, la información es bastante antigua y la biblioteca no se ha actualizado durante un tiempo. Así que quería saber si hay formas diferentes, nuevas y mejores de hacerlo. Además, si alguien ha utilizado la biblioteca mencionada en el artículo, ¿podría darnos una idea de lo que podría enfrentar al usarla?

Solo para los curiosos, estoy explorando el concepto de encriptar algunos complementos para aplicaciones sin almacenar la versión descifrada en el disco.

+2

Aquí está el código fuente listo para usar para cargar DLL desde la memoria: https://github.com/fancycode/MemoryModule – user1528094

Respuesta

3

Bueno, puede crear una unidad de RAM según these instructions, luego copie el archivo DLL que pueda en la memoria a un archivo allí y use LoadLibrary().
Por supuesto, esto no es muy práctico si planea implementar esto como algún tipo de producto porque las personas van a notar que se está instalando un controlador, un reinicio después de la instalación y una nueva letra de unidad en Mi PC. Además, esto no hace nada para ocultar la DLL, ya que está ahí, en la unidad RAM, para que todos puedan verla.

Otra cosa que me interesa es ¿Por qué realmente quieres hacer esto? Tal vez su resultado final se puede lograr de otra manera que no sea cargar la DLL desde la memoria. Por ejemplo, cuando se utiliza un empaquetador binario como UPX, la DLL que tiene en el disco es diferente de la que finalmente se ejecuta. Inmediatamente después de que la DLL se carga normalmente con LoadLibrary, el desempaquetador inicia y reescribe la memoria con la que se carga la DLL con el binario descomprimido (la cabecera DLL se asegura de que haya suficiente espacio asignado)

+0

Sí, podría imitar el comportamiento de UPX y usar mi desempaquetador/descifrador como un punto de entrada, que podría negociar la clave con la aplicación principal en ese momento. Marcaré esta respuesta como aceptada, ¡gracias por las numerosas ideas! –

5

La implementación de su propio cargador DLL puede ponerse realmente peluda muy rápido. Al leer este artículo, es fácil perderse el tipo de casos extremos en los que te puedes meter. Recomiendo enfáticamente que no sea así.
Solo por un gusto: considere que no puede usar herramientas de depuración convencionales para el código en la DLL que está cargando, ya que el código que está ejecutando no aparece en la región de ninguna DLL conocida por el sistema operativo.
Otro problema grave es tratar con DEP en Windows.

+0

Gracias por la información. Estoy de acuerdo en que volver a implementar el cargador DLL no es una buena idea, por lo que estoy buscando otras maneras de hacerlo, quizás sea posible copiar LoadLibrary o el sistema de archivos de alguna manera. –

+0

Los problemas resultantes se enumeran en más detalle aquí: https://www.codeproject.com/Tips/430684/Loading-Win-DLLs-manually-without-LoadLibrary – Elmue

Cuestiones relacionadas