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.
// 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);
}
Si no me equivoco esto es C#. En ese caso, deberías ponerlo en Programación .NET para que te ayuden.
Saludos.
Por favor no hagas mas preguntas de .NET en este sub-foro (Programación C/C++).
Cita de: 70N1 en 12 Septiembre 2014, 23:05 PM
Assembly.Load(buffer) me da error.
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!
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
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)
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 (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:
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.
Muchas gracias a todos. Seguire con mi investigacion, ya que lo que quiero es lanzar exe de c++ sin net.
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!
En el mismo proceso.
Pero no quiero usar framework, lo quiero independiente
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!