Miscellaneous

Mostrando las entradas con la etiqueta Debugging. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Debugging. Mostrar todas las entradas

lunes, 12 de septiembre de 2016

Técnicas antidepuración - PEB.NtGlobalFlag

Para continuar la serie sobre técnicas antidepuración, en esta entrada hablare acerca de la técnica que usa otro campo de la estructura PEB, más específicamente el campo NtGlobalFlag (offset 0x68).

Este campo, al igual que PEB.BeingDebugged (offset 0x02), cambia su valor cuando el programa es cargado desde un depurador, es decir, cuando el programa no esta siendo depurado, normalmente su valor es 0x0, mientras que cuando es cargado desde un depurador, su valor cambia a 0x70, valor que se explica por el establecimiento de las siguientes banderas con sus respectivos valores:

FLG_HEAP_ENABLE_TAIL_CHECK -> 0x10
FLG_HEAP_ENABLE_FREE_CHECK -> 0x20
FLG_HEAP_VALIDATE_PARAMETERS-> 0x40

Si observas, la suma de los valores con los que se establecen estas banderas es 0x70, que es el valor que adquiere PEB.NtGlobalFlag cuando el programa esta siendo depurado. Entonces, para saber si un programa esta dentro de un depurador usando PEB.NtGlobalFlag, antes se debe hacer una comprobación de su valor con 0x70, si es igual, entonces esta siendo depurado, en caso contrario, no lo esta, en esencia es el mismo funcionamiento que emplea la técnica IsDebuggerPresent(), la única diferencia es que ahora windows no nos proporciona una función para acceder directamente a PEB.NtGlobalFlag, por lo que debemos hacer uso de un código parecido al siguiente:



O también alguno de estos, que desde mi punto de vista, son la mejor opción si eres una persona que se interesa en el mundo del reversing y lenguaje ensamblador:


Pero bueno, sea cual sea la forma en que implementes esta técnica, debo advertirte, evitarla es igualmente fácil que evitar la técnica IsDebuggerPresent(), si observas, basta con manualmente cambiar el valor de la flag NtGlobalFlag y setearlo a 0x0, así, si el programa se carga desde un depurador, funcionara de igual manera que como si estuviera fuera de este.

pero manten la calma, apenas estamos en la segunda técnica antidepuración, esto ira aumentando de complejidad e iremos conociendo nuevas técnicas en futuras entradas. 

Por ahora, estudiar, comprender e intentar hacer bypass de estos códigos puede ser un buen ejercicio para reforzar lo leido... Sin más que decir, manos a la obra y happy hacking! :).

martes, 6 de septiembre de 2016

Técnicas antidepuración - IsDebuggerPresent()

La técnica más simple para comprobar si un programa se encuentra dentro de un depurador, es decir, esta siendo depurado, es aquella que realiza una comprobación al estado de la bandera BeingDebugged, dicha bandera se encuentra en el PEB (Process Environment Block) y tiene el offset 0x02.


En sistemas windows se nos proporciona vía kernel32.dll la función IsDebuggerPresent() para checar el estado de esta bandera, el código que se muestra debajo es un ejemplo de como usar kernel32!IsDebuggerPresent() para verificar si el programa se encuentra dentro de un depurador:


Se puede notar que la función nos va a retornar un valor Booleano, es decir,  si es 1 (TRUE) significa que el programa fue cargado desde un depurador, si es 0 (FALSE) significa que el programa esta corriendo fuera de un depurador.

Otros códigos equivalentes a lo anterior pueden ser los siguientes:


La simpleza de esta medida antidepuración la convierte hoy en día en una de las medidas menos efectivas para tratar de evitar a un depurador ya que basta con modificar manualmente la flag PEB.BeingDebugged con el valor 0x00 para evitarla.

Pero bueno ya en otras entradas abordare técnicas más sofisticadas para detectar depuradores, por ahora trata de entender bien el funcionamiento de los códigos proporcionados anteriormente y happy hacking!.