Aquí hay algunos comandos CLR útiles para analizar y depurar aplicaciones .NET. Se pueden usar en varias herramientas de depuración como WinDbg, SOS Debugging Extension y otros.
"Conócete a ti mismo, conoce a tu enemigo. Mil batallas, mil victorias". - Sun Tzu, El Arte de la Guerra
En el contexto de la ingeniería inversa, es importante tener un profundo conocimiento tanto del software que se está analizando como de las técnicas que se utilizan para analizarlo. Solo conociendo ambos se puede esperar superar con éxito los desafíos presentados por la ingeniería inversa.
Estos comandos se pueden utilizar para analizar el heap y la memoria del proceso administrado.
- !dumpheap : Muestra información sobre los objetos en el heap administrado.
- Uso:
!dumpheap [-stat] [-type <typename>]
- Ejemplo:
!dumpheap -stat
para mostrar estadísticas sobre todos los objetos en el heap. - Ejemplo:
!dumpheap -type System.String
para mostrar información solo para objetos cuyo nombre de tipo coincide con "System.String".
- Uso:
- !eeheap : Muestra información sobre el heap administrado.
- Uso:
!eeheap [-gc] [-gcHandle] [-loader] [-class] [-stat]
- Ejemplo:
!eeheap -gc
para mostrar información sobre el heap del recolector de basura. - Ejemplo:
!eeheap -class
para mostrar información sobre las clases cargadas en el proceso.
- Uso:
- !dumpobj : Muestra información sobre un objeto específico.
- Uso:
!dumpobj <object>
- Ejemplo:
!dumpobj 0x12345678
para mostrar información sobre el objeto en la dirección de memoria 0x12345678.
- Uso:
- !gcroot : Muestra información sobre las raíces de un objeto.
- Uso:
!gcroot <object>
- Ejemplo:
!gcroot 0x12345678
para mostrar información sobre las raíces del objeto en la dirección de memoria 0x12345678.
- Uso:
- !do : Muestra información sobre un objeto específico.
- Uso:
!do <object>
- Ejemplo:
!do 0x12345678
para mostrar información sobre el objeto en la dirección de memoria 0x12345678.
- Uso:
- !dumpstack : Muestra la traza de la pila para el subproceso actual.
- Uso:
!dumpstack
- Ejemplo:
!dumpstack
para mostrar la traza de la pila para el subproceso actual.
- Uso:
Estos comandos se pueden utilizar para establecer puntos de interrupción y ver información de depuración.
- .loadby sos clr : Para analizar CLR, use este comando en WinDbg.
- Uso:
.loadby sos clr
- Uso:
- bp : Establece un punto de interrupción en un método.
- Uso:
bp <module>!<method>
- Ejemplo:
bp MyAssembly!MyClass.MyMethod
para establecer un punto de interrupción en el método MyMethod en la clase MyClass en el módulo MyAssembly.
- Uso:
- !bpmd : Establece un punto de interrupción en un método.
- Uso:
!bpmd <module> <method> [ilOffset]
- Ejemplo:
!bpmd MyAssembly MyNamespace.MyClass.MyMethod
para establecer un punto de interrupción en el método MyMethod en la clase MyClass en el módulo MyAssembly.
- Uso:
- !clrstack : Muestra la traza de la pila para el subproceso actual.
- Uso:
!clrstack [-a] [-p] [-l]
- Ejemplo:
!clrstack
para mostrar la traza de la pila para el subproceso actual.
- Uso:
- !dumpil : Muestra el código IL para un método.
- Uso:
!dumpil <method>
- Ejemplo:
!dumpil MyAssembly!MyClass.MyMethod
para mostrar el código IL para el método MyMethod en la clase MyClass en el módulo MyAssembly.
- Uso:
- !dumpbin: Muestra el código binario para un método. La
salida incluye el código binario e instrucciones de ensamblado para el método especificado.
- Uso:
!dumpbin -raw <MethodTable>
- Ejemplo:
!dumpbin -raw 00007ffd5b5b5d5c
- Uso:
- !name2ee: Muestra la tabla de métodos para un método. Este comando toma como argumentos un nombre de módulo y un nombre de método y devuelve el puntero MethodTable para el método especificado.
- Uso:
!name2ee <module> <method>
- Ejemplo:
!name2ee mscorlib.dll System.String.ToCharArray
- Uso:
- !ip2md: Muestra el descriptor de métodos para un método. Este comando toma como argumento un puntero de método y devuelve el puntero MethodDesc para el método especificado.
- Uso:
!ip2md <method pointer>
- Ejemplo:
!ip2md 00007ffd5b5b5d5c
- Uso:
- !dumpmodule: Muestra información sobre un módulo. Este comando toma como argumento un nombre o dirección de módulo y devuelve información sobre el módulo especificado.
- Uso:
!dumpmodule <module>
- Ejemplo:
!dumpmodule System.Windows.Forms
- Uso:
- !dumpassembly: Muestra información sobre un ensamblado. Este comando toma como argumento un nombre o dirección de ensamblado y devuelve información sobre el ensamblado especificado.
- Uso:
!dumpassembly <assembly>
- Ejemplo:
!dumpassembly System.Windows.Forms
- Uso:
- !dumpclass: Muestra información sobre una clase. Este comando toma como argumento un nombre de clase o un puntero MethodTable y devuelve información sobre la clase especificada.
- Uso:
!dumpclass <class>
- Ejemplo:
!dumpclass System.Object
- Uso:
- !dumpinterface: Muestra información sobre una interfaz. Este comando toma como argumento un nombre de interfaz o un puntero MethodTable y devuelve información sobre la interfaz especificada.
- Uso:
!dumpinterface <interface>
- Ejemplo:
!dumpinterface System.IDisposable
- Uso:
- !dumpvc: Muestra información sobre una clase de valor. Este comando toma como argumento un nombre de clase de valor o un puntero MethodTable y devuelve información sobre la clase de valor especificada.
- Uso:
!dumpvc <value class>
- Ejemplo:
!dumpvc System.Decimal
- Uso:
- !dumparray: Muestra información sobre un arreglo. Este comando toma como argumento una dirección de arreglo y devuelve información sobre el arreglo especificado.
- Uso:
!dumparray <array>
- Ejemplo:
!dumparray 000001e99f7855c0
- Uso:
- !dumpstack: Muestra la traza de la pila para el subproceso actual.
- Uso:
!dumpstack
- Ejemplo:
!dumpstack
- Uso:
- !dso: Muestra los objetos administrados en la pila.
- Uso:
!dso
- Ejemplo:
!dso
- Uso:
- !clrprof: Muestra información de perfilado.
- Uso:
!clrprof
- Ejemplo:
!clrprof
- Uso:
- !dumpmd: Muestra metadatos para un método. Este comando toma como argumento un puntero MethodDesc y devuelve información de metadatos para el método especificado.
- Uso:
!dumpmd <MethodDesc>
- Ejemplo:
!dumpmd 00007ffd5b5b5d5c
- Uso:
- !dumpmt: Muestra la tabla de métodos para una clase. Este comando toma como argumento un nombre de clase o un puntero MethodTable y devuelve el puntero MethodTable para la clase especificada.
- Uso:
!dumpmt <class>
- Ejemplo:
!dumpmt System.Object
- Uso:
- !U : Muestra el desensamblado de un método ensamblado en sintaxis Intel.
- Uso:
!U <method>
- Ejemplo:
!U MyAssembly!MyClass.MyMethod
para mostrar el desensamblado del método MyMethod en la clase MyClass en el módulo MyAssembly.
- Uso:
Creado y Elaborado por AxDSan si te gusto el contenido puedes seguir mi GitHub!