Técnicas Anti-Reversing (Parte 2)
En la primera parte, discutimos algunas técnicas comunes utilizadas por los autores de malware para proteger sus aplicaciones de la ingeniería inversa. En esta segunda parte, veremos más métodos y técnicas utilizadas para detectar y prevenir la ingeniería inversa.
Depurador Detección:
Técnica de tiempo de ejecución de código:
Cuando usamos un depurador para analizar un ejecutable, a veces usamos una ejecución de un solo paso para pasar por algunas instrucciones de ensamblaje, el tiempo de ejecución será mucho más largo que la ejecución normal, tomemos este código como ejemplo:
Al comienzo del código tenemos una llamada a la función " GetTickCount " que devuelve la cantidad de milisegundos que han transcurrido desde que se inició el sistema. El código hasta la ejecución de la función " ShellExecuteW " tomará de 30 a 47 milisegundos según lo medido en mi máquina. Después de eso, volvemos a llamar a la función " GetTickCount " para obtener la hora y luego obtener la diferencia entre los valores de las dos llamadas, y si es más de 70 milisegundos, salga del proceso; de lo contrario, imprima el mensaje.
Hay otras API de Windows que se pueden usar para obtener tiempo, como:
- ObtenerHoraLocal().
- ObtenerTiempoSistema().
- Contador de rendimiento de consulta().
Los puntos de interrupción de software son una técnica común contra la depuración utilizada por actores maliciosos para dificultar la ingeniería inversa de sus malwares. Esta técnica consiste en insertar una instrucción de código específica, conocida como punto de interrupción, en el programa en una ubicación específica. Cuando se ejecuta el programa, el punto de interrupción hará que el programa deje de ejecutarse, lo que dificulta que un depurador analice el comportamiento del programa.
Una forma de implementar un punto de interrupción usando lenguaje ensamblador es usar la int 3instrucción. Esta instrucción es una interrupción de software que hace que el programa deje de ejecutarse y transfiera el control al depurador. Aquí hay un ejemplo de cómo usar la int 3instrucción en C++:
Puntos de interrupción de hardware:
Los puntos de interrupción de hardware son un tipo de técnica anti-depuración que utiliza funciones de hardware especializadas de la CPU para detectar y evitar la depuración de un programa. Esta técnica implica establecer un punto de interrupción en una dirección de memoria o registro específico, y luego instruir a la CPU para que active una interrupción cada vez que el programa acceda o modifique la dirección o el registro especificado.
A continuación se muestra un ejemplo de cómo comprobar si se ha establecido un punto de interrupción de hardware:
Un valor distinto de cero en cualquiera de los registros de depuración podría sugerir que el proceso se está ejecutando bajo un depurador con un punto de interrupción de hardware establecido.
Autodepuración:
Es una técnica utilizada por los autores de malware para evitar que un depurador se adjunte al proceso o verifique si el proceso está bajo un depurador. Implica el uso de un depurador para depurar el propio programa, con el fin de detectar y evitar que otros depuradores se adhieran al programa.
A continuación se muestra un ejemplo de una instancia que crea una segunda instancia del proceso y crea un evento con nombre con el nombre "debugger_present". La segunda instancia del proceso intentará adjuntar un depurador al proceso principal y, si falla, establecerá el evento que indicará al proceso principal que hay otro depurador adjunto:
UnhandledExceptionFilter()
Si un programa encuentra una excepción que no es manejada por ningún controlador de excepciones registrado, se llamará a la función kernel32!UnhandledExceptionFilter(). Es posible registrar un filtro de excepción personalizado no controlado mediante kernel32!SetUnhandledExceptionFilter(). Sin embargo, si se está depurando el programa, no se llamará al filtro personalizado y, en su lugar, se pasará la excepción al depurador. Por lo tanto, si el control se pasa al filtro de excepciones no controladas, se puede inferir que el programa no se está ejecutando bajo un depurador:
gracias por tomarse el tiempo de leer esto hasta la próxima.

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































