Autor Tema: Analizar el contenido de una DLL  (Leído 29346 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Analizar el contenido de una DLL
« en: 29 de Septiembre de 2009, 20:20:31 »
Hola

Hace poco estuve trabajando con la hid.dll de Windows y estuve buscando por internet si había alguna función integrada dentro de ella que me sirviera para ciertas cosas. No encontré la información, solo encontré algunas funciones comunes de la misma pero no todas (si es que tiene más).

Quisiera saber cómo analizar una DLL y determinar qué funciones contiene y qué parámetros pueden recibir. Es decir, si yo compilara una DLL y no hiciera un manual de usuario, ¿hay forma de descubrir las funciones internas y después hacer uso de ellas?

Mi conocimiento de DLL's es poquísimo, talvez la solución sea muy simple. Gracias.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Analizar el contenido de una DLL
« Respuesta #1 en: 29 de Septiembre de 2009, 23:48:39 »
Hola Santiago, hay varias herramientas que son visores de dll (estas herramientas tienen objetivos que va de depuradores hasta ingeniería inversa)

hay uno llamado dependencywalker

http://www.dependencywalker.com/

éste mira los ordinales de la biblioteca y con un poco de suerte te mostrará los nombre de los ordinales (que vienen siendo como una especie de apis)

esto solo ocurre si la DLL no está empacada u ofuscada, si conoces bajo que compilador fué hecha la dll, creo que se hace mas facil usar el depurador del compilador (creo recordar que el vc++ tenia un depurador para dll compiladas en ese lenguaje)

para casos extremos, mejor usar un decompilador de ejecutables (ej: ollydbg)

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Analizar el contenido de una DLL
« Respuesta #2 en: 30 de Septiembre de 2009, 12:45:04 »
Gracias Pedro, es un programa muy útil. Se puede dar doble click a las funciones y abre un browser para buscar cómo se usan.

Aquí el contenido de la HID.dll y la MPUSBAPI.dll


Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Analizar el contenido de una DLL
« Respuesta #3 en: 30 de Septiembre de 2009, 12:51:23 »
ah! que bueno !!!

fíjate que sale el ordinal de cada api, en algunos compiladores es posible sustituir el ordinal por el nombre de la función e igual lo acepta. pero lo que no muestra son los parámetros de la función jeje. Suerte que en esas dll´s ya los conocemos.

« Última modificación: 30 de Septiembre de 2009, 12:56:22 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Analizar el contenido de una DLL
« Respuesta #4 en: 30 de Septiembre de 2009, 13:29:21 »
Sí, suerte que contamos con ellos, pero ahorita revisé una DLL que hice con C# y seguramente está obfuscated o yo que sé porque no muestra mis funciones:



Pero no importa mucho ya que tengo completo el código fuente.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re: Analizar el contenido de una DLL
« Respuesta #5 en: 01 de Octubre de 2009, 22:10:09 »
Para C# usa el NET Reflector

http://www.red-gate.com/products/reflector/

Te vas a llevar la grata sorpresa que vas a ver el código tal y como lo escribiste   :)

« Última modificación: 01 de Octubre de 2009, 22:18:48 por tsk »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Analizar el contenido de una DLL
« Respuesta #6 en: 01 de Octubre de 2009, 22:24:05 »
Wow, gracias Tsk.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 258
Re: Analizar el contenido de una DLL
« Respuesta #7 en: 19 de Octubre de 2009, 13:36:18 »
Después de investigar un poco sobre esto de los decompiladores también encontré una forma de proteger nuestro código un poco ante ataques de ingeniería inversa y decompiladores.

 :mrgreen:

Con eso sólo te quitarás de encima a los programadores novatos, pero realmente te crea una falsa sensación de seguridad,  :D

Busca en google sobre mono Cecil, ildasm, mododis, etc. etc.

El Net Reflector te lo puse porque es el más fácil de usar y te genera el código de C#

Citar
Cecil is a library written by Jb Evain (http://evain.net/blog/) to generate and inspect programs and libraries in the ECMA CIL format. It has full support for generics, and support some debugging symbol format.

In simple English, with Cecil, you can load existing managed assemblies, browse all the contained types, modify them on the fly and save back to the disk the modified assembly.

mododis al igual que ildasm, desensambla tu dll o ejecutable, te genera código ensamblador (CIL), puedes modificar el código, agregar o quitar instrucciones, y enseguida con ilasm volver a generar el ejecutable con los cambios realizados. Son herramientas que proporciona el Visual Studio y Mono, ni siquiera tienes que descargar otros programas, más que el propio framework.

Ej. de salida de desensamble (monodis).

monodis Ejecutable.exe >Ejecutable.exe.il
Abriendo el archivo podemos ver instrucciones como:
Código: [Seleccionar]
.namespace WindowsApplication1
{
  .class private auto ansi abstract sealed beforefieldinit Program
        extends [mscorlib]System.Object
  {

    // method line 4
    .method private static  hidebysig
           default void Main ()  cil managed
    {
        .custom instance void class [mscorlib]System.STAThreadAttribute::'.ctor'() =  (01 00 00 00 ) // ....

        // Method begins at RVA 0x2075
        .entrypoint
        // Code size 22 (0x16)
        .maxstack 8
        IL_0000:  call void class [System.Windows.Forms]System.Windows.Forms.Application::EnableVisualStyles()
        IL_0005:  ldc.i4.0
        IL_0006:  call void class [System.Windows.Forms]System.Windows.Forms.Application::SetCompatibleTextRenderingDefault(bool)
        IL_000b:  newobj instance void class WindowsApplication1.Form1::'.ctor'()
        IL_0010:  call void class [System.Windows.Forms]System.Windows.Forms.Application::Run(class [System.Windows.Forms]System.Windows.Forms.Form)
        IL_0015:  ret
    } // end of method Program::Main
...

Se puede ver como si fuera un lenguaje ensamblador orientado a objetos  :mrgreen:

Podemos modificar el archivo .il a nuestra conveniencia, por ejemplo:
Código: [Seleccionar]
...
// method line 6
    .method private hidebysig
           instance default void button1_Click (object sender, class [mscorlib]System.EventArgs e)  cil managed
    {
        // Method begins at RVA 0x209c
        // Code size 67 (0x43)
        .maxstack 2
        .locals init (
                string  V_0,
                string  V_1)
        IL_0000:  ldstr "tres"
        IL_0005:  stloc.0
        IL_0006:  ldarg.0
        IL_0007:  ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsApplication1.Form1::textBox1
        IL_000c:  callvirt instance string class [System.Windows.Forms]System.Windows.Forms.Control::get_Text()
        IL_0011:  stloc.1
        IL_0012:  ldloc.1
        IL_0013:  ldloc.0

        IL_0014:  call bool string::op_Equality(string, string)  //Compara la contraseña que has ingresado en el textBox1 con la que tienes almacenada
        IL_0019:  brfalse.s IL_0037  //Si es falso salta al IL_0037
        IL_001d:  ldstr "Correcto Mi Cuate"  //Si es correcta se sigue por aquí abriendo un Dialogo informandote que es correcta la contraseña
        IL_0020:  call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult class [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
        IL_0025:  pop
        IL_0029:  ldarg.0
        IL_002a:  ldfld class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication1.Form1::label2
        IL_002c:  ldstr "Que dijeron ya puse la frase"
        IL_0031:  callvirt instance void class [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
        IL_0036:  ret
        IL_0037:  ldstr "Incorrecto"  //Aquí es donde salta si no pusieron bien la contraseña
        IL_003c:  call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult class [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
        //Como que se me ocurre agregarle al programa que si
        //te equivocas cambie el label1 por 'Otra propuesta', así de fácil es modificar el código
        pop
        ldarg.0
        ldfld class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication1.Form1::label1
        ldstr "Otra propuestra"
        callvirt instance void class [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
        ret

        ret
    } // end of method Form1::button1_Click
...

Ya después con el ilasm volver a generar el ejecutable

ilasm Ejecutable.exe.il Ejecutable.exe

Y tendremos la versión modificada.

Tal vez también te interese el ManagedSpy (http://msdn.microsoft.com/en-us/magazine/cc163617.aspx)

Realmente no le veo mucha utilidad, ya que si alguien es capaz de proteger su código, alguien también será capaz de desprotegerlo (Si hay forma de hacerlo, también hay forma de deshacerlo). Es realmente, una perdida de tiempo y de recursos, además de correr el riesgo de que tu código no trabaje como esperas.

SaludOS
« Última modificación: 17 de Mayo de 2010, 17:51:37 por un Moderador »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Analizar el contenido de una DLL
« Respuesta #8 en: 19 de Octubre de 2009, 13:39:50 »
Sí, me imaginaba que la protección era mínima, pero bueno algo es algo.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Analizar el contenido de una DLL
« Respuesta #9 en: 19 de Octubre de 2009, 14:16:39 »
parece una ironía, pero la mejor forma de proteger un programa, es hacerlo en un lenguaje de alto nivel. La razón: mientras mas alto el nivel, mas redundancia y creación de cientos de lineas de código inútiles creará el compilador.

No quiere decir decir que sea 100% seguro, porque de vez en cuando sale alguien con un decompilador de instrucciones framework.

hay muchas técnicas de proteger el código, pero no tiene que ver con las opciones que ofrece el compilador, sino  con las artimañas que se les ocurra al programador.





La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek