Ayuda con assembly.load(byte[]) imagen no valida.

Iniciado por 70N1, 12 Septiembre 2014, 23:05 PM

0 Miembros y 2 Visitantes están viendo este tema.

70N1

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 (csharp) [Seleccionar]
// alphabet.txt contains "abcdefghijklmnopqrstuvwxyz"
       using (FileStream fs = new FileStream(@"2.bin", FileMode.Open, FileAccess.Read))
       {
           long length = fs.Length;
           Byte[] coming = new byte[length ];
           byte readd;
           int i = 0;
           FileStream fileStream = new FileStream(fileName, FileMode.Create);
           for (offset = 1; offset <= fs.Length; offset++)
           {
               fs.Seek(-offset, SeekOrigin.End);
               //Console.Write(Convert.ToChar(fs.ReadByte()));
               int readb = fs.ReadByte();
                readd = Convert.ToByte(readb);
               //fileStream.WriteByte(readd);
               coming[i] =readd;
               
               //Console.WriteLine(i);
               i++;
               //Console.ReadLine();
           }
           //Console.Write(coming);
           MemExe(coming);
         
         
       }




 static void MemExe(byte[] buffer)
   {
       Assembly asm = Assembly.Load(buffer);//----------------->> AQUI DA EL ERROR.

       if (asm.EntryPoint == null)
           throw new ApplicationException("No entry point found!");

       MethodInfo ePoint = asm.EntryPoint;
       object ins = asm.CreateInstance(ePoint.Name);
       ePoint.Invoke(ins, null);
   }
70N1

0xDani

Si no me equivoco esto es C#. En ese caso, deberías ponerlo en Programación .NET para que te ayuden.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Eternal Idol

Por favor no hagas mas preguntas de .NET en este sub-foro (Programación C/C++).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Eleкtro

#3
Cita de: 70N1 en 12 Septiembre 2014, 23:05 PM
Assembly.Load(buffer) me da error.

Código (csharp) [Seleccionar]
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

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

-> Assembly (CLI) - Wikipedia

¿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!








70N1

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
70N1

Eternal Idol

Cita de: 70N1 en 13 Septiembre 2014, 10:54 AMPorsierto... 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)
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Eleкtro

#6
Cita de: 70N1 en 13 Septiembre 2014, 10:54 AM2.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:

Cita de: Eleкtro en 13 Septiembre 2014, 01:27 AMEl método Assembly.Load es para abrir ensamblados (entorno de ejecución .NET).

-> Assembly (CLI) - Wikipedia

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)

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 (vbnet) [Seleccionar]
Imports System.Runtime.InteropServices

' <System.Security.SuppressUnmanagedCodeSecurity>
Friend Class SafeNativeMethods

    <DllImport("2.bin", EntryPoint:="Nombre_De_La_Función", SetLastError:=False, CharSet:=CharSet.Auto)>
    Friend Shared Function Nombre_A_Mostrar(
            ByVal Parametro1 As String,
            ByVal Parametro2 As IntPtr
    ) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

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.








70N1

Muchas gracias a todos. Seguire con mi investigacion, ya que lo que quiero es lanzar exe de c++ sin net.
70N1

kub0x

Cita de: 70N1 en 13 Septiembre 2014, 10:54 AM
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!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


70N1

En el mismo proceso.
Pero no quiero usar framework, lo quiero independiente
70N1