Análisis de malware

Antidesmontaje, antidepuración y anti-VM

septiembre 11, por Jamal Chahir

El malware se aprovecha de los supuestos básicos de un desensamblador. Explota las decisiones predecibles tomadas por los depuradores y se oculta cuando sospecha que se está ejecutando en una máquina virtual.

Este artículo ofrece una descripción general de los trucos y técnicas de defensa contra el malware que se utilizan cuando las herramientas de desmontaje y depuración buscan malware, especialmente dentro de una máquina virtual.

¡Conviértete en un ingeniero inverso certificado!

Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender

Técnicas anti-desmontaje

Los autores de malware utilizan técnicas anti-desensamblado para retrasar, prevenir y/o evitar la ingeniería inversa de su código. Utiliza código creado manualmente para hacer que las herramientas de análisis de desmontaje produzcan una lista de programas incorrecta. A continuación se muestran algunas técnicas comunes contra el desmontaje.

Ofuscación de API

La ofuscación de API cambia los nombres de las identificaciones (nombres de clases, nombres de métodos, nombres de campos) a nombres aleatorios para que el lector del código no sepa qué está haciendo el código.

Ofuscación de código de operación/código ensamblador

La ofuscación del código de operación/código ensamblador dificulta el desensamblaje del malware mediante el uso de tácticas como ejecutables con secciones descifradas e instrucciones de código que son difíciles de leer o sin sentido.

Código basura/espagueti

El código basura/espagueti se utiliza para confundir al ingeniero inverso y ocultar lo que el código actual intenta lograr.

Aplanamiento del gráfico de flujo de control

El aplanamiento del gráfico de flujo de control, o simplemente aplanamiento CFG, aplana el flujo de control de cada función al dividir primero el anidamiento de bucles y declaraciones if y luego ocultar cada uno de ellos en el caso de una declaración de cambio grande envuelta dentro del cuerpo de un bucle. .

Instrucción de salto con el mismo objetivo.

La instrucción de salto con el mismo objetivo se produce utilizando una combinación de jz con jnz. Este es un salto incondicional que el desensamblador no reconoce porque solo desensambla una instrucción a la vez.

Detectando depuradores

La antidepuración es una técnica antianálisis que utiliza el malware para comprobar si se está depurando. Los autores de malware utilizan muchas técnicas para impedir o ralentizar la tarea de ingeniería inversa de depurar su código.

API de Windows

La técnica más común que utiliza el malware es la API de Windows, ya que proporciona varias funciones que el malware puede utilizar para detectar depuradores. El más utilizado es IsDebuggerPresent. Comprueba si hay un indicador específico en el bloque de entorno de proceso (PEB) para el campo BeingDebugged, que devolverá cero si el proceso no se ejecuta en un depurador o distinto de cero si hay un depurador adjunto.

Otra función similar es CheckRemoteDebuggerPresent, que comprueba si un proceso remoto está depurando el actual.

CerrarManija/NtCerrar

CloseHandle/NtClose es otro malware antidepuración que utiliza. Llamar al despachador con un identificador no válido genera una excepción de identificador no válido, STATUS_INVALID_HANDLE.

Buscar ventana

FindWindow también se utiliza para encontrar el depurador proporcionando una clase de ventana (por ejemplo, OLLYDBG).

NtGlobalFlag

El malware también puede aprovechar el indicador NtGlobalFlag de PEB en el desplazamiento 0x68 (que se llama para comprobar si se está depurando) verificando si su valor es igual a 0x70.

Técnicas avanzadas anti-depuración

Los analistas y especialistas en depuración que se encuentren con las siguientes técnicas antidepuración avanzadas se verán desafiados, tanto ellos como sus herramientas.

Defensa de tiempo

El contador de marca de tiempo de lectura (RDTSC) es un ejemplo común de defensa de tiempo. Las herramientas de depuración requieren tiempo y esfuerzo para procesar cada instrucción. Este proceso crea una lentitud y una fluctuación que es diferente del umbral de velocidad de procesamiento fijo de la computadora. El malware evita la detección leyendo la marca de tiempo de la computadora varias veces; si encuentra irregularidades en el tiempo, muestra un error porque sabe que un depurador está buscando en el sistema.

Detección de puntos de interrupción

Hay varios tipos de puntos de interrupción, pero los ingenieros inversos utilizan con mayor frecuencia los siguientes.

Interrumpe

Una interrupción es una condición que detiene el microprocesador temporal o permanentemente para trabajar en una tarea diferente llamada rutina de interrupción (también llamada Rutina de Servicio de Interrupción o ISR simple) cuya dirección se almacena en la Tabla de Descriptores de Interrupción (IDT). Luego vuelve a su tarea anterior. El malware puede utilizar algunas instrucciones de interrupción para detectar un depurador. Las siguientes son algunas de estas instrucciones:

Devoluciones de llamada TLS

Casi todos los depuradores inician el punto de entrada del programa, según lo definido por el encabezado PE. La devolución de llamada de Thread Local Storage (TLS) es una técnica que se puede utilizar para ejecutar un código antes o después de la ejecución del código de la aplicación principal. Esto significa que cuando se carga en un depurador, el programa realiza todas las comprobaciones antes de llegar al punto de entrada y el analista no sabrá lo que está sucediendo.

Técnicas anti-VM

Los autores de malware saben que la mayoría de los analistas de malware prefieren ejecutar su malware dentro de un entorno de máquina virtual para evitar que sus computadoras se vean afectadas por el malware que intentan analizar . Ésa es la razón por la que la mayoría de los autores de malware utilizan técnicas anti-VM para dificultar la visualización o el análisis de su código dentro de una máquina virtual. Estas son algunas de estas técnicas:

ID de CPU

Esta es la más popular entre estas técnicas. Esta instrucción se ejecuta con EAX=0x1 como entrada y el valor de retorno describe las características del procesador. El bit 31 de ECX en una máquina física será igual a 0. En una máquina virtual invitada, será igual a 1.

Otro método que utiliza CPUID lo ejecuta con EAX=0x 40000000, lo que se denomina » marca de hipervisor». El resultado devuelto será el proveedor de virtualización (“VMwareVMware” para VMWare y “Microsoft HV” para Microsoft). El resultado se almacena en ECX y EDX.

Otros métodos que utiliza el malware son buscar direcciones Mac conocidas (para VMWare es 00:05:69, 00:0C:29, 00:1C:14, 00:50:56, para VirtualBox es 08:00:27 ), verificar para claves de registro, verificación de procesos, verificación de archivos o verificación de servicios en ejecución .

Pastilla roja y sin pastilla

Red Pill es una técnica anti-VM que ejecuta la instrucción SIDT para capturar el valor del registro IDTR. El monitor de VM debe reubicar el IDTR del invitado para evitar conflictos con el IDTR del host. Dado que el monitor de VM no recibe notificación cuando la VM ejecuta la instrucción SIDT, se devuelve el IDTR de la VM.

No Pill se basa en el hecho de que la estructura LDT está asignada a un procesador, no a un sistema operativo. La ubicación de I en una máquina host será cero y en una VM será distinta de cero.

Conclusión

El malware utiliza estrategias de guerrilla, reescribiendo las reglas de enfrentamiento. Evita el descubrimiento reordenando procesos, llegando temprano o tarde, reconociendo una trampa y ofuscando las herramientas que buscan desmontarla y depurarla.

Sin embargo, el malware está limitado por su programación y depende de la previsibilidad. Los analistas de malware adaptativo pueden ajustar su estrategia en tiempo real cuando reconocen estas técnicas defensivas de malware y las contrarrestan.

Fuentes