¿Cómo funciona un antivirus?
Antes de entrar en harina, conviene tener una somera idea de qué es lo que hace un antivirus para detectar las amenazas. Las dos estrategias más usadas para la detección del malware son, por un lado la detección sintáctica, basada en la búsqueda de patrones (llamados firmas), y la detección semántica, que se basa en el análisis del comportamiento de los programas.
En general, la mayoría de los antivirus se basan en la primera técnica y mantienen una bases de datos de firmas con las que tratan de identificar programas peligrosos.
Cuando el antivirus se dispone a analizar un archivo, compara cada una de sus firmas (o un gran número de ellas) con el software analizado, buscando una concordancia. Si la encuentra, lanzará una alerta indicando que ha encontrado un virus.
¿Qué pasa entonces cuando aparece un nuevo virus? Exacto, como no existe una firma para dicho virus en la base de datos, no será capaz de detectarlo.
Es fácil imaginar cual es, pues, el trabajo de un fabricante de antivirus. Casi el 99% de su trabajo es:
- Localizar nuevos virus.
- Analizarlos.
- Crear las firmas para ese virus o familia de virus.
- Incluirlo en la base de datos del antivirus (esa que descargamos cuando actualizamos el antivirus).
Quizás no te hagas una idea de la titánica tarea a la que se enfrentan los fabricantes de antivirus, pero si quieres hacerte una idea piensa que sólo McAfee encuentra 100.000 nuevos ejemplares de malware cada día. Y esos ejemplares se analizan usando dos técnicas diferentes:
- Análisis estático: Un técnico desensambla el virus y lee su código ensamblador para ver qué hace.
- Análisis dinámico: Se ejecuta el virus en un entorno controlado para ver cuáles son sus efectos en el sistema.
Si estás pensando que es imposible analizar tantos virus estás en lo correcto, por lo que las empresas de antivirus desarrollan herramientas más o menos automatizadas basadas en técnicas de detección semántica. Desgraciadamente, estas técnicas son más lentas que la detección por firma, lo que las hace inviables para usarlas en un antivirus comercial.
En cualquier caso, dado el número de amenazas que aparecen cada día y a la tremenda batalla a la que se enfrenta el fabricante (piénsalo la próxima vez que decidas descargar un antivirus sin pagarlo), tu antivirus siempre irá por detrás de los nuevos virus que van apareciendo.
¿Es posible engañar a un antivirus?
Por desgracia, la respuesta es sí. Sólo hay que modificar algunas de sus partes sin modificar su comportamiento para que la firma del antivirus ya no coincida. ¿Cómo se hace esto? hay varias técnicas (conocidas como técnicas de evasión).
La más habitual, pero no la única, es la ofuscación del programa ejecutable. Esto consiste en modificar el programa de forma que mantenga su funcionalidad intacta, mientras que su código es diferente. Algunas formas de conseguir esto son:
- Intercambiar registros: Por ejemplo si tenemos el siguiente código (no te preocupes si no lo entiendes, lo importante es la idea).
mov 0x0,%eax
add 0x10,%eax
podemos cambiarlo sin modificar su comportamiento por el siguiente.
mov 0x0,%ebx
add 0x10,%ebx
- Cambio por instrucciones equivalentes: Sustituir una instrucción o un grupo de ellas por otras equivalentes. Por ejemplo, el código anterior puede sustituirse por el siguiente si cambiar su comportamiento.
xor %eax,%eax
lea (%eax+0x10),%eax
- Reordenación de código: Cambia de lugar bloques de código, incluso funciones enteras pero manteniendo el flujo de ejecución haciendo uso de instrucciones JMP.
- Cifrado: Cifra el código ejecutable. Obviamente hay que añadir al ejecutable una rutina de descifrado. Hay utilidades que automatizan esta tarea. Son los llamados packers o encoders. Podemos considerar que la compresión del ejecutable es otra forma, parecida al cifrado, de ofuscar el código.
Existen más técnicas, pero ya con éstas nos hacemos una buena idea de en qué consiste la ofuscación de un programa ejecutable, y de cómo repercute esto en las posibilidades que tiene el antivirus para detectarlo.
Artículo publicado en el laberinto de Falken