.net - run - Ejecutar un ensamblado.exe desde un búfer en C
ejecutar powershell desde c# (3)
Como el .exe tendrá IL, en lugar de las instrucciones reales de la máquina, no puede ejecutarlo directamente. Lo mejor es usar la API de alojamiento de CLR , e incluso entonces no estoy seguro de que pueda funcionar sin tocar el disco. Ciertamente, cualquier código .NET que se ejecute como resultado de la ejecución del código de ensamblaje terminará cargando ensamblados CLR desde el disco.
Estoy trabajando en un proyecto relacionado con las tecnologías de sandboxing.
Actualmente estoy escribiendo un programa en C que obtiene un pequeño binario .exe
(.NET)
de un servidor web remoto. Este binario se almacena en la memoria (nunca toque el disco) y mi intención es ejecutar este binario desde la memoria. Si mi cliente se hizo en .NET
no tendría ningún problema en ejecutar ese ensamblaje desde la memoria (de hecho, hay muchas maneras diferentes de obtener esto) pero, por supuesto, eso no es posible con C
(no estoy completamente seguro).
Mis preguntas son: tener ese ensamblado .exe
en el espacio de direcciones de mi programa C
, ¿hay alguna forma de ejecutarlo desde allí? ¿Hay alguna manera de permitir que el CLR
ejecute? Al principio, pensé en invocar powershell para ejecutarlo desde allí (utilizando Reflection.Assembly), pero ese caso implica escribir el ensamblaje en el disco.
En cualquier caso, no hay duda de que la mejor y más eficiente forma de hacerlo es mediante el uso de un cliente .NET
.
Si es un exe. compilar desde .net, entonces es posible, consulte http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory
Si se trata de un binario no administrado, no tengo conocimiento de un método para hacerlo. Si no puede guardarlo en el disco duro, incluso en una carpeta temporal, podría probar algún tipo de disco RAM. La ejecución es fácil con el siguiente código:
//this is using imports from System.Diagnostics and System.IO
byte[] exeBytes = GetBytesFromStream(stream); // Get the .exe file from a webstream or something
string tmpFilename = Path.GetFileNameWithoutExtension(Path.GetTempFileName()) + ".exe";
string tmpFilePath = Path.Combine(Path.GetTempPath, tmpFilename);
File.WriteAllBytes(tmpFilePath, exeBytes);
Process.Start(tmpFilePath);
Si ha cargado el archivo exe en la memoria y tiene la dirección virtual de eso (en el espacio virtual de su aplicación), tal vez pueda usar comandos de ensamblaje como jump, o algún método como inyecciones de DLL para ejecutar el otro exe.