Los códigos maliciosos no son todos iguales. Mientras que el análisis de unos puede ser un proceso simple, el de otros puede ser algo complicado y extenso. Una de las acciones que las amenazas llevan a cabo para lograr este cometido, es la utilización de mecanismos antidebug: artimañas que logran que un código malicioso esconda su funcionalidad ante la evidencia de un análisis dinámico. Veamos los conceptos esenciales de esta temática.
Hubo una época donde las computadoras distaban mucho de las presentes: eran grandes mecanismos, llenos de piezas electrónicas de un tamaño mucho más considerable que el de las actuales. En tiempos como esos, más específicamente en 1947, Grace Hopper (una conocida ponencia en ciencias de la computación) notó un incidente curioso: una computadora no funcionaba debido a un insecto (o bug en inglés) que se había atorado en un relé. Entonces, remarcó que estaban solucionando el problema, y para eso estaban haciendo “debug”. Aquí el reporte del hallazgo:
El tiempo pasó, y la palabra bug aún sigue vigente en el desarrollo de software: se utiliza para nombrar errores o fallas en un sistema. Sin embargo, el término debug es un poco más extenso: puede referirse a solucionar bugs, pero también a la ejecución de un programa de forma tal que permita ver paso a paso o de forma detallada el estado del mismo, facilitando su comprensión y análisis.
Ahora, ¿en qué respecta todo esto al análisis de malware? Pues bien, los conceptos se encuentran estrictamente ligados.
El análisis dinámico de malware consiste en la ejecución de una muestra en un entorno controlado y preparado para el análisis, para de esa forma entenderla mejor, ver su funcionalidad y finalidades. Si bien aparenta ser un proceso mecánico y reiterativo, no lo es: hay amenazas que presentan mecanismos que detectan que un análisis dinámico se está llevando a cabo, y ocultan su funcionamiento para que de esa forma no se conozca qué es lo que hacen. A este tipo de mecanismos se les llama mecanismos antidebug.
Ahora, ¿cómo se percatan las amenazas que estamos intentando analizarlas? Los métodos son muy variados, pero veamos dos de los más simples para entender mejor la temática.
Utilización de GetTickCount()
Esta función se encuentra presente en lenguajes como C++ (y otros lenguajes pueden presentar similares, con el mismo funcionamiento). Sirve para obtener la cantidad de milisegundos que pasaron desde que se inició el sistema. Al desarrollar una amenaza, se puede utilizar para comprobar si entre la ejecución de una instrucción a otra ha pasado un tiempo considerable: de ser así, ya que la ejecución de instrucciones es algo muy rápido, probablemente se esté haciendo debug, y en ese caso se esconderá la funcionalidad maliciosa.
La función IsDebuggerPresent()
Función que sirve para determinar si al proceso que se está ejecutando se le está haciendo debug.
Al analizar estos mecanismos, vemos que el análisis de malware no es un proceso simple, y que requiere del criterio del analista para llegar a un buen puerto y no caer en la trampa de pensar que “la muestra no tiene comportamiento malicioso”, o “su campaña ya no se encuentra vigente”. ¿Quieren conocer más de esta temática y de cómo se relaciona al análisis de malware? En las siguientes entradas conoceremos más de ella, y de los mecanismos que la involucran.