2011-03-17 18 views
6

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 puedo inyectar un archivo en un EXE en tiempo de ejecución y hacer referencia al archivo durante la operación del programa?

¿Cómo puedo inyectar el archivo antes de descargarlo y consultarlo más adelante durante la ejecución?

Idealmente, no utilizaré un shell para inyectar el archivo, sino una API nativa de .NET.

+0

Hey, ¿podría cualquiera pedir más información o aceptar una respuesta? –

+0

@JB: disculpa, codificación y pruebas de unidad demasiado ocupadas. – LamonteCristo

Respuesta

8

Usted podría tan fácilmente con Mono.Cecil, usted sólo tiene 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 del archivo signature.xml, y firmar de vuelta a su ensamblaje con su par de claves .snk que solía firmar Application.exe.

Y en tiempo de ejecución, usted sólo tiene que utilizar:

var stream = Assembly.GetExecutingAssembly() 
    .GetManifestResourceStream ("signature.xml"); 

Para recuperar el recurso.

1

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.

+0

Creo que quiso decir modificar el recurso en un ensamblado binario compilado. –

+1

sí, podría estar pidiendo que se incruste el archivo después de la compilación. – Kumar

+1

Bueno, entonces respondí la mitad de la pregunta: cómo acceder :) – Alex

1

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 proveedor de servidor/host.
Supongamos que tiene un archivo download.aspx que genera estos archivos exe y los envía para su descarga. Una cosa que puede hacer es colocar el origen del ensamblado en su servidor y luego descargarlo. Aspx lo ensambla y lo envía para su descarga. (La forma más difícil)
Otra forma es poner el ensamblado compilado en el servidor y luego usar, por ejemplo, cecil (Programmically embed resources in a .NET assembly) o lo que sea para cambiarlo y luego enviarlo para su descarga.

0

Agregue el archivo a su proyecto, por lo general algo en la línea de:

+solution 
    +project 
    +Resources 
     +SomeDirectory 
     -SomeFile 

A continuación, ir a las características de su proyecto, vaya a la pestaña de recursos en el sitio izquierdo y seleccione el files recurso en la navegación superior bar. 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 es ahora un recurso incrustado de su proyecto y se puede acceder a ella por el siguiente en código:

var MyFile = Properties.Resources.MyFile 
+0

Esta no es la respuesta correcta después de volver a leer la pregunta del OP. El título pregunta cómo insertar un archivo en un archivo ejecutable, pero la pregunta es cómo insertar un archivo en un archivo ejecutable. He editado el título de la pregunta para reflejar la pregunta real. Siéntase libre de borrar mi respuesta si lo desea. –

Cuestiones relacionadas