Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: APOKLIPTICO en 31 Julio 2012, 04:18 am



Título: Evadir emulacion de AVs.
Publicado por: APOKLIPTICO en 31 Julio 2012, 04:18 am
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.


Título: Re: Evadir emulacion de AVs.
Publicado por: Karcrack en 31 Julio 2012, 16:19 pm
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.


Título: Re: Evadir emulacion de AVs.
Publicado por: 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???


Título: Re: Evadir emulacion de AVs.
Publicado por: [L]ord [R]NA en 1 Agosto 2012, 06:04 am
 ::) 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

Código
  1.  
  2. /*Tarea Sospechosa*/
  3.  
  4. //codigo sospechoso...
  5.  
  6.  
  7. for(int i(0);i<rand()%1000;i++)
  8.       Sleep(rand()%100);
  9.  
  10.  
  11. //continuacion de codigo sospechoso.
  12.  
  13.  

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.


Título: Re: Evadir emulacion de AVs.
Publicado por: zu-zu en 1 Agosto 2012, 09:11 am
Los sleep no siempre son emulados. Sería mejor resumir la ejecución si la posición del cursor cambió a usar un sleep.


Título: Re: Evadir emulacion de AVs.
Publicado por: fary en 1 Agosto 2012, 15:18 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.







Título: Re: Evadir emulacion de AVs.
Publicado por: 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
  1. pminsw xmm0,xmm1
Con esa instrucción cualquier aplicación detectada por NOD32 se vuelve invisible :laugh: :laugh:


Título: Re: Evadir emulacion de AVs.
Publicado por: [L]ord [R]NA en 1 Agosto 2012, 21:10 pm
:¬¬ vamos hombres... fue un ejemplo. No lo di como valido. No me crucifiquen.


Título: Re: Evadir emulacion de AVs.
Publicado por: APOKLIPTICO en 2 Agosto 2012, 18:11 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
  1. 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...


Título: Re: Evadir emulacion de AVs.
Publicado por: Иōҳ en 2 Agosto 2012, 18:47 pm
@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.


Título: Re: Evadir emulacion de AVs.
Publicado por: The Swash en 3 Agosto 2012, 20:41 pm
Hola,

@APOKLIPTICO, ¿podrías especificar el motor sobre el cual quiere pasar la emulación?
Y hago referencia al emulador sobre el que quiere pasar ya que son bastante diferentes y cada uno puede emular distintas cosas, parsear opcodes que no soportan, etc.

Un saludo,
Iván Portilla.


Título: Re: Evadir emulacion de AVs.
Publicado por: APOKLIPTICO en 7 Agosto 2012, 02:59 am
El de Symantec por ejemplo.


Título: Re: Evadir emulacion de AVs.
Publicado por: Karcrack en 15 Agosto 2012, 19:15 pm
Una lectura muy interesante que me compartió [Zero]:
Código:
http://computervirus.uw.hu/ch11.html


Título: Re: Evadir emulacion de AVs.
Publicado por: Karman en 31 Agosto 2012, 03:15 am
virtualización manual: http://www.codigofuente.tk/index.php?topic=5272.msg7603#msg7603

y no hay emulación que funque :P

S2

PD: la idea no es virtualizar todo, pero si partes críticas :P


Título: Re: Evadir emulacion de AVs.
Publicado por: Karcrack en 31 Agosto 2012, 19:08 pm
Vaya Karman, pedazo de código. Virtualizar código es algo que está en otro nivel :laugh: además añadir soporte a las instrucciones necesarias puede llegar a ser un quebradero de cabeza. Sin duda un trabajo increíble :D


Título: Re: Evadir emulacion de AVs.
Publicado por: 0xDani en 31 Agosto 2012, 22:30 pm
Que proposito tiene la virtualizacion de codigo?


Título: Re: Evadir emulacion de AVs.
Publicado por: APOKLIPTICO en 5 Septiembre 2012, 01:03 am
Evade heurística, pero dudo que evada emulación...


Título: Re: Evadir emulacion de AVs.
Publicado por: Newhack32 en 5 Octubre 2012, 23:22 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
  1. pminsw xmm0,xmm1
Con esa instrucción cualquier aplicación detectada por NOD32 se vuelve invisible :laugh: :laugh:
y como meteria ese code con olly  :huh: