Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: biribau en 18 Junio 2009, 04:14 am



Título: Evitar que te borren los Debug registers en un debugger ring3
Publicado por: biribau en 18 Junio 2009, 04:14 am
He googleado bastante y nada,

Alguien sabe como hace el olly esto? estoy intentando integrarlo en pydbg y no doy con ello.
Poniendo el bit GD a 1 del Dr7 supuestamente tendria que saltar una excepcion si se hace un mov Dr7, eax pero creo que stoy confundido y solo sirve para modo privilegiado. Creo que es el SO el que se encarga de poner los debug registers despues de una excepcion pero como puedo evitar que el so haga eso desde ring3?
Espero haber sido claro, cualquier ayuda es bienvenida :)


Título: Re: Evitar que te borren los Debug registers en un debugger ring3
Publicado por: ny0x en 18 Junio 2009, 04:25 am
no estoy muy informado sobre el tema pero me parece que eso se hace desde el ring0  :-\

encontre esto puede te sirva puede que no

http://blog.48bits.com/?p=60
http://support.microsoft.com/kb/121093/es


Título: Re: Evitar que te borren los Debug registers en un debugger ring3
Publicado por: Eternal Idol en 18 Junio 2009, 08:36 am
"The debug registers are privileged resources; the MOV instructions that access them can only be executed at privilege level zero. An attempt to read or write the debug registers when executing at any other privilege level causes a general protection fault."

http://en.wikipedia.org/wiki/X86_debug_register#DR7_-_Debug_control


PERO existen APIs de depuracion y con SetThreadContext (http://msdn.microsoft.com/en-us/library/ms680632(VS.85).aspx) lo podes hacer, el hilo tiene que estar suspendido.


Título: Re: Evitar que te borren los Debug registers en un debugger ring3
Publicado por: biribau en 18 Junio 2009, 16:41 pm
Solucionado, razon aqui: http://foro.elhacker.net/ingenieria_inversa/pydbg_el_no_va_mas_que_opinais_ayuda_con_funcion_de_carga-t258419.0.html;msg1255082#msg1255082 (http://foro.elhacker.net/ingenieria_inversa/pydbg_el_no_va_mas_que_opinais_ayuda_con_funcion_de_carga-t258419.0.html;msg1255082#msg1255082)

gracias por las molestias, al final sí se puede hacer en ring3 y sin SetThreadContext! jeje ahi viene explicado

El problema de hacerlo con SetThreadContext es que *creo*(porque lo probe y no ruló) que el so coge el context_record DESPUES del retorno de la excepcion, claro, es logico, a ver si me explico, quedaria asi:
Código:
<salto excepcion>
<manejador excepcion>
<mi controlador SetThreadContext>
<el so actualiza el contexto y por tanto los Debug registers con la estructura del contexto en memoria>
<Dr7 borrado>

solucion que me sirvióí:
Código:
<salto excepcion>
<poner breakpoint A en rutina SEH del programa>
<vuelta al so>
<salto breakpoint A, poner breakpoint B en la dir de retorno del manejador de la excepcion, borrar bp A>
<manejador excepcion>
<salto breakpoint B, restaurar el context record con los DrX, borrar BP B>
<vuelta al so>
<victoria>

Gracias