Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: 70N1 en 12 Septiembre 2014, 23:05 pm



Título: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: 70N1 en 12 Septiembre 2014, 23:05 pm
He montado este codigo, pero me dice que la imagen no es valida.
Creo un array de bytes ( byte[] ) con el archivo dentro y al intentar lanzarlo con  Assembly.Load(buffer) me da error.

Código
  1. // alphabet.txt contains "abcdefghijklmnopqrstuvwxyz"
  2.        using (FileStream fs = new FileStream(@"2.bin", FileMode.Open, FileAccess.Read))
  3.        {
  4.            long length = fs.Length;
  5.            Byte[] coming = new byte[length ];
  6.            byte readd;
  7.            int i = 0;
  8.            FileStream fileStream = new FileStream(fileName, FileMode.Create);
  9.            for (offset = 1; offset <= fs.Length; offset++)
  10.            {
  11.                fs.Seek(-offset, SeekOrigin.End);
  12.                //Console.Write(Convert.ToChar(fs.ReadByte()));
  13.                int readb = fs.ReadByte();
  14.                 readd = Convert.ToByte(readb);
  15.                //fileStream.WriteByte(readd);
  16.                coming[i] =readd;
  17.  
  18.                //Console.WriteLine(i);
  19.                i++;
  20.                //Console.ReadLine();
  21.            }
  22.            //Console.Write(coming);
  23.            MemExe(coming);
  24.  
  25.  
  26.        }
  27.  
  28.  
  29.  
  30.  
  31.  static void MemExe(byte[] buffer)
  32.    {
  33.        Assembly asm = Assembly.Load(buffer);//----------------->> AQUI DA EL ERROR.
  34.  
  35.        if (asm.EntryPoint == null)
  36.            throw new ApplicationException("No entry point found!");
  37.  
  38.        MethodInfo ePoint = asm.EntryPoint;
  39.        object ins = asm.CreateInstance(ePoint.Name);
  40.        ePoint.Invoke(ins, null);
  41.    }


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: 0xDani en 13 Septiembre 2014, 00:10 am
Si no me equivoco esto es C#. En ese caso, deberías ponerlo en Programación .NET para que te ayuden.

Saludos.


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: Eternal Idol en 13 Septiembre 2014, 00:42 am
Por favor no hagas mas preguntas de .NET en este sub-foro (Programación C/C++).


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: Eleкtro en 13 Septiembre 2014, 01:27 am
Assembly.Load(buffer) me da error.

Código
  1. Assembly asm = Assembly.Load(buffer);//----------------->> AQUI DA EL ERROR.

Bien, ¿pero piensas explicar el tipo de excepción y el mensaje de error, o esperas que lo adivinemos?.

-> Assembly.Load Method (Byte()) - MSDN (http://msdn.microsoft.com/en-us/library/h538bck7%28v=vs.110%29.aspx)

El método Assembly.Load es para abrir ensamblados (entorno de ejecución .NET).

-> Assembly (CLI) - Wikipedia (http://en.wikipedia.org/wiki/Assembly_%28CLI%29)

¿El archivo 2.bin es un ensamblado .NET, una dll con la extensión camuflada?, ¿Cuales son tus verdaderas intenciones, que intentas conseguir?, ¿estás intentando clonar dicho ensamblado en la memoria para cargar el stream en tiempo de ejecución?;
porfavor, se claro con el problema que tienes, el error, y el resultado que esperas conseguir.

Saludos!


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: 70N1 en 13 Septiembre 2014, 10:54 am
2.bin es un exe creado con c++.

coming[] es el array de bytes que contiene el exe.

El error esta en assembly.load(buffer);

No se puede cargar el archivo o ensamblado 'ejecutable, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ni una de sus dependencias. Intento de cargar un archivo ejecutable que no se puede comprobar (la tabla IAT tiene más de 2 secciones o una sección TLS). (Excepción de HRESULT: 0x80131019)


Porsierto... ya me podrian aver mandado un mensaje para avisar de que el tema fue movido


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: Eternal Idol en 13 Septiembre 2014, 11:31 am
Porsierto... ya me podrian aver mandado un mensaje para avisar de que el tema fue movido

No hace ninguna falta, en el sub-foro donde donde incorrectamente publicaste hay dos hilos titulados:
MOVIDO: Ayuda con assembly.load(byte[]) imagen no valida.
MOVIDO: Una mano con este codigo. (array de byte dinamico)


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: Eleкtro en 13 Septiembre 2014, 13:21 pm
2.bin es un exe creado con c++.

No se mucho sobre este tema, no conozco mucho de C++ así que no puedo ayudarte casi, pero repetiré lo que dije:

El método Assembly.Load es para abrir ensamblados (entorno de ejecución .NET).

-> Assembly (CLI) - Wikipedia (http://en.wikipedia.org/wiki/Assembly_%28CLI%29)

Utilizar el método Assembly.Load(byte[]) para cargar un ensamblado C++ que contenga código nativo NO está soportado.

¿Has buscado en Google el código de error?, porque hay muchos resultados con información y posibles soluciones (aparte de este enlace):

Cita de: http://social.msdn.microsoft.com/Forums/vstudio/en-US/f4194a8a-aaf9-48bd-86ba-fc0efe60e865/exception-occured-while-loading-dynamically-exe-assembly-in-ccli-could-not-load-file-or-assembly?forum=vclanguage
“A mixed mode C++ EXE cannot be relocated in memory properly when loaded as a referenced assembly”

“[…] we only allow MSIL-Only images to be loaded […] since anything else is not safe”--

+

-> Attempt to load an unverifiable executable with fixups (IAT with more than 2 sections or a TLS section.) (Exception from HRESULT: 0x80131019) (http://stackoverflow.com/questions/5005409/exception-with-resolving-assemblies-attempt-to-load-an-unverifiable-executable)

Asi pues, si quieres "cargar" una dll de C++ según parece vas a tener que recurrir al P/Invoking, aunque no se si esa será la única solución, como ya he dicho no manejo mucho este tema de cargar una dll de C++ para invokar funciones o lo que pretendas hacer, pero así es como siempre lo he echo con librerías de terceros desarrolladas en C++ y por supuesto con las de la WinAPI, toma un ejemplo:

Código
  1. Imports System.Runtime.InteropServices
  2.  
  3. ' <System.Security.SuppressUnmanagedCodeSecurity>
  4. Friend Class SafeNativeMethods
  5.  
  6.    <DllImport("2.bin", EntryPoint:="Nombre_De_La_Función", SetLastError:=False, CharSet:=CharSet.Auto)>
  7.    Friend Shared Function Nombre_A_Mostrar(
  8.            ByVal Parametro1 As String,
  9.            ByVal Parametro2 As IntPtr
  10.    ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  11.    End Function
  12.  
  13. End Class

+

Cita de: MSDN
   NativeMethods - This class does not suppress stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute must not be applied to this class.) This class is for methods that can be used anywhere because a stack walk will be performed.

    SafeNativeMethods - This class suppresses stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute is applied to this class.) This class is for methods that are safe for anyone to call. Callers of these methods are not required to perform a full security review to make sure that the usage is secure because the methods are harmless for any caller.

    UnsafeNativeMethods - This class suppresses stack walks for unmanaged code permission. (System.Security.SuppressUnmanagedCodeSecurityAttribute is applied to this class.) This class is for methods that are potentially dangerous. Any caller of these methods must perform a full security review to make sure that the usage is secure because no stack walk will be performed.


PD: El compañero @Kubox creo que sabe bastante sobre este tema de C++ en .NET y te podrá ayudar mejor que yo en caso de que lea este post.

Saludos.


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: 70N1 en 13 Septiembre 2014, 20:02 pm
Muchas gracias a todos. Seguire con mi investigacion, ya que lo que quiero es lanzar exe de c++ sin net.


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: kub0x en 13 Septiembre 2014, 22:08 pm
2.bin es un exe creado con c++.

¿2.bin está generado en C++ .NET (CLI) o Win32? Actualmente es imposible cargar un ejecutable compilado en C++ Win32 con la clase Assembly. Podrías cargar cualquier ejecutable compilado bajo cualquier lenguaje de la plataforma .NET.

¿Quieres lanzar el programa 2.bin en el mismo proceso o en uno separado?

Saludos!


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: 70N1 en 15 Octubre 2014, 18:24 pm
En el mismo proceso.
Pero no quiero usar framework, lo quiero independiente


Título: Re: Ayuda con assembly.load(byte[]) imagen no valida.
Publicado por: kub0x en 15 Octubre 2014, 18:35 pm
Obviamente como ya he dicho no puedes cargar un .exe Win32 dentro de un proceso .NET usando la clase Assembly, ya que dicha clase solo mapea ensamblados .NET en la memoria del proceso.

Por lo que dices, no quieres usar .NET por lo tanto utiliza RunPE para cargar un ejecutable Win32 dentro de otro ejecutable, lo cual se sale de .NET y exige un conocimiento de la cabecera PE.

No es difícil, suele emplearse este método mucho en los crypters para cargar el archivo bindeado en memoria y no dejarlo en disco.

http://foro.elhacker.net/analisis_y_diseno_de_malware/que_es_un_runpe-t340360.0.html

Saludos!