2009-06-11 11 views
6

¿Es posible escribir un programa bajo Windows que hará que se rompa un hilo de proceso remoto (al detener la ejecución en ese hilo) al llegar a una dirección predefinida?Escribiendo un depurador muy básico

He estado experimentando con Windows Debug API, pero parece muy limitado cuando se trata de establecer puntos de interrupción. La función DebugBreakProcess parecía prometedora, pero no puedo encontrar ningún ejemplo sobre cómo usar esta llamada API.

Respuesta

12

Necesita escribir WriteProcessMemory para escribir un punto de interrupción (en x86, un código de operación de 0xCC) en la dirección. En x86, cuando el depurador llega a ese punto en el código, 0xCC generará una excepción int 3. Esto es recogido por el depurador WaitForDebugEvent devolverá un DEBUG_EVENT con el conjunto EXCEPTION_DEBUG_EVENT.

Luego debe volver a aplicar el parche a esa dirección hasta su código original antes de continuar. Si quiere volver a romper, necesita dar un solo paso y luego volver a modificar el código de operación del punto de corte. Para un solo paso, debe establecer el indicador de un solo paso en EFlag en el contexto del hilo.

DebugBreakProcess se utiliza para generar un corte remoto de un proceso que está depurando; no se puede usar para romper en un punto arbitrario del código.

+0

Así que podría hacer algo como: 1. Leer la operación actual en la dirección predefinida (PA) y almacenarla 2. Reemplazar la operación con 0xCC y NOPS para generar una excepción int 3 (¿La excepción int 3 automáticamente? ¿detener la ejecución?) 3. Captura el EXCEPTION_DEBUG_EVENT 4. He detenido la ejecución del hilo correctamente pero he reemplazado parte del código y obtendré resultados inesperados. Podría intentar volver a escribir el OP almacenado en el PA, pero ¿no será demasiado tarde? ¿Puedo forzar el hilo remoto para ejecutar el OP de alguna forma? – ldog

+1

No será demasiado tarde para aplicar el parche: la dirección IP de destino no ha cambiado y continuar causará que el debugee vuelva a emitir la excepción si no ha cambiado el código. – Michael

+0

Tengo problemas parcheando. Puedo establecer el punto de ruptura y puedo atrapar la excepción de punto de interrupción, pero cuando intento escribir WriteProcessMemory para volver a escribir el código de operación original obtengo Excepciones de Voz de Acceso, lo que significa que el programa no ejecuta el código correctamente. Hago un FlushInstructionCache después de WriteProcessMemory, pero no parece ayudar. – ldog

1

Michael tiene razón; también, si quiere entrar en un proceso arbitrario en el depurador una vez que lo ha conectado (es decir, si el usuario acierta de repente al "Romper en proceso"), la forma estándar es crear un subproceso remoto cuya rutina emite un int3.

+0

Parece que DebugBreakProcess crea el hilo remoto que se rompe. – Michael

+0

Oh, sí, luego usa eso: usar CreateRemoteThread correctamente es bastante complicado. –

Cuestiones relacionadas