Evadir emulacion de AVs.

Iniciado por APOKLIPTICO, 31 Julio 2012, 04:18 AM

0 Miembros y 1 Visitante están viendo este tema.

APOKLIPTICO

Hola! Como va, bueno, como todos sabemos, hay varias maneras que utilizan los AVs para saber si algo es un virus o no lo es. Tenemos las Firmas detectadas, firmas probables, heurística y emulación de código.
La pregunta principal es si hay una manera de saber con algún programa o método qué método utilizó el anti virus para detectar un virus.

La segunda pregunta es cómo puedo hacer para evadir la emulación de código, es decir, maneras de por ejemplo, cerrarse al descubrir emulación o hacerlo tan pesado que el AV se resigne al tratar de emularlo (pidiendo demasiados recursos por ejemplo).

Un abrazo
APOKLIPTICO.
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Karcrack

Los AVs incluyen el método de detección que ha saltado en el nombre de la propia detección.

Respecto a tu segunda cuestión; Los emuladores de los AVs mejoran constantemente, aún así algunos emuladores tienen un límite temporal para analizar cada fichero y así no ralentizar el PC en exceso. Como ya habrás adivinado el secreto reside en hacer que el malware tarde en hacer las tareas sospechosas.

APOKLIPTICO

No entendí tu primera oración XDDD

En cuanto a lo segundo, se podría decir que si hago que la primera instrucción del programa sea armar un buffer en la heap de 1 GB y llenarlo de información pseudoaleatoria utilizando la funcion rand(), eso ayudaría?? Hay alguna instrucción que los emuladores no puedan emular y que no haga saltar el anti virus por si misma???
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

[L]ord [R]NA

 ::) Nop... si llenas la heap con 1GB ten de seguro que se notara la presencia  :¬¬ (Eso es lo que se trata de evitar).

podrias hacer algo como



/*Tarea Sospechosa*/

//codigo sospechoso...


for(int i(0);i<rand()%1000;i++)
       Sleep(rand()%100);


//continuacion de codigo sospechoso.



Esto seria un ejemplo de aproximadamente que quiere decir Karcrack... Seria bueno recalcar que con un poco de ofuscacion adicional podrias evadir con creces el AV.

zu-zu

Los sleep no siempre son emulados. Sería mejor resumir la ejecución si la posición del cursor cambió a usar un sleep.

fary

Cita de: APOKLIPTICO en 31 Julio 2012, 20:09 PM
No entendí tu primera oración XDDD

En cuanto a lo segundo, se podría decir que si hago que la primera instrucción del programa sea armar un buffer en la heap de 1 GB y llenarlo de información pseudoaleatoria utilizando la funcion rand(), eso ayudaría?? Hay alguna instrucción que los emuladores no puedan emular y que no haga saltar el anti virus por si misma???

En la primera oración se refiere a que segun la forma de detecar en virus los AV le ponen una firma u otra, por poner un ejemplo cuando avira analiza un fichero desde su emulador y detecta el virus de pone la firma TR.Dropper.Gen (Nose si esa firma de avira sera por eso, es un ejemplo).

Respecto a lo segundo, Swash tenia una teoría de que si hacia varios bucles largos al inicio del programa para que superara un tiempo determinado que tiene el AV para analizar el archivo el AV no lo emulaba por completo y no lo detectaria...
En cuanto a las instrucciones, si hay alguna que no es capaz de emular... pues seguramente! pero es cuestion de descubrir cual y para que AV funciona.

saludos.





Un byte a la izquierda.

Karcrack

Tal y como aclara mDrinky me refería a que en el propio nombre que le da el AV a la detección suele suele incluirse esa información. Por ejemplo el "Heur" que añaden en algunos tags que viene de heurística, obviamente.

Como apunta zu-zu los emuladores de los AVs no son estúpidos y hay ciertas acciones que obvian por su poca relevancia en el flujo de ejecución de la aplicación (como los sleeps). Pero hay muchas otras formas de redireccionar el flujo de la aplicación u obfuscarlo, como por ejemplo usando handlers personalizados para errores que generes.

Como dato añado que había una forma de saber si estabas siendo emulado dentro del Kaspersky (si no recuerdo mal) que era haciendo un gethostbyname() y obteniendo el error generado, ya que para evitar conexión a internet se emulaban las llamadas a las APIs de WS y devolvía un error incorrecto.

Lo importante es que los emuladores van mejorando, ya sea obviando sleeps o reparando errores que ellos mismos hacen... eso sí, el NOD32 lleva más de 6 años petando con una instrucción de FPU que no emula correctamente:
Código (asm) [Seleccionar]
pminsw xmm0,xmm1
Con esa instrucción cualquier aplicación detectada por NOD32 se vuelve invisible :laugh: :laugh:

[L]ord [R]NA

:¬¬ vamos hombres... fue un ejemplo. No lo di como valido. No me crucifiquen.

APOKLIPTICO

Cita de: Karcrack en  1 Agosto 2012, 21:04 PM
Tal y como aclara mDrinky me refería a que en el propio nombre que le da el AV a la detección suele suele incluirse esa información. Por ejemplo el "Heur" que añaden en algunos tags que viene de heurística, obviamente.

Como apunta zu-zu los emuladores de los AVs no son estúpidos y hay ciertas acciones que obvian por su poca relevancia en el flujo de ejecución de la aplicación (como los sleeps). Pero hay muchas otras formas de redireccionar el flujo de la aplicación u obfuscarlo, como por ejemplo usando handlers personalizados para errores que generes.

Como dato añado que había una forma de saber si estabas siendo emulado dentro del Kaspersky (si no recuerdo mal) que era haciendo un gethostbyname() y obteniendo el error generado, ya que para evitar conexión a internet se emulaban las llamadas a las APIs de WS y devolvía un error incorrecto.

Lo importante es que los emuladores van mejorando, ya sea obviando sleeps o reparando errores que ellos mismos hacen... eso sí, el NOD32 lleva más de 6 años petando con una instrucción de FPU que no emula correctamente:
Código (asm) [Seleccionar]
pminsw xmm0,xmm1
Con esa instrucción cualquier aplicación detectada por NOD32 se vuelve invisible :laugh: :laugh:

Casualmente para el NOD32 es indetectable XDD.
Había un POC que decía que si se trataba de utilizar las instrucciones mmx y se evaluaba el resultado, esto podría dar la pauta de si el código está siendo emulado. El problema es que el AV detecta estas instrucciones en momentos y lugares sospechosos y poco comunes y las flaggea como malas...
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Иōҳ

@mDriny, es que no es una teoría, ya hay un escrito de eso, y lo vi hace uffff mucho tiempo.

pd: no probé el poc

Saludos.
Eres adicto a la Ing. Inversa? -> www.noxsoft.net