CREANDO MALWARED DESDE CERO 0

Bien les cuento, la idea de hacer una introducción (serie de tutoriales) sobre desarrollo de malware en un entorno de  windows x86 desde ASM que al parecer serán muchas partes ya que es un tema grande aun siendo solo una introducción nace desde hace un tiempo y de lo que siempre me invitaban a escribir al respecto cuando fui moderador en indetectables.net y hackxcrack.es , lo cual por cierto les recomiendo, son grandes foros relacionados a la inseguridad informática donde se habla de seguridad web, reversing/cracking, malware, exploits, etc , donde ronda gente grande en los temas, por ejemplo estuvo por ahí mi buen amigo German Sánchez  mejor conocido por otros en su web www.enelpc.com y que actualmente forma parte del equipo del gran Chema Alonso en elevenpaths (que muchos conocen y no hace falta presentación), así como el muchos otros colegas que hacían la estancia dentro del foro muy agradable con aportaciones muy buenas, lamentablemente por falta de tiempo he decidido alejarme un poco; regresando en lo que estaba, una introducción la cual también me inspiro a escribir sobre este tema es la de hace varios años redactada por fabio escudero (zeropad) al cual le mande un mail  para comentarle de mi proyecto y su respuesta fue “la idea es compartir información con la mayor cantidad de personas y que entre todos aportemos nuestro granito de arena.” y me ofrecio su ayuda en caso de necesitarla ,  claro que este será un tema algo parecido pero van cambiando muchas cosas a nuestro modo 3:).

El objetivo principal de esta serie de tutoriales que se irán liberando por partes es que al término se comprenda como funciona internamente un malware; comprendiendo paso a paso como se desarrollan y como es que realizan los procesos de infección y si todo marcha bien ustedes puedan desarrollar una muestra desde cero y ya obtenidos los conocimientos así apoyarse en el momento de querer analizar un malware a mano, empezaremos armando nuestro laboratorio y  explicare instrucciones basicas de ASM,  la estructura de los binarios win32, la cabecera, secciones, movimientos en memoria, uso del debugger, inyecciones de código hasta concluir con el desarrollo del bicho con un cifrado simple y quizás terminemos con algo mas complejo..

Esta primer parte empezaremos a armas nuestra mesa de trabajo, conociendo las herramientas y configurando en caso de ser necesario, ya teniendo todo listo podríamos pasar con detalles importantes para después empezar con el desarrollo de los bichos.



Laboratorio:

Maquina virtual: Windows 32 bits  ( windows xp o windows 7)
Masm32 –
Radasm (IDE) –

Todas las herramientas que usaremos para empezar son gratuitas y pueden ser descargadas sin problemas.

Conociendo y configurando las herramientas:

Masm32 , El Microsoft Macro Assembler (MASM) es un ensamblador para la familia x86 soportó una amplia variedad de facilidades para macros y programación estructurada, incluyendo construcciones de alto nivel para bucles, llamadas a procedimientos y alternación, este lenguaje es el que usaremos y el que mejor manejo, en la parte de abajo en la zona de “referencias” agregare algunos enlaces de tutoriales para que practique ligeramente sobre como desarrollar en masm que hoy en día sigue siendo de los assemblers más populares.
Ahora hablemos de nuestro IDE Radasm, les cuento, Radasm es un entorno integrado de desarrollo que nos permite programar en diferentes lenguajes pero en este caso usaremos únicamente MASM.

Para pasar a la parte de instalación he decidido usar una mini tool desarrollada por RVLCN que facilita instalar Masm32 en conjunto con Radasm (nuestro IDE) ya configurado en un solo paso:

Ya descargado desde el enlace de arriba, al correr la aplicación nos aparece la pantalla inicial
imagen1

Seleccionamos la casilla “Instalar Radasm” seleccionamos ruta a instalar y presionamos “instalar” , al terminar nos dira que ha terminado y listo con eso nos ahorramos unos min.

Ya una vez instalado podríamos ir a la carpeta donde lo hemos instalado y abrimos el ejecutable “Radasm.exe”  para probar si ya esta todo configurado y listo para empezar a desarrollar


2

Ahora seleccionamos en el menú “Archivo- Nuevo Proyecto” y nos aparecerá una ventana como esta:

3

Seleccionamos “Win32 app” y escribimos el nombre y descripción de nuestro proyecto, al presionar siguiente nos aparecera un lista con las plantillas disponibles:

4

Seleccionamos “Dialog app” que en este caso es la que nos interesa para probar, y si todo marcha bien nos mostraría una ventana de dialogo predeterminada, al presionar siguiente tendriamos todo el codigo que mas adelante explicare de que trata todo este rollo de codigo que es el que no hace mostrar una simple ventana de dialogo, presionamos “CTRL + f5″ y veamos:




5




6


Listo todo marcha bien y nos ha mostrado la ventana de dialogo tal cual esperabamos, por lo tanto todo está bien configurado.
Ahora les platicare acerca del debugger que usaremos, para los que no lo conozcan les platicare de él; Olly debugger es un debugger para programas en Windows de 32 bits y este es para trabajar en ring 3

Los procesadores X86 de Intel y compatibles tienen 4 niveles de privilegio:

Ring 0: mayor privilegio (nivel kernel), sobre este se ejecuta el sistema operativo
Ring 1
Ring 2
Ring 3: menor privilegio (nivel usuario)

Win32 solamente soporta ring 0 y ring 3, pero nosotros trabajaremos en nivel de usuario (ring 3)  por eso de mayor compatibilidad y además que debemos comenzar por un nivel muy basico, cabe mencionar que algunos bichos (rootkits) que se ejecutan en ring 0 son muy poderosos y empezar a jugar con nivel kernel y hacer mal resultaría desastroso.
Cuando trabajamos con ring 3 estaremos invocando a las API’s de Windows (de las que les explicare mas adelante)  y estas entraran a nivel kernel (ring 0) a ejecutarse y después retornar a nivel usuario, de esta forma nos aísla del ring 0.

Ya descargado nuestro debugger seleccionamos en el menú “file – open” y seleccionamos un ejecutable (el que sea) y veríamos algo como esto:

7


Es esencial conocer las partes de nuestro debugger, sigamos y les explicare una barra de los botones de nuestro debugger:


8
L: log data, muestra un detalle de lo que va haciendo el Olly (cuando arranca el programa, cuando genera un error, etc.)

E: executable modules, muestra todos los módulos que utiliza el programa debuggeado, el propio exe, las librerías que carga, etc.

M: memory map, como su nombre lo indica nos muestra un mapa de la memoria donde está nuestro programa, las dll que utiliza, etc.

T: threads, nos muestra los hilos de ejecución que utiliza nuestro proceso (esto lo vamos a ver luego con mas detalle)

W: windows, nos muestra las ventanas que tiene abiertas el programa

H: handles, son los manejadores que utiliza nuestro programa (también lo vamos a ver bien mas adelante)

C: cpu, la pantalla principal del Olly

/: patches, muestra los parches que se aplicaron al programa

K:  call stack of main thread, muestra los distintos calls a los que vamos entrando

B: breakpoints, nos muestra los distintos breakpoints que hemos puesto en nuestro programa (lo que hacen es interrumpir la ejecución y darle el control al debugger)

R: references, nos muestra las referencias cuando realizamos alguna búsqueda

Bien ahora configuraremos nuestro debugger de tal forma que se nos haga mucho mas comodo trabajar con él, para los que ya han tomado clase conmigo en el área de cracking de la certificación ya les será mas fácil hacer todo este procedimiento ;), para los que no, les explico vamos a la pantalla “disassemble” y damos click derecho nos aparecerá un menú en el cual haremos lo siguiente:

9

Bien esto es para que nos remarque con colores algunos saltos condicionales, incondicionales y llamadas, y quedara algo asi:
10


Lo que están remarcados como les explique son algunos saltos condicionales e incondicionales como los son (JNZ, JE, JMP,etc), también se han remarcado las llamadas (call). Lo que sigue es en el menú “options” del debugger modificar lo siguiente:

11


Esto es para que tengamos un cómodo control de a dónde se dirige el flujo del programa, mostrándonos una flecha al estar encima de algún salto condicional también nos indicara si el salto será tomado o no, algo como esto:


12
Creo que por ahora hemos terminado la parte del laboratorio y configurar las primeras y mas importantes herramientas (aunque despues en el transcurso agregaremos otras mas), les advierto que la segunda y tercer parte son las mas intensas y  pesadas de todo el curso, ya que trataremos temas como lenguaje ensamblador, estudio de la cabecera PE, estructura de los binarios, y conceptos de windows y demas detalles que son muy interesantey esenciales pero a veces un dolor de cabeza si no nos gusta leer. Aproximadamente para la cuarta parte en adelante estaremos entrando de lleno a programar nuestro primer bicho! metodos de inyeccion  y conceptos basicos de cifrado.