x Informatica
Septiembre 09, 2010, 08:12:45 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Anunciamos: Juegos Flash x Informatica
 
   Inicio   Ayuda Buscar Calendario Ingresar Registrarse  
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: [Taller] Así funcionan los crypters: Encriptando malware a mano  (Leído 213 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Hacker_Zero
new


Aportes: 2
Desconectado Desconectado

Mensajes: 1


« : Julio 30, 2009, 03:40:10 »

Taller: Encriptando Malware a Mano



Objetivos de éste taller

Debido a la avalancha de crypters que últiamente salen a la luz y que, en mi opinión, el 90% de ellos (principalmente en VB) se hacen utilizando código de terceros sin entender realmente que es lo que programan, decidí hacer éste taller para mostrar el modo de funcionamiento de un crypter, de modo que cualquier persona con interés sea capaz a entenderlo. Al finalizar el talller seremos capaces de entender que es lo que hacen los crypters para burlar a los antivirus, y seremos capaces de hacer éste proceso de forma manual, así como, de tener conocimientos de programación y a partir de éste taller, tendremos los conocimientos necesarios para programar un crypter sabiendo que queremos conseguir realmente.




Herramientas Necesarias



¿Qué vamos a encriptar?

Bueno, lo primero que haremos será abrir el server del PI con un el Editor Hexadecimal y el Editor del PE:


Vemos que el ejecutable tiene 2 secciones, la .text y la .data. En éste caso vamos a encriptar solamente la sección .text que es la que contiene el código ejecutable. La .data la vamos a dejar tal y como está, porque si nos vamos al editor hexadecimal y nos vamos a 0x1A00 y miramos lo que hay más abajo, vemos que ahí se encuentra la IAT, y encriptar eso nos complicaría bastante las cosas, tal vez para otra entrega, en ésta vamos a dejar esa sección tal y como está  Lengua:


Entonces, lo que vamos a encriptar es lo que va desde 0x200 a 0x1A00 viendolo con el editor hexadecimal.

¿Cómo lo vamos a encriptar?

Lo haremos de una forma sencilla. Encriptaremos el archivo en disco y añadiremos un poco de código en un espacio libre, y que haremos que sea el primero en ejecutarse, de modo que cuando el archivo se cargue en memoria, éste código se encargue de desencriptar lo que habíamos encriptado de la sección .text y luego salte a donde el programa comenzaba originalmente. Éste código lo vamos a poner al final de la sección ejecutable, debido a que suele haber espacio libre ahí debido al alineamiento de las secciones.

   
Ejecutable original y ejecutable encriptado respectivamente

Preparando la sección .text

Vamos a buscar el espacio libre al final de la sección ejecutable y lo vamos a rellenar de NOP's usando el Editor Hexadecimal. Luego tambien vamos a cambiar los Flags del apartado Characteristics utilizando el LordPE.

Para buscar el espacio libre, nos vamos al LordPE y vemos que la sección .text emipeza en 0x200 (ROffset=0x200) y ocupa 0x1800. 0x200 y 0x1800 son 0x1A00, cojemos el HxD y nos vamos a esa dirección, es justo el comienzo de la sección .data y el final de la .text. Vemos que para arriba tenemos 0x00's, ése va a ser nuestro hueco, seleccionamos los 0's (dejando unos bytes de margen por si las moscas), y lo rellenamos de Nop's (NOP=0x90):


Y listo, ya sabemos donde podeomos poner nuestro código desencriptador, a partir de 0x1890 para adelante (anotamos en algún sitio ese valor), ahora otro punto. Para desencriptar la sección .text vamos a necesitar que ésta tenga permisos de lectura y escritura (de ejecución ya tiene puesto que es la sección de código), así que abrimos el server con el LordPE, nos vamos a Sections, seleccionamos la sección .text, click derecho->Edti Section Header, damos click en el botón situado en el apartado flags y marcamos la opción "Writeable" ("Readable" ya está), damos "OK" y guardamos todos los cambios.



Insertando la rutina encriptadora/desencriptadora

Bueno, el siguiente código en ASM desencrypta/encripta un array de bytes usando un Xor:

Código:
;---------------------------------------------------------------
;Taller Encriptacion Malware a Mano: Código Desencriptación
;---------------------------------------------------------------
;Movemos a eax la dirección de inicio del código encriptado
mov eax,402000h
;Movemos a ebx la dirección de fin del código encriptado
mov ebx,403000h
;Movemos a ecx la dir del Entry Point Original
mov ecx,401038h
xor byte ptr ds:[eax],0FFh ;Hacemos el xor al byte con la clave 0FF (se puede cambiar por otro byte)
inc eax                    ;Nos desplazamos al siguiente byte
cmp eax,ebx                ;Comprobamos si es el último
jne 401234h                ;Si no lo es, continuamos con el siguiente
ret                        ;Salimos del programa (cambiar ret por nop despues de encriptar)
jmp ecx                    ;Si lo es, saltamos el Entry Point Original

Eso es lo que tenemos que instar en el espacio libre que habíamos encontrado (con unas pequeñas modificaciones). Para eso, vamos al OllyDbg y abrimos el server. Una vez cargado el archivo, damos click derecho, View->Executable File.


Ahora nos vamos a la dirección (CTRL+G) dónde hemos empezado a poner los Nop's, 0x1890 (el valor que dije que recordarais). Luego damos click derecho sobre el primer Nop y sellecionamos View Image in Disassembler, así nos situará en donde se cargaron lso Nop's en memoria.


Ahí vamos a poner nuestro código, vamos dando doble click en los Nops y vamos introduciendo el código aterior línea a lína hasta que nos quede así:


Pero ahí hay que arraglar cosas, las direcciones 0x401000, 0x402000, 0x401038 y 0x4001234 no son correctas para éste ejecutable (y 99.999% seguro que para ningun otro que encontremos  Sonreir), así que hay que cambiarlas por sus valores correctos.

Vamos por la primera, el 402000, ésta es la dirección VIRTUAL donde de donde queremos que empiece a encriptar/desencriptar, en nuestro caso, queremos que empiece a encriptar/des en el inicio de la primera sección, que viendo como el editor hexadecimal era 0x200, pero NO, esa es la dirección FÍSICA, al cargarse en memoria esa dirección cambia por algo de la forma 40XXXX (corrientemente). Vale, y como la obtenemos? Pues abrimos el LordPE, cargamos el ejecutable, y le damos para ver las secciones:


Ahora ésto es una regla general para todos los casos, para obtener una dirección VIRTUAL a partir de la FÍSICA de una sección hacemos: (DIR FÍSICA-ROFFSET)+VOffset+ImageBase:
    (0x200-0x200)+0x1000+0x400000=401000.

Ésa es la dirección que tenemos que poner en el primer valor. Vamos con el segundo, el 403000, ése es el valor VIRTUAL donde termina el código que queremos encriptar. En éste caso, el código que queremos encriptar termina donde empezamos a poner los nops, en 0x1890 DIRECCIÓN FÍSICA, así que hacemos (DIR FÍSICA-ROFFSET)+VOffset+ImageBase:
     (0x1890-0x200)+0x1000+0x400000=0x402690 (Utilizad la calculadora de windows en modo hex  Lengua).

Ése es el valor que tenemos que poner en el 2º valor, vamos con el 3º, el 401028, éste es más fácil, ahí hay que poner el AddressOfEntryPoint en memoria del ejecutable, para saberlo abrimos el ejecutable con el LordPE:



Cogemos ese valor, se sumamos el ImageBase (0x400000+0x2104) y nos da 402104, ese es nuestro 3º valor, el punto a donde debemos de saltar luego de desencriptar los datos.

Venga, 4º y último valor que tenemos que cambiar, el 401234, éste también es fácil, la dirección a la que tiene que saltar el bucle si no llegamos al final. Volvemos al olly, donde habíamos introducido la rutina en ASM, y el valor que tenemos que introducir es la dirección donde pusimos el xor byte ptr ds:[eax],0FFh, en éste caso 0x40269F:


Y listo, nuestro código encriptador/desencriptador ya funcionaría, tal cual lo copiamos se encargaría de encriptar la sección .text. Debería de quedar así:


Así que en el olly damos click derecho "Copy to Executable/All modifications" y guardamos el archivo en disco (click drcho, backuup->save data to file).

Ahora tenemos que cambiar el Entry Point por la dirección donde empieza nuestro código en memoria: 2690 (Sin el imagebase):


Listo, ahora la rutina encriptadora/desencriptadora será lo primero que se ejecute al iniciar el archivo.


Encriptando, Desencriptando

Ahora que ya tenemos la rutina encriptadora/desencriptadora en su sitio, vamos a usarla para que nos encripte lo la sección .text, para ésto abrirmos nuevamente el server con el Olly, y ponemos un breakpoint en el ret del código de la rutina desencriptadora. Una vez hecho ésto, pulsamos F9 y el programa empezará a ejecutarse hasta que parará en el ret. En éste momento ya tenemos el código encriptado, pero en memoria, así que vamos a copiarlo al portapapeles. Seleccionamos con el ratón desde 0x401000 hasta 0x401890 (no incluído)(el trozo que encriptamos) y hacemos click derecho/bianry/binary copy:


Ahora cerramos el olly, y abrimos el archivo nuevamente con el HxD (mientras haces ésto no copies ni pegues nada que te cargas lo que hay en el portapapeles  Lengua). Una vez abierto seleccionamos los bytes desde 0x200 hasta 0x1890 (no incluído) y hacemos click derecho/pegar escribiendo y guardamos los cambios.

Ahora ya tenemos el código encriptado en disco, entonces ahora lo que tiene que hacer la rutina encriptadora/desencriptadora es desencriptar el código y luego saltar al Entry Point Original, para ésto solo tenemos que cambiar el ret del código por un Nop con Olly:


Guardamos los cambios en disco y LISTO!! ya tenemso nuestro server encriptado con "nuestro crypter manual  Sonreir":



Despedida
Bueno, pues espero que hayáis aprendido algo de mis palabras y del método, sobre todos los que no sabían lo que hacer un crypter, y los que sabían, pues seguro algo aprendieron tambien  Giñar.

Que lo disfrutéis! Y ya sabéis, cualquier duda  Giñar.

Subo también el server modificado después de todo el proceso para que os ayude a encontrar posibles fallos que tengáis  Lengua.  Descargar

Saludos
« Última modificación: Julio 30, 2009, 04:56:18 por Hacker_Zero » En línea
cass
al parecer es
X-Staff
advanced
****

Aportes: 23
Desconectado Desconectado

Sexo: Masculino
Mensajes: 458



« Respuesta #1 : Julio 30, 2009, 03:55:27 »

Hola se ve bastante interesante, gracias por el aporte!!
En línea

Dios los hace y ellos se juntan ..
rockernault
A7X
X-Staff
advanced
****

Aportes: 29
Desconectado Desconectado

Sexo: Masculino
Mensajes: 800

Windows XP Specialist/Linux user


« Respuesta #2 : Julio 30, 2009, 04:31:07 »

tienes razon... no todos sabemos como funciona un crypter...  y andamos alli copypasteando codigo

saludos

+1
En línea

He who makes a beast out of himself gets rid of all the pain of being a man
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP www.xinformatica.net © 2008-2010 :: Informatica ::
Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC
XHTML 1.0 válido! CSS válido!
Página creada en 0.177 segundos con 26 consultas. (Pretty URLs adds 0.024s, 2q)