Español | English
rss facebook linkedin Twitter

Protección del software (Parte VI)

Los trucos anti-debug consisten generalmente en diversas comprobaciones que tratan de detectar ciertos comportamientos que indiquen la presencia de un depurador para poder actuar en consecuencia.

Acostumbro a llamarlos trucos y no técnicas porque la mayoría son unas comprobaciones muy simples que pueden evitar que un novel pueda analizar la aplicación, pero que una vez conocidas por el mismo no suponen una barrera muy importante. De hecho, existen muchos automatismos para evitar las detecciones, como pueden ser diversos plug-ins para OllyDbg.

Existe mucha información sobre los anti-debug, ya que llevan mucho tiempo utilizándose, por lo que solamente comentaremos algunos de ellos. Podemos ver una lista extensa de anti-debug en SecurityFocus, página que referenciaremos cuando nos sirva de ejemplo.
El día de hoy trataremos de detectar la interacción de alguien con nuestro programa mediante un depurador, detectando las tres maneras más comunes de detener una ejecución:

Detección de puntos de ruptura:

Si se establece un punto de ruptura sobre cierta instrucción, lo que realmente realiza el depuradore es reemplazar un byte por "CC" (int3), de tal manera que si se ejecuta saltará una excepción que manejará el depurador. En este momento buscará en una lista de puntos de ruptura si la dirección actual se encuentra en ella y repondrá el byte que había reemplazado.

De este modo, si se comprueba que, por ejemplo, en la primera instrucción de una API nos encontramos con un "CC" significará que se ha establecido un punto de ruptura en la misma.
En Securityfocus se habla de esto en el punto "- Uncategorized anti-debug --> (2) CC scanning"

Para completar la definición, veamos a continuación una implementación de la detección de un punto de ruptura en la API MessageBox:


Detección de puntos de ruptura en memoria.

Para establecer un punto de ruptura en memoria sobre alguna acción (lectura, escritura o ejecución), el depurador quita el permiso para ello. Si establecemos un punto de ruptura en escritura, el depurador quitará este permiso, de manera que cuando el programa intente escribir en dicho punto saltará una excepción que manejará el depurador, comprobará que en dicha dirección de memoria se ha establecido un punto de ruptura, restaurará los permisos y mostrará la ejecución detenida.

En estos casos, existe la posibilidad de modificar los permisos, de tal manera que los puntos de rupturan no surjan efecto.

En el siguiente código vemos cómo si establecemos un punto de ruptura en la zona reservada en el momento en que la ejecución llega a la interrupción, el depurador no se detendrá, puesto que la propia aplicación habilita el permiso de escritura antes de escribir en ella.


Detección de puntos de ruptura hardware

Los registros de depuración (Debug Registers) permiten establacer hasta cuatro puntos de ruptura, pero también pueden ser detectados y/o borrados, ya que se puede consultar los valores de dichos registros, alojados en la estructura Context (ESP+C). Se puede encontrar código que implemente el borrado de estos puntos de ruptura en el punto 7 del apartado CPU antidebug del enlace anterior: "Debug registers manipulation".

Mikel Gastesi
S21sec e-crime


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login