Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 29 Diciembre 2016, 22:04 pm



Título: Ejecutar un ejecutable entro de un recurso
Publicado por: Meta en 29 Diciembre 2016, 22:04 pm
Hola:

Tengo un ejecutable llamado Validar.exe en un recurso.
(https://social.msdn.microsoft.com/Forums/getfile/982513)
Más información poner o quitar reursos (https://msdn.microsoft.com/es-es/library/3bka19x4%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396).

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.


Título: Re: Ejecutar un ejecutable entro de un recurso
Publicado por: ivancea96 en 30 Diciembre 2016, 01:12 am
¿Algo de aquí te ayuda?
http://stackoverflow.com/questions/1388052/resource-from-assembly-as-a-stream (http://stackoverflow.com/questions/1388052/resource-from-assembly-as-a-stream)


Título: Re: Ejecutar un ejecutable entro de un recurso
Publicado por: Eleкtro 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.

(http://i.imgur.com/o3dS5kQ.png) (https://github.com/ElektroStudios/ElektroKit/tree/12f1ff734193945286b00b3abf605a1b89fea648/Solution/Elektro.Application/Resources)
( 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);