c# - studio - ¿Cómo puedo inyectar un archivo en un EXE en tiempo de ejecución y hacer referencia al archivo durante la operación del programa?
inyecciones a bebes en la pompi (5)
Me gustaría que un usuario descargue un exe de mi sitio web, donde (sincrónicamente tras la descarga) se inyecta un archivo XML en esta aplicación. Este archivo XML contiene una clave pública y una firma.
¿Cómo inyecté el archivo antes de descargarlo y lo referenciaré más tarde durante la ejecución?
Lo ideal es que no use un shell para inyectar el archivo, sino una API nativa.
Agregue el archivo a su proyecto, generalmente algo como:
+solution
+project
+Resources
+SomeDirectory
-SomeFile
Luego vaya a las propiedades de su proyecto, vaya a la pestaña de recursos en el sitio de la izquierda y seleccione el recurso de files
en la barra de navegación superior. Seleccione para agregar un recurso> agregar archivo existente. Busque el archivo que acaba de colocar en su proyecto y seleccione agregarlo.
El archivo aparecerá en la pestaña Recursos de las propiedades de su proyecto. Cambie el nombre de su archivo en la pestaña Recursos para que sea más significativo.
El archivo ahora es un recurso incrustado de su proyecto y puede acceder a él mediante el siguiente código:
var MyFile = Properties.Resources.MyFile
Para inyectar el archivo, agréguelo a su proyecto. A continuación, haga clic con el botón derecho en el explorador de soluciones, vaya a propiedades y cambie su tipo a EmbeddedResource.
Para cargarlo en tiempo de ejecución use Assembly.GetManifestResourceStream()
. Lea más aquí: http://msdn.microsoft.com/en-us/library/xc4235zt.aspx .
Podrías hacerlo fácilmente con Mono.Cecil , solo tendrías que escribir algo como:
var module = ModuleDefinition.ReadModule ("Application.exe");
module.Resources.Add (
new EmbeddedResource (
"signature.xml",
ManifestResourceAttributes.Private,
File.ReadAllBytes ("signature.xml")));
module.Write ("Application.exe",
new WriterParameters {
StrongNameKeyPair = new StrongNameKeyPair ("keypair.snk")
});
Para inyectar el recurso signature.xml desde el archivo signature.xml, y regrese su ensamblado con su keypair.snk que utilizó para firmar Application.exe.
Y en tiempo de ejecución, solo tendrías que usar:
var stream = Assembly.GetExecutingAssembly ()
.GetManifestResourceStream ("signature.xml");
Para recuperar el recurso.
Este resultado de google parece prometedor.
Según lo que escribe, parece que va a cambiar dinámicamente el archivo antes de la descarga. Esto realmente depende del idioma del lado del servidor que usa, y cuánto control tiene sobre su cuenta de servidor / proveedor de alojamiento.
Supongamos que tiene un archivo download.aspx que genera estos archivos ejecutables y los envía para su descarga. Una cosa que puede hacer es colocar la fuente del ensamblado en su servidor y luego descargarlo. Aspx lo ensambla y lo envía para su descarga. (El camino difícil)
Otra forma es colocar el ensamblado compilado en el servidor y luego usar cecil ( Incorporar recursos de forma programada en un ensamblado .NET ) o lo que sea para cambiarlo y luego enviarlo para su descarga.