Tal y como ya adelanté, en este artículo vamos a poner en práctica lo que hemos aprendido hasta el momento sobre la evasión de Antivirus, en adelante AVs. En el último post de esta serie sobre 'Crypters', vimos los fundamentos teóricos de la técnica 'dsplit/AVfucker'. En este post voy a tratar de ilustrar esta técnica con un ejemplo práctico, valiéndome de un caso muy sencillo de aplicación de esta técnica.
Herramientas
Existen diversas herramientas que permiten aplicar la técnica 'dsplit/AVfucker', concretamente voy a utilizar una que es bastante cómoda, tiene muchas funcionalidades y es bastante rápida, pero si buscáis encontraréis otras por los foros relacionados con el tema. En concreto voy a utilizar 'UdTools Offset Locator 2.0'. También necesitaremos un anotador, así que voy a utilizar 'Antrax-Labs Offset Anotator' (by The Swash). Adicionalmente, utilizaré un 'Hex Workshop 6.7' como editor hexadecimal y 'OllyDbg' como disassembler (desensamblador).
Crypter
Para 'modear' un 'stub' hay que disponder del 'crypter' (tanto el 'builder' como el 'stub'). Es importante conseguir uno que sea 'original', es decir, que no haya sido 'retocado'. Trabajar un ejecutable previamente 'modeado' es siempre más complicado. Para este ejemplo voy a utilizar 'Simple Crypter 2010' (by DuNeD@i).
AV
Voy a utilizar para este ejemplo una 'firma' bastante sencilla del AV de origen Checo Avast (avast!). Ese, con esa voz tan sexy que siempre nos recuerda: "La base de datos de virus, ha sido actualizada". Lo primero que haremos, será configurar adecuadamente el AV para el proceso de 'modding'. Para ello, desactivaremos todos los 'escudos' en tiempo real y desactivaremos la opción de envío de muestras (En el caso de Avast hay que desactivar la opción 'Participa en la comunidad avast!')
Entorno de trabajo

Lo primero de todo es mantener una buena organización del entorno de trabajo. Para ello, vamos a trabajar en una carpeta en la crearemos varias 'sub-carpetas'. Una se llamará 'original' y en ella guardaremos el 'Crypter Original'. En otra carpeta guardaremos nuestro 'Anotador' y por último las dos más importantes, a las que se llamaremos 'offsets1' y 'offsets2', que funcionarán como carpetas de resultados en las que se almacenarán los diferentes archivos generados meadiante la aplicación de la técnica 'dsplit' y 'AVfucker'. En breve veremos el propósito de cada una de estas carpetas. Para comenzar a 'modear' necesitamos aplicar el 'crypter' a nuestro ejecutable de prueba, el 'anotador'. Para ello abriremos el 'builder' (llamado crypterx.exe en este crypter), y seleccionaremos el 'anotador'. Pulsaremos el botón 'Crypt' y se abrirá una ventana del explorador de archivos para indicar el nombre y ubicación del ejecutable. En este ejemplo lo llamaré 'modme.exe'.
Hey Ho Let's Go!
Dsplit

El nombre de cada archivo, se corresponde con el offset en el que número de bytes añadidos al archivo, y del tamaño del bloque utilizado. Así pues tendremos: 1000_1000.exe, 2000_1000.exe, ..., 46000_1000.exe.

Vamos a precisar el offset concreto. Para ello, continuaremos con el proceso 'dsplit' en el entorno del offset 10.000. Volvemos a la aplicación 'UDTools Offset Locator 2.0' e introducimos el offset inicial 9.000 y el el offset final 11.000. Esto lo hacemos para evitar problemas con las zonas frontera. A continuación seleccionamos el valor de 'bytes' a 100, reduciendo un orden de magnitud respecto del valor anterior que era 1.000. De este modo, vamos precisando en cada iteración un poco más. Pulsamos el botón 'Iniciar' y se generan los archivos en 'offsets1'. Todos los archivos del proceso anterior se habrán borrado si la opción 'Borrar todos los archivos del directorio seleccionado' estaba marcada.
Repetiremos el proceso de 'escaneo' mediante la opción 'Analizar offsets1' que nos aparecerá al pulsar el botón derecho sobre la carpeta. Una vez 'escaneada' la carpeta y desplegado el cuadro de 'MOSTRAR RESULTADOS' veremos que el primer offset detectado es 10.600. Una vez más volveremos a la aplicación 'UDTools Offset Locator 2.0' y seleccionaremos el rango 1.500 a 1.700 como offsets incial y final y reduciremos los 'bytes' de incremento a 10. Volveremos a 'escanear' y esta vez veremos que el primer offset detectado es 10.560.
Una última iteración entre 10.550 y 10.570 con un incremento de 1 byte, nos indicará que el offset exacto en el que se detecta código malicioso es 10.552. Es decir, hasta el byte anterior el AV no ha sido capaz de detectar la firma, sin embargo, a partir del byte 10.552 ya la detecta. Parece lógico pensar que los bytes que definen la firma han de estar exactamente en el entorno de 10.552 pero no es así. La técnica 'dsplit' nos indica que en ese 'pedazo' de archivo seleccionado de 10.552 bytes el AV es capaz de detectar la firma. Mediante la técnica 'AVfucker' vamos tratar de localizar los bytes que conforman la firma. Para poder aplicar la técnica 'AVfucker' lo primero que haremos es copiar el archivo 10552_1.exe de la carpeta 'offsets1' a la carpeta de trabajo.
AVfucker

En la campo 'archivo' del formulario de la aplicación 'UDTools Offset Locator 2.0' teníamos nuestro archivo 'modme.exe', que es con el que hemos estado trabajando hasta el momento. Ahora arrastraremos el archivo 10552_1.exe a dicho formulario, ya que es sobre este archivo sobre el que vamos a aplicar la técnica 'AVfucker'. En el formulario 'directorio' no vamos a hacer cambios y mantendremos la carpeta 'offsets1'. En la sección 'Método' seleccionaremos 'Av-Fuck'. Veremos que ahora el offset inicial es 1000 y el offset final 10552, mientras que el rango de 'bytes' vuelve a ser 1000. La diferencia fundamental entre 'dsplit' y 'AVfucker' es que con 'dsplit' solo recortamos el ejecutable en secciones, mientras que con 'AVfucker' lo que hacemos es 'tapar' o 'rellenar' secciones del ejecutable con un valor determinado. Por tanto, en la aplicación 'UDTools Offset Locator 2.0' debemos indicar con que valor queremos 'rellenar'. podemos escribir el valor hexadecimal que queramos, siendo los valores '00' ó '90' los más usados generalmente. También podemos usar el botón 'A' para rellenar el campo con un valor aleatorio. El valor a escoger puede depender de varios factores, en general, '90' (instrucción NOP en ensamblador) es un buen valor de 'relleno' para comenzar. Pulsamos 'Iniciar' y se generan en 'offsets1' 10 archivos con sus respectivas zonas de 1000 bytes rellenos del byte '90'.


Si estuviésemos ante una zona de código con instrucciones, lo más práctico sería aplicar técnicas como RIT o XOR para alterar las instrucciones de forma que se partiese la firma pero no se viese alterado el resultado del ejecutable. En este caso, como se trata de cadenas de bytes, es más práctico buscar alguna alteración de las mismas que no dañe el ejecutable.

En nuestro ejemplo hay numerosos offsets en dicho rango que al ser rellenados con el byte '90' dejan funcional el ejecutable y por tanto 'indetectan' la firma.
Además no existe una segunda firma del AV para este archivo, sin embargo, en muchos casos, al conseguir tapar la primera firma, hay que continuar con el proceso 'dsplit' para localizar un segundo bloque de detección y volver aplicar AVfucker para localizar los offsets de las firmas adicionales.
Aplicar modificación al stub
Hay que tener en cuenta que hemos trabajado con el archivo 'modme.exe' para poder verificar su funcionamiento, pero en realidad lo que necesitamos es aplicar los cambios realizados al 'stub'. Para ello podemos hacer un copia del 'strub.exe' original y repetir los cambios realizados sobre 'modme.exe' también sobre el 'stub', o bien podemos extraer el 'stub' del archivo 'modme.exe'. Mediante un editor hexadecimal podemos llevar a cabo fácilmente esta operación. Simplemente es necesario conocer el tamaño del 'stub' original y seleccionar desde el primer byte hasta el tamaño final del 'stub' y guardar los bytes seleccionados a un nuevo archivo.
Como ya comenté al inicio, éste es un caso básico de eliminación de una firma de AV que sirve para ilustrar la técnica 'dsplit/avfucker' de una manera sencilla. Evidentemente hay multitud de firmas muchísimo más complejas que ésta, pero este ejemplo confirma la debilidad de algunas de las firmas que establecen los AVs.
Artículo cortesía de Abraham Pasamar