Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Borito30 en 20 Mayo 2017, 20:55 pm



Título: Como cargar un assembly usando la reflexión en C#
Publicado por: Borito30 en 20 Mayo 2017, 20:55 pm
Hola mi pregunta es como puedo cargar un assembly ya sea una dll o binario usando la reflexión, normalmente para cargar un assembly lo hago de la siguiente manera:

Código
  1. //Load the bytes as an assembly
  2. Assembly exeAssembly = Assembly.Load(decryptedBuffer);
  3.  
  4. //Execute the assembly
  5. object[] parameters = new object[1];                
  6. exeAssembly.EntryPoint.Invoke(null, parameters);
Pero ahora estaba intentandolo usando la reflexión para ello hice lo siguiente:

Código
  1. typeof(Assembly).GetMethod("Load").Invoke(null,new object[] {decryptedBuffer});
Cuando lo hago del primer modo funciona bien. Pero cuando uso el siguiente método(usando solo reflexión) me devuelve el siguiente error:
Código:
    typeof(Assembly).GetMethod("Load").Invoke(null,new object[] {decryptedBuffer});
Problem signature:
  Problem Event Name:   CLR20r3
  Problem Signature 01: Proof.exe
  Problem Signature 02: 1.0.0.0
  Problem Signature 03: 591f941f
  Problem Signature 04: mscorlib
  Problem Signature 05: 4.6.1590.0
  Problem Signature 06: 5787ed44
  Problem Signature 07: 1037
  Problem Signature 08: 60
  Problem Signature 09: System.Reflection.AmbiguousMatch
  OS Version:   6.1.7601.2.1.0.256.1
  Locale ID:    3082
  Additional Information 1: 0a9e
  Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
  Additional Information 3: 0a9e
  Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

Read our privacy statement online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
  C:\Windows\system32\en-US\erofflps.txt
A que se debe este error? Pregunto porque he visto varios artículos relacionados con esto y quería entender porque en este caso porque no ha funcionado.

Estaba intentando llamar al assembly load usando la reflexión pero no entiendo porque una versión si funciona y la otra no como podría compatibizarla para que funcionase / cargando el assembly load de modo reflectivo?


Título: Re: Como cargar un assembly usando la reflexión en C#
Publicado por: Eleкtro en 21 Mayo 2017, 00:12 am
Problem Signature 09: System.Reflection.AmbiguousMatch

Ahí te esta aclarando el motivo del error:
  • System.Reflection.AmbiguousMatchException Class | MSDN (https://msdn.microsoft.com/en-us/library/system.reflection.ambiguousmatchexception(v=vs.110).aspx)

Basicamente lo que ha ocurrido en tu código es que la búsqueda de "X" miembro mediante Reflection ha resultado en una coincidencia ambigua, ¿y esto que quiere decir?, pues que se ha encontrado más de 1 miembro con el mismo nombre pero con distinta parametización, esto es una ambiguedad, es decir, las sobrecargas:

System.Assembly - Class Methods | MSDN (https://msdn.microsoft.com/en-us/library/system.reflection.assembly(v=vs.110).aspx#Methods)
Cita de: MSDN Reference
(http://i.imgur.com/JXAPIc8.png)

No puedes esperar que Reflection sepa qué overload/sobrecarga es el que debe devolver, si tú no le ayudas a descartar los demás miembros para quedarse con solamente uno. Para ello debes limitar la búsqueda de miembros usando el overload de la función Type.GetMethod() que acepta como argumento la enumeración BindingFlags en la que especificaremos el tipo de miembro y su nivel de acceso, junto a un Array con el tipo de parametización del miembro en cuestión:

Código
  1. Assembly ass = default(Assembly);
  2. Type t = typeof(Assembly);
  3. BindingFlags searchFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly;
  4. MethodInfo mi = t.GetMethod("Load", searchFlags, Type.DefaultBinder, new Type[] { typeof(byte[]) }, null);
  5.  
  6. if (mi == null) {
  7.    Debug.WriteLine("Member not found. Bad search flags?.");
  8.  
  9. } else {
  10.    byte[] byteData = File.ReadAllBytes(@".\MyAssembly.dll");
  11.    object[] @params = new object[] { byteData };
  12.    ass = (Assembly)mi.Invoke(t, @params);
  13.    Debug.WriteLine(ass.FullName);
  14.  
  15. }

¡Saludos!