~ Creando un Crypter en Visual Basic By ANYDOOM ~
Vamos a crear un crypter en visual Basic para aqullos que no lo conoscan o no sepan como se hace empezemos por saber que es un crypter, que hace y como funciona:
- Un crypter es una aplicación capaz de proteger a un fichero ejecutable para evitar su descomposición y/o depuración. Lo proteje encriptando el original y dejando una referencia a el en el Stub (Ya veremos que es), asi al ser ejecutado se abre primero el Stub, y luego este con la referencia al ejecutable original, lo desencripta y ejecuta.
- Pues ¿Como funciona? Al elegir el ejecutable que se quiere proteger el crypter se dedica a buscar su Stub, un Stub es un fichero ejecutable que es configurado por el crypter para saber a que fichero debe hacer referencia, y como lo debe desencriptar. Por lo general el Stub lo hacen pasar por librería o por ficheros .dat o .exe para esconderlo un poco, pero a la hora de unirlo a un fichero encriptado, se transformara de nuevo en un .exe asi que una vez que el crypter encontro el Stub, le pasa los datos necesarios y lo antepone a los bits encriptados del fichero ejecutable original asi pues queda un solo fichero .exe con unos kb de mas por lo general cerca de 20 o 30 por ultimo cuando se ejecute el fichero encriptado el stub buscara los bits correspondientes al fichero original los tomara y los desencriptara generando un fichero temporal con extencion .exe (correspondiente al fichero original) y lo ejecutara sin ser detectado.
Ahora A Construir El Crypter

Comenzemos Por Su STUB n___n
Lo primero que haremos sera crear un proyecto nuevo en VB (Obviamente una aplicación). Guardamos el proyecto como “Stub” y luego le modificamos las propiedad Visible del formulario y le ponemos False.
Ahora ps debemos programarlo para que al ser ejecutado, busque el comienzo de bits encriptados y los lea hasta su fnal, para luego desencriptarlos, copiarlos a un archivo temporal de tipo ejecutable y ejecutar dicho archivo temporal.
¿Cómo lo haremos? No te preocupes que te hire guiando, de todas formas veamos mas detalladamente lo que necesitamos hacer:
1. Copiar el archivo en el que se esta ejecutando el Stub a un archivo temporal con formato “dat”.
2. Abrimos de forma binaria el fichero .dat y buscamos el comienzo de bits encriptados.
3. Leemos desde el principio de bits encriptados hasta su final.
4. Almacenamos los bits encriptado en una variable
5. Desencriptamos los bits de la variable, los bits desencriptados se reemplazaran a los bits encriptados de dicha variable.
6. Se crea un fichero de forma binaria.
7. se le aplican los bits desencriptados y le agregaremos al final una “firma”
8. Usamos la sentencia “Shell” para ejecutar el archivo temporal
9. Si no se produjo ningun error, nos cerramos y eliminamos el fichero .dat que habiamos creado al principio.
Antes que nada hay que decir que es sumamente importante que comenzemos desde el sub Form_Load o desde un sub Main si estas trabajando en un modulo. Ahora si comenzemos!
Bueno ahora veremos el codigo del Form_Load, veran varias funciones que no las eh mencionado, lo cual hare luego de que analicen el codigo del ejecución del formulario:
'Declaracion global que almacena la ruta completa del _
fichero DAT
Dim FicheroDAT As String
'Declaracion global que almacena la ruta completa del _
fichero Ejecutable.
Dim FicheroEXE As String
‘Declaracion global que almacena los bits desencriptados
'Cuando se ejecute el fichero.
Private Sub Form_Load()
'Llamamos a la funcion CopiarParaLeer que nos copia a un _
fichero .dat
SiError1 = CopiarParaLeer(App.Path & "\" & App.EXEName & ".exe")
If SiError1 = False Then: Exit Sub: MsgBox "Se ah producido un error en la apertura.", 0, App.EXEName
'Llamamos a la funcion que lee y almacena los bits encriptado _
en una variable y los desencriptamos.
SiError2 = LeerlosAlmacenarlos(FicheroDAT)
If SiError2 = False Then: Exit Sub: MsgBox "Se ah producido un error en la apertura.", 0, App.EXEName
'Llamamos a la funcion que crea un fichero temporal que contendra _
los bits encriptados.
SiError3 = CrearloMarcarlo
If SiError3 = False Then: Exit Sub: MsgBox "Se ah producido un error en la apertura.", 0, App.EXEName
'Ejecutar el fichero ejecutable temporal..
SiError4 = EjecutarloAhora
If SiError4 = False Then: Exit Sub: MsgBox "Se ah producido un error en la apertura.", 0, App.EXEName
'Eliminamos el fichero DAT y nos finalizamos
Kill FicheroDAT: End
End Sub
La primera funcion que veremos y explicaremos sera la primera a la que se llama: “CopiarParaLeer”. Como veran, a esta funcion le estamos pasando un parámetro: “App.Path & “\” & App.EXEName & “.exe”” lo que corresponde a la ruta del fichero ejecutable al que contenemos encriptado. Pero luego hacemos una verificación para saber si esta funcion nos devolvio “False” es decir que devuelve un valor booleano. Este valor correspondera a si se produce algun error. Entonces la funcion se declararia de esta forma:
Private Function CopiarParaLeer(MiRuta As String) As Boolean
End Function
Bueno, ya la tenemos declarada, ahora le daremos un proposito en esta aplicación que sera copiar el fichero actual a otro fichero en el directorio temporal con un nombre aleatorio numerico (puede ser tambien con letras, lo explicare al final del articulo). Así que comenzemos, la unica funcion que cumple es de “FileCopy” y le agregaremos algunas cosas necesarias mas
Private Function CopiarParaLeer(MiRuta As String) As Boolean
‘Declaramos las variables
Dim n% as integer, i as integer
Dim FSO as Object
'Si se produce algun error salta a la etiqueta "NoCopio"
On Error GoTo NoCopio
'Creamos objeto FileSystemObject para obtener el directorio _
temporal (FSO.GetSpecialFolder(2))
Set FSO = CreateObject("Scripting.FileSystemObject")
'Activamos randomize para que VB sepa que vamos a crear una _
funcion que corresponde al "azar"
Randomize
'La variable "n%" va a contener un nombre al azar para _
la copia, dicho nombre tendra 5 numeros:
For i = 1 To 5
't va a tener un numero al azar del 0 al 9
t = Int(Rnd * 9)
n% = n% & t
Next i
'Nos copiamos al directorio temporal con un nombre aleatorio.
FileCopy MiRuta, FSO.GetSpecialFolder(2) & "\" & n% & ".dat"
'Si todo anduvo bien (porque llegamos a esta linea) _
debovemos trae y almacenamos el fichero DAT en variable
CopiarParaLeer = Trae
FicheroDAT = FSO.GetSpecialFolder(2) & “\” & n% & “.dat”
'Terminamos el sub
Exit Sub
'Escribimos la etiqeta NoCopio
NoCopio:
CopiarParaLeer = False
Exit Sub
End Function
Muy bien, hasta aquí ya hemos copiado el fichero para poder leerlo posteriormente y hemos contralo los posibles errores..
Ahora sigamos con la funciona que abrira el fichero dat y obtendra los bits que correspondan al fichero encriptado. Para esto debo explicar que al encriptar el fichero, se puso una marca para separar el Stub del fichero encriptado. En mi caso la marca ah sido “|CodeMakers|” aunque es recomendable usar una marca mas chica ya que cada carácter sera un byte que le agregaremos al archivo

Entonces esta funcion leera el fichero y buscara la marca (|CodeMakers|) , al encontrarla tomara todos los bits que halla desde alli hasta el final de la marca que se indica con la misma marca (|CodeMakers|). Para hacer esta separacion usaremos la funcion “Split”, quedando en el segundo indice (1 ya que el primer indice es 0) los bits encriptados.
Así que a la funcion se le pasa como parámetros el fichero DAT y su declaracion seria:
Private Function LeerlosAlmacenarlos(ArchivoTemp As String) As Boolean
End Function
Lo que debemos hacer es abrir de forma inaria el fichero DAT, y almacenar todo su contenido en una variable a la que llamaremos “Contenido” luego usaremos la funcion Split para separar a lo leido (que esta en Contenido) en dos partes. Dichas partes seran almacenadas en una variable que llamaremos “ContDividido” y sera un array, pero no le daremos un valor la dejaremos con los paréntesis vacios (Dim ContDividido() as String) ¿Se entiende? Espero que si porque no estamos chateando y no te podre escuchar

Asi al utilizar Split, la variable ContDividido se dividira en 2, una con indice 0 y otra con indice 1. La que tiene indice 1 es las que nos interesa, y cambiaremos el valor que tiene la variable “Contenido” por “ContDividido(1)”. Luego debemos desencriptar la variable contenido. Esta variable que tiene los bits desencriptados es la que esta declarada globalmente para que podamos acceder a ella desde otra funcion. Ya que eso es lo que necesitaremos… Comenzemos a codear esta funcion:
Private Function LeerlosAlmacenarlos(ArchivoTemp As String) As Boolean
'Declaramos el array ContDividido
Dim ContDividido() As String
'Si hya error saltamos a la etiquero "Fallo"
On Error GoTo Fallo
'Abrimos el arcihvo DAT de forma binaria
Open ArchivoTemp For Binary Access Read As #1
'Almacenamos en "Contenido" los bits del stub y del fichero original
Get #1, , Contenido
'Cerramos el archivo
Close #1
'Separamos la variable Contenido en dos, segun la marca |CodeMakers|
'y almacenamos cada parte en el array ContDividido
ContDividido = Split(Contenido, "|CodeMakers|")
'Reeplazamos el actual dato de la variable Contenido por los bits del _
fichero original que se encuentran encriptados
Contenido = ContDividido(1)
'Ahora desencriptamos los bits con la funcion t
Contenido = t(Contenido)
'Ya tenemos en la variable global "conenido" los bits desencriptados _
asique ahora devolvemos true a la funcion y temrinamos la funcion
LeerlosAlmacenarlos = True
'Escribimos la etiqueta Fallo
Fallo:
LeerlosAlmacenarlos = False
Exit function
Exit Function
Ahora, como si fueran ramificaciones en una red conceptual estamos viendo otra funcion. La funcion “t” que lo que hace es desencriptar y encriptar los bits. Claro que si estan encriptados los desencripta y si estan desencriptados los encripta, por ello usamos la misma funcion tanto en el crypter como en el stub. La funcion es la siguiente no tiene mucho que explicar ya que no va al tema, simplemente toma uno por uno los caracteres de la cadena pasada y se los encripta con la funcion Xor, pasandolos por el numero 9:
Function t(C)
On Error Resume Next
For i = 1 To Len(C)
t = t & Chr(Asc(Mid(C, i, 1)) Xor 27)
Next i
End Function
Bueno, ya tenemos en la variable Contenido los bits desencriptados, solo nos falta convertir esos bits sueltos en un fichero ejecutable y ejecutarlo.. Para esto tenemos la funcion CrearloMarcarlo con la que tomaremos los bits, se los aplicaremos a un fichero temporal en el directorio Temp que tendra el mismo nombre que nosotros para luego ejecutarlo. A este archivo le agregaremos una firma al final, solo para joder ya que no cambia en nada, pero es como para que quede “Marcado”

(esto no es necesario hacerlo y es algo estupido, así que si quieren no lo hagan).. Bien bien, codiemos la funcion:
Private Function CrearloMarcarlo() As Boolean
'Declaramos variables
Dim FSO As Object
'Si hay error saltamos a la etiqueta "UboError"
On Error GoTo UboError
'Creamos objeto fSO com ya explique para obtener _
el directorio temporal.
Set FSO = CreateObject("Scripting.FileSystemObject")
'Creamos un fichero binario con nuestro mismo nombre _
en el directorio temporal.
Open FSO.GetSpecialObject(2) & "\" & App.EXEName & ".exe" For Binary Access Write As #1
'Le aplicamos los bits desencriptados
Put #1, , Contenido
'Aplicamos firma
Put #1, , "Code-Makers.es"
'Cerramos
Close #1
'Todo salio bien, asique hacemos lo mismo que con las otras
CrearloMarcarlo = True
Exit Function
'Escribimos la etiqueta UboError
UboError:
CrearloMarcarlo = False
Exit Function
End Function
Asi pos ya tenemos mucho jeje, solo nos falta ejecutar el archivo que acabamos de crear en el directorio temporal, y pos eso es lo ultimo, ya que luego se elimina el fichero DAT y nos terminamos con “End” pero eso ya lo hemos puesto en el Form_Load. Así que sigamos ocn la funcion que ejecutara este fichero temporal: EjecutarloAhora. Lo unico que haremos sera utilizar “Shell” para ejecutarlo y ps, lo otro es la creación del objeto FileSystemObject para obtener el directorio temporal y la creación de la etiqueta de error… Come on!
Private Function EjecutarloAhora() As Boolean
'Delcracion de variables
Dim FSO As Object
'Si hay error, bla bla bla
On Error GoTo SiHayError
'Creamos el onjeto FSO
Set FSO = CreateObject("Scipting.FileSystemObject")
'Ejecutamos el fichero
Shell FSO.GetSpecialFolder(2) & "\" & App.EXEName & ".exe", vbNormalFocus
'Lo que hicimos ya, devolvemos true y nos terminamos
EjecutarloAhora = True
Exit Function
'Escribimos la etiqueta
SiHayError:
EjecutarloAhora = False
Exit Function
End Function
Bueno, me eh quedado en el Stub, que ya lo tendriamos que tener terminado, sino no sigas leyendo y terminalo ¬¬
Ahora comenzaremos con el crypter, que es la parte grafia y en la que el usuario eligira un fichero ejecutable qu dece encriptar. Luego debemos abrir ese fichero de forma binaria, tomar sus bits y encriptarlos. Esos bits encriptados se almacenaran en una variable, luego de encriptarlos, copiamos el fichero original tal y ocmo es inclusive con la extencion .exe pero luego le damos una doble extencion y le ponemos .bak (si no te diste cuenta hemos creado un Buck Up del archivo) asi aseguramos el fichero original. Luego basiamos el fichero original que el usuario eligio, y abrimos de forma binaria el Stub. Obtenemos los bits del stub y los aplicamos a una variable. Luego abrimos el fichero que esta vacio (el que eligio elk usuario) y le aplicamos primero los bits del Stub, luego una marca (en mi caso sera |CodeMakers|) y luego los bits encriptados y para finalizar otra marca (en mi caso sera de nuevo |CodeMakers|) aunque esta ultima marca no es necesaria, y yo la pongo solo para dar un modelo grafico de lo que hacemos…
Los controles que utilizaremos seran:
Un TextBox
Un Frame
Un CommandButton
Y debido a que el crypter que aremos es una base para que creen el suyo no agregaremos mas controles. Estos controles los pueden ubicar de la forma que quieran, claro que no hay mucha magia en esto, menos con la cantidad de controles que usamos
Bueno, veran la sencilles de esto, ya que no usaremos un control CommondDialog para elegir el fichero, esto es porque, como les vuelvo a repetir, lo que quiero es que tengan una base para que creen su propio crypter

Comenzaremos con el evento Clic del CommndButton, lo que hara aca el crypter es verificar copiar el fichero elegido a su misma ruta con su mismo nombre y su extencion pero abregandole al final un “.bak”. Como veraz no verifico si existe o no el archivo o si se ah introducido o no algun dato en el textbox, ¿hace falta que te repita porque? ¬¬ ..
Asi ps, ya que hemos creado el Buck, lo que aremos sera obtener sus bits y almacenarlos en una variable a la que llamaremos “BitsOriginal” y luego nos dedicaremos a vaciar el fichero original. Luego abrimos de forma binaria el Stub y obtenemos sus bits, los cuales almacenaremos en una variable llamada “BitsStub” (que original ¿no?

) y luego los bits del fichero que abiamos guardado en la variable “BitsOriginal” los encriptamos. Para finalizar abrimos de forma binaria el fichero que esta actualmente vacio y le aplicamos primero los bits del stub, luego la marca y por ultimo los bits encriptado y una marca final..
Así que dare el codigo del evento clic completo pero cada linea que necesite ser explicada lo estara en un comentario ubicado sobre dicha linea:
Private Sub Command1_Click()
Dim BitsOriginal As String
Dim BitsStub As String
'Cremos el Back Up
FileCopy Text1.Text, Text1.Text & ".bak"
'Obtenemos los bits del fichero y los almacenamos _
en la variable.
Open Text1.Text For Binary Access Read As #1
Get #1, , BitsOriginal
'Cerramos
Close #1
'Vaciamos el fichero original:
Open Text1.Text For Output As #2
Print #2, ""
Close #2
'Obtenemos los bits del stub y los almacenamos _
en su variable correspondiente
Open App.Path & "\Stub.exe" For Binary Access Read As #3
Get #3, , BitsStub
'Cerramos
Close #3
'Encriptamos los bits del fichero original
BitsOriginal = t(BitsOriginal)
'Armamos de nuevo el fichero del usuario:
Open Text1.Text For Binary Access Write As #4
'Le aplicamos el stub
Put #4, , BitsStub
'Le aplicamos una marca
Put #4, , "|CodeMakers|"
'Le aplicamos el fichero encriptado
Put #4, , BitsOriginal
'Le ponemos la marca final
Put #4, , "|CodeMakers|"
'Cerramos
Close #4
End Sub
Beno, yo se que es muy sencillo, ya lo se, pero les sirve para aprende mierda! bueno ps, la funcion para encriptar es la misma que usamos en el stub para desencriptar:
Function t(C)
On Error Resume Next
For i = 1 To Len(C)
t = t & Chr(Asc(Mid(C, i, 1)) Xor 27)
Next i
End Function
Asi Concluye Nuestro Proyecto...
Saludos