elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Ejecutar un ejecutable entro de un recurso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejecutar un ejecutable entro de un recurso  (Leído 3,051 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Ejecutar un ejecutable entro de un recurso
« en: 29 Diciembre 2016, 22:04 pm »

Hola:

Tengo un ejecutable llamado Validar.exe en un recurso.

Más información poner o quitar reursos.

He creado una palicación en consola con C#.
Código
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Reflection;
  5.  
  6. namespace Ejecutable_dentro_de_recursos_consola_01
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            Console.Title = "Ejecuta Validar.exe dentro de C#.";
  13.            Console.WriteLine("Funcionando C#...");
  14.            CopiarRecurso(Assembly.GetExecutingAssembly(), "Recursos.Validar.exe", "Validar.exe");
  15.            ProcessStartInfo info = new ProcessStartInfo("Validar.exe");
  16.            Process.Start(info);
  17.  
  18.        }
  19.  
  20.        public static void CopiarRecurso(Assembly pAssembly, string pNombreRecurso, string pRuta)
  21.        {
  22.            using (Stream s = pAssembly.GetManifestResourceStream(pAssembly.GetName().Name + "." + pNombreRecurso))
  23.            {
  24.                if (s == null)
  25.                {
  26.                    throw new Exception("No se puede encontrar el recurso '" + pNombreRecurso + "'");
  27.                }
  28.  
  29.                byte[] buffer = new byte[s.Length];
  30.                s.Read(buffer, 0, buffer.Length);
  31.                using (BinaryWriter sw = new BinaryWriter(File.Open(pRuta, FileMode.Create)))
  32.                {
  33.                    sw.Write(buffer);
  34.                }
  35.            }
  36.        }
  37.    }
  38. }

Error:
Excepción no controlada del tipo 'System.Exception' en Ejecutable_dentro_de_recursos_consola_01.exe

Información adicional: No se puede encontrar el recurso 'Recursos.Validar.exe'


¿Algo se me escapa?

Ni poniendo la ruta completa, me hace caso. Da el mismo error.

Felices fiestas 2016.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Ejecutar un ejecutable entro de un recurso
« Respuesta #1 en: 30 Diciembre 2016, 01:12 am »

¿Algo de aquí te ayuda?
http://stackoverflow.com/questions/1388052/resource-from-assembly-as-a-stream


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ejecutar un ejecutable entro de un recurso
« Respuesta #2 en: 30 Diciembre 2016, 07:06 am »

Cuando añades un recurso al proyecto, se genera un archivo Xml que contiene los bytes serializados de ese recurso binario. En los recursos de la aplicación no se inserta un archivo .exe como tal.

- La metodología más cotidiana sería extraer los bytes de tu recurso binario para escribirlos en un archivo local, y luego, ejecutar ese archivo de forma corriente ...con las ventajas que proporciona la class Process.

- La metodología alternativa, y suponiendo que el archivo .exe sea un ensamblado .NET, sería pasarle la secuencia de bytes de tu recurso al método Assembly.Load() para crear un nuevo ensamblado (todo en memoria), leer el punto de entrada de la aplicación con la propiedad Assembly.EntryPoint, y por último llamar al método Assembly.CreateInstance() e invocar el método principal del ensamblado.

- La metodologia usando código no-administrado, sería llamando a la función Win32 VirtualAlloc como explican aquí: http://stackoverflow.com/questions/959087/is-it-possible-to-execute-an-x86-assembly-sequence-from-within-c/959144#959144

El siguiente código lo he sacado de mi API gratuita ElektroKit, allí puedes encontrar más utilidades interesantes para administrar los recursos.


( click en la imagen para visitar el código fuente y/o descargar la librería. )

Código original escrito en VB.NET:
Código
  1. ''' <summary>
  2. ''' Extracts a resource to disk.
  3. ''' </summary>
  4. <DebuggerStepThrough>
  5. Public Shared Sub ExtractResourceToDisk(ByVal resource As Byte(),
  6.                                        ByVal targetFilepath As String,
  7.                                        Optional ByVal overwrite As Boolean = False)
  8.  
  9.    Dim mode As FileMode
  10.    If (overwrite) Then
  11.        mode = FileMode.Create
  12.    Else
  13.        mode = FileMode.CreateNew
  14.    End If
  15.  
  16.    Dim bufferSize As Integer = 4096
  17.    Using fs As New FileStream(targetFilepath, mode, FileAccess.Write, FileShare.Read, bufferSize)
  18.        fs.Write(resource, 0, resource.Length)
  19.    End Using
  20.  
  21. End Sub

Conversión a C#:
Código
  1. /// <summary>
  2. /// Extracts a resource to disk.
  3. /// </summary>
  4. [DebuggerStepThrough()]
  5. public static void ExtractResourceToDisk(byte[] resource, string targetFilepath, bool overwrite = false) {
  6.  
  7. FileMode mode = default(FileMode);
  8. if (overwrite) {
  9. mode = FileMode.Create;
  10. } else {
  11. mode = FileMode.CreateNew;
  12. }
  13.  
  14. int bufferSize = 4096;
  15. using (FileStream fs = new FileStream(targetFilepath, mode, FileAccess.Write, FileShare.Read, bufferSize)) {
  16. fs.Write(resource, 0, resource.Length);
  17. }
  18. }

Ejemplo de uso:
Código
  1. string filepath = Path.Combine(Path.GetTempPath(), "File.exe");
  2. ExtractResourceToDisk(My.Resources.MyExecutableFile, filepath);
  3. Process p = Process.Start(filepath);
« Última modificación: 30 Diciembre 2016, 07:29 am por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines