miércoles, 28 de septiembre de 2011

[TOOL] DRx Calculator v1.0

Mientras dictabamos el training Defeating Software Protections uno de los temas que se tocaban era el de como fabricanos un Loader Debugger (LD).

Para aquellos que no sepan de que se trata un LD les diré rápidamente que no es mas que un Loader (un programa que carga otro) pero con las capacidades de un debugger. Un LD permite tener una comunicación sincrónica con el target.

El hecho y motivo de este post tiene que ver con que cuando construimos un LD queremos colocar breakpoints para poder detenernos en ciertos lugares del programa y hacer nuestras modificaciones.

Como todo debugger, podemos colocar software breakpoints, memory breakpoints y hardware breakpoints. Estos últimos tal vez sean los más tediosos de colocar dado que tenemos que colocar un par de valores en una estructura llamada CONTEXT:


typedef struct _CONTEXT {
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
BYTE
ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
} CONTEXT;

Básicamente, lo que se hace es colocar las direcciones, en las cuales queremos que estén los hardware breakpoints, en los registros que van desde DR0 a DR3 (DEBUG REGISTERS) y luego, colocar un valor en el registro DR7 que indica tres cosas:

Que registro se utilizó para colocar el HB
De que tipo es el HB (ON_EXECUTION, ON_READ, ON_WRITE)
La cantidad de bytes que abarcamos con el breakpoint (1, 2 ó 4)

Esa constante que se coloca en DR7 se calcula en base a una tabla (http://members.fortunecity.com/blackfenix/seh.html). Por ejemplo, si quisieramos colocar un HB ON_EXECUTION en DR0, deberíamos de hacer una cuenta como esta:


LOCAL_EXACT_BPM_ENABLED + DR0_LOCAL_EXACT_BPM_ENABLED + DR0_EXECUTION + DR0_LEN1

Según la tabla, los valores para cada constante son:


LOCAL_EXACT_BPM_ENABLED = 100000000b
DR0_LOCAL_EXACT_BPM_ENABLED = 1
DR0_EXECUTION = 0
DR0_LEN1 = 0

Por lo tanto, el resultado es: 101h

Para no tener que andar haciendo ninguna cuenta hice una pequeña aplicación que calcule las cosas solitas, nada del otro mundo pero tal vez a alguno le pueda ser útil (sobre todo a aquellos que siempre tienen fiaca :P):


Puede bajar la aplicación aquí.

UPDATE: Subí una nueva version (v1.1) con un pequeño fix acá.

Hasta la próxima!.

No hay comentarios: