Karpoff Spanish Tutor

Programa: NexENCODE 3.02


 

PROTECCION: Name / Serial
Descripcion: Bonito paquete de funciones para los MP3, aunque bastante mal programado y con una (des)proteccion de risa
Dificultad: Aficionado
DOWNLOAD: http://www.team-nexgen.com
Herramientas: SmartCheck 6.03 + APIS32 2.5 (+ Visual Basic para el KeyGen, opcional)
CRACKER: zerU FECHA: 27/06/2001

 

 INTRODUCCION

Las pocas experiencias que he tenido con el Visual Basic (des del punto de vista del cracker) han sido muy productivas. Los programadores (mas basicos que visuales) tienen la imaginacion de una cebolla, aunque a la hora de inventarse un algoritmo les salen las paranoias mas paranoicas. El fruto de mis investigaciones es este:

- Las funciones Xor y Hex son muy usadas, ya que son reversibles y les hace gracia a los programadores. Tambien usan mucho cambinaciones raras de letras (les gusta mucho el ASCII) y numeros.

- A menos que el programador haya leído este tutorial, lo que hacen es crear una llave y compararla con un dato que hayas introducido, con lo que solo revisando el codigo y pensando un poco, se puede sacar el SN.

 

 AL ATAKE

Antes de todo, quiero avisar que no sirve de nada petar este programa, ya que por si solo es gratis... Esto encarna el espiritu de un autentico Reverse Engineer!

Midiendo Fuerzas

Si por casualidad descubres que boton abra la ventana de opciones (una ayuda: es el azul gordo de la parte inferior izquierda de la "ventana principal"), veras que hay la opcion Register. Seleccionandola, nos aparece el tipico cuadro donde puedes introducir el nombre y un SN (en este caso pone Password). Puedes comprovar que, poniendo cualquier cosa (en mi caso "zerU" y "147258369") te avisa de que lo has hecho muy, pero que muy mal. Pero aun no sabe que solo estabamos rcogiendo pistas.

Abriendole las entrañas

Es la hora del SmartCheck! Este fabuloso ingenio de la nunca decepcionante casa NuMega. Una vez lo hayas cargado, le das al Open (menu File) y eliges a nuestro amigo (NexENCODE.exe). Luego, le das al Start (en el menu Program) y puedes ver como el "objeto en cuestion" va cargando librerias (DLLs) y controles (OCXs). Estos ultimos los puedes usar tu mismo en tus programas. Por ejemplo, el MP3ENC.ocx esta claro que sirve para codificar MP3, y el MP3PLAY.ocx te puede servir para reproducirlos. Pero, volviendo al tema, podemos ver como, si ya habias introducido un nombre y un password antes, te recuerda que LO HAS HECHO MAL! Si te lo recuerda, es que se habia guardado los datos, y como es poco probable que guarde en algun lugar la opcion "EstoyRegistrado = FALSO", sera que vuelve a cargar los datos y los comprueva (si has llegado hasta aqui y me has entendido, no necesitas este tutorial ;-) ). En el caso contrario (si no te avisa de nada sobre el password), tienes que volver a ir a opciones, register, ...

Una vez hayas hecho alguna de las dos cosas, cierra el programa (para que no entre el viento, ja ja) para que el SmartCheck (a partir de ahora SM, que me canso de escribir) acabe su informe. Y cuando esto haya pasado, te recomiendo que filtres el resultado, de la siguiente manera: eliges la opcion Specific events (menu View) y solo dejas marcadas las opciones 2, 3 y 4 de la lista. Asi el SM nos enseñara solamente lo que nos interesa. Una vez filtrado, le das al Find (menu Edit) y pones "Msgbox" (si sabes algo de Visual Basic, sabras que es la funcion que se encarga de mostrar mensajitos pesaos). Le das al Find Next hasta que aterrizes en un Msgbox en el que ponga "NexENCODE studio colud not register... bla bla bla" (el que nos habia mostrado antes).

Ahora, si el nombre que habias puesto tenia 5 o menos caracteres, sigue leyendo. Si tenia 6 o mas, adelanta hasta el capitulo 1-0 (esto parece el MonoPoly).

Buscando el tamaño adecuado

Encima del Msgbox puedes ver como hay la instruccion Len. Esta se encarga de medir cadenas de texto. En mi caso, como habia puesto "zerU", la instruccion habia devuelto como resultado 4 (puedes ver tu resultado). Bien, como no hay ningun tipo de comprovacion excepto este, sera que el programa primero comprueva el tamaño del nombre, y si no le gusta directamente te muestra el mensaje de error. Como no pasamos ni de la primera comprovacion, no podemos ver las otras... asi que tendremos que "adivinar" el tamaño que quiere este pesao.

Esto lo vamos a hacer con el APIS 32, un invento que se encarga de registrar las APIS que usa un programa. Mas adelante veras porque. Bien, abrimos el APIS (por ahi corre un tutorial sobre como petarlo), en el cuadro "Examining Application" seleccionamos a nuestro objetivo y le das al "Imports", para cargar la funcion del programa que se encarga de medir el tamaño de una cadena de texto: vbaLenBstr . Ahora le das al Run, en la ventana que aparece eliges la libreria MSVBM60.DLL (la que usan los programas Visual Basic 6.0) y luego le das al pause, porque de momento no nos interesa lo que hace el programa.

Una vez el programa este cargado, abres (otra vez) la ventana de opciones, vas al Register y desmarcas el boton Pause del APIS. Le das al boton "Register" del NexENCODE y en el APIS aparecera una referencia a la fucnion vbaLenBstr (que devuelve, en mi caso, 4), pero que simplemente no hace nada mas (como no habia pasado antes!). Pues bien, añadimos un caracter (yo puse "zerU*") y volvemos a darle al Register. Ahora, como es logico, la funcion vuelve a aparecer y devuelve 5, pero continua sin hacer nada mas! A la tecrera va la vencida, o sea que añadimos otro caracter (ahora ya tengo "zerU**") y le damos (por enesima vez) al Register. UN MOMENTO! Ahora, ademas de registrar el vbaLenBstr, salen mogollon de funciones mas! Por fin, hemos dado con el tamaño adecuado, que seguramente es 6 o mas grande. Ahora simplemente tienes que volver a registrar los movimientos del amigo Nex con el SmartCheck, pero con un nombre un poco largo (6 o mas caracteres) y volver a buscar la funcion Msgbox que nos dio la pista.

1 - 0

Esta vez podras comprovar que encima de la Msgbox estan las instrucciones que realizan los calculos para generar el password:

Resultado en el SmartCheck

Traduccion al cristiano

NexENCODE_1.gif (8394 bytes)

Devuelve el tamaño de nuestro nombre (zerU**)

Devuelve el tamaño de la llave que usa para hacer el password (pickles)
Coge el primer caracter de "pickles", o sea, "p"
Saca el valor ASCII de ese caracter (p), que es 112
Lo convierte a numero, ya que lo tenia en forma de texto
Coge el segundo caracter de "pickles", o sea, "i"
Saca el valor ASCII de ese caracter (i), que es 105
Lo convierte a numero, ya que lo tenia en forma de texto
Coge el tercer caracter de "pickles", o sea, "c"
Saca el valor ASCII de ese caracter (c), que es 99
Lo convierte a numero, ya que lo tenia en forma de texto
Coge el cuarto caracter de "pickles", o sea, "k"
Saca el valor ASCII de ese caracter (k), que es 107
Lo convierte a numero, ya que lo tenia en forma de texto
Coge el quinto caracter de "pickles", o sea, "l"
Saca el valor ASCII de ese caracter (l), que es 108
Lo convierte a numero, ya que lo tenia en forma de texto
Coge el sexto caracter de "pickles", o sea, "e"
Saca el valor ASCII de ese caracter (e), que es 101
Lo convierte a numero, ya que lo tenia en forma de texto
Coge el septimo caracter de "pickles", o sea, "s"
Saca el valor ASCII de ese caracter (s), que es 115
Lo convierte a numero, ya que lo tenia en forma de texto
Devuelve el tamaño del SN que hemos puesto (147258369)

Pues este rollazo solo era para crear un peazo numero juntando todos los valores ASCII que ha sacado antes (resaltados en blanco), o sea, que da como resultado 11210599107108101115 no esta mal, eh? (a partir de ahora me referire a este numero como "llave rara", ok?). Luego, empieza a hacer cosas raras de verdad. Esta vez abreviando:

Resultado en el SmartCheck

Traduccion al cristiano
NexENCODE_2.gif (3512 bytes) 1. Saca el primer caracter del la llave rara (1)
2. Le saca el valor ASCII ("1" => 49)
3. Devuelve el tamaño de la llave rara (20)
4. Saca el primer caracter de nuestro SN (1)
5. Esto es un poco largo de contar*
6. Lo pasa de texto a numero
7. Lo convierte en caracter (usando ASCII)

* El valor que habia sacado de nuestro SN lo trata como si estuviese en Hexadecimal y lo pasa a Decimal. O sea, que convierte un numero decimal a decimal (poco tonto, no?  :o) )

Y esto lo hace con todos los caracteres del SN (con el primero del SN y el primero de la llave rara, luego con los dos segundos, etc.).

Y si te fijas un poco (FIJATE!), veras que en el 6º paso tiene un 20 y que, en el 7º, tiene un 37... de donde ha salido el misterioso 37? Pues, como he dicho en la introduccion, simplemente de un XOR con el numero 49 (49 XOR 20 = 37). Este 49 es el valor ASCII del numero que hemos sacado de la llave rara (1 y 2 pasos).

Y todo esto para que? Pues, fijandote en la linea que resaltado en blanco (la 7), ahi esta el resultado de la operacion. Por ejemplo, una vez le ha salido el numero 37, lo pasa a caracter (en ASCII es el "%"). Asi, usando nuestro SN, al programa le ha salido la serie numerica 37, 67, 106, 7 y 57, que en formato de caracteres seria algo asi como "%Cj9". No hace falta ser un hacker para ver que este churro y nuestro nombre ("zerU**") no son iguales. Y dices, ahora que hago? Le pongo ese mismo el mismo SN y como nombre el churro? Es una solucion, pero a mi me gusta dejar la firma.

Lo basico sobre Visual Basic

A menos que hayas experimentado en propia carne los problemitas que acarrea el Visual Basic, te voy a explicar un poco todas las complicaciones del codigo:

- Para que sirve pasar de "texto" a "numero"? Pues bien, la maquina no es muy lista, y no le puedes pedir que divida una A entre una B. Lo mismo con numeros, que aunque tu los veas como numeros, no es lo mismo un 1 (valor 1 en decimal) que un "1" (caracter numero 49 en el ASCII). Asic, el "1" lo pasamos a 1 para poder hacer esto: 1 + 1 = 2.

- Ahora un pequeño resumen de las funcions de Visual Basic: Len devuelve el tamaño de una cadena, de la siguiente manera: "TamañoDeLaCadena = Len (Cadena)"; Mid devuelve un pedazo de un texto, de la siguiente manera: "PedazoDeTextoDevuelo = Mid (Texto, InicioDelPedazo, LongitudDelPedazo)"; Asc y Chr sirven para relacionar valores ASCII con sus correspondientes caracteres: el primero devuelve el valor ASCII de un caracter de la siguiente manera: "ValorASCII = Asc (Caracter)", y el segundo al reves, o sea, que con un valor ASCII devuelve el caracter que le corresponde asi: "Caracter = Chr (ValorDelCaracter)".

Revertiendo a lo Visual Basic

Esta es la parte interesante, cuando tienes al programa desarmado y puedes revertir todo el proceso para crear el codigo. Eso es lo que haremos: haremos los pasos al reves, ya que si el programa coge el SN y se inventa el nombre, nosotros vamos a coger el nombre y nos inventaremos el SN.

Primero, que pasos sigue? Pues bien, mirando el ultimo cuadro que he puesto encima, seguiremos los pasos del 7 al 1 (saltandonos algunos, claro esta)

1. Cogemos el primer caracter del nombre (en mi caso "*zerU*"), o sea, "*", y le sacamos el valor ASCII: 42.

2. Sacamos el XOR (que adivine por pura chiripa!): 42 XOR A = B, donde A es el valor ASCII del primer caracter (o segundo, tercero... depende del caracter en que estemos del nombre) de la llave rara, o sea el "1", que en ASCII es 49; y la B, por tanto es 42 XOR 49 = 27.

3. Ya que el valor que queremos tiene que estar en Hexadecimal, lo pasamos a Hexadecimal: 27d = 1Bh.

Bien, ahora lo puedes hacer, manualmente, con todos los otros caracteres (zerU*). Pero yo prefiero (soy un pijo) hacerme un KeyGen. El codigo esta en Visual Basic, para hacerle honor al NexENCODE, y es este:

Const Llave As String = "pickles" 'Define la llave para hacer el Password ("pickles")
Dim Nombre As Integer, LlaveRara As Integer 'Define las variables que contendran el nombre y la "llave rara"
Dim Contador As Integer, Password As String 'Define el contador para los bucles el contenedor del password
Dim AscNombre As Integer, AscLlave As Integer 'Define las variables que contendran los valores ASCII

If Len(Nombre) < 6 Then Exit Sub 'Si el tamaño del nombre es mas pequeño que 6, salimos del proceso

For Contador = 0 To Len(Llave) - 1 'Inicia un blucle para crear la "llave rara"
    LlaveRara = LlaveRara & Asc(Mid(Llave, Contador + 1, 1))
Next 'Reinicia el bucle

For Contador = 0 To Len(Nombre) - 1 'Inicia un bucle para crear el password
    AscNombre = Asc(Mid(Nombre, Contador + 1, 1)) 'Saca el valor ASCII del caracter del nombre
    AscLlave = Asc(Mid(LlaveRara, Contador + 1, 1)) 'Saca el valor ASCII del caracter de la "llave rara"
    AscNombre = AscNombre Xor AscLlave 'Realiza el XOR entre los dos valores ASCII
    Password = Password & Hex(AscNombre) 'Va juntando los valores resultantes del XOR
Next 'Reinicia el bucle

Vaya matada! A ver si os pensais que el codigo se copia en colores... :-) Bueno, al finalizar los bucles tendremos el Password almacenado en la variable Password (que original, no?). En mi caso (ya que ya tienes un generador de llaves y decirtelo no sirve de nada) el resultado de "*zerU*" es "1B4B5743651F". Y lo mas bueno es que cuela: el programa te dice que "Thanks for registering!". Si te interesa desregistrarlo, cambia los valores "Name" y "Password" del fichero NexENCODE.ini (que esta en la carpeta del programa) por otros que no sean validos. Si simplemente dejases en blanco los valores, al NexENCODE (que esta muy mal programado...) le cogeria un yuyu y no podrias disfrutarlo. Sobre todo recuerda que esto simplemente sirve para educar, disfrutar y aprender (en este programa especialmente). Si quieres usar el programa para fines "no personales", COMPRALO! Aunque este lleno de fallos, generalmente funciona y me ha hecho mucho trabajo.

Bueno, como dicen en mi tierra: adeu i fins una altra!

zerU

 

Karpoff Spanish Tutor: Pagina dedicada a la dibulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com