CURSO SUSCEPTIBLE A CAMBIOS

-=[Reverse Engineering]=-

 El curso completo para comenzar a crackear:-> Edición Azul

Curso 1b, Teórico, Teórico, y más teórico.

 

Temas: 

0.-Ingeniería Inversa, Introducción
1.-Assembler, Simple y puro
1.2 Estructura de Windows
1.3 Mini - F.a.q
1.4 Resumen
1.5 Compilación
2.-El código ASCII 
3.- Crack, Por fín Práctico 
3.1 Uso de los editores hexadecimales
3.2 Nuevo Dilema
3.3 Resumen del crack
4.- Mini-diccionario práctico de Cracking y Win32Asm 
5.- Recomendaciones 
6.- Mis palabras finales. 

-Ingeniería Inversa, introducción. 

Después de estar flojeando un laaargo tiempo vuelvo a la pantalla grande (je je ... 15 plg?), y con ansias de mejorarme ya que este cursillo lo he escrito enfermo en cama y pensando en Carolina T.(no pienses mal!), y claro... me gustaría dedicar este tutorial especialmente a doña Inés Q.E.P.D :-(

después de este paréntesis vuelvo a lo mio, estoy destinado a ser un monigote de profesor estando enfermo. bueno, en este curso vamos a repasar lo siguiente :

  • Assembler.... Para windows (démosle como caja!)
  • Un poco mas de técnicas.
  • Una paciencia que debe ser interminable :o)
  • Otros esquemas fundamentales del 'reverse engineering'. 
  • Vamos a repasar como escuchar a los Red Hot Chili Peppers(broma).
  • Un pequeño Crack =) =) =) =) =) =) =)
  • Vamos a lo nuestro... cada día es mas... y mas lo que se puede aprender del cracking, por eso creo cada día que estos capítulos se harán interminables. 

    1. - Assembler, Simple y puro 

    Como siempre... debes recordar que todo esto es solo para fines educativos, sin prejuicios ni nada. Asi que toda la información y sitios que te de no tienen la mayor responsabilidad con Maniac ni con Kut  ..¿Alguna duda coyote?....


    1.1 Estructura de Windows ...

    ... una pregunta .. ¿leíste los textos de ensamblador que te mencioné anteriormente? ... posiblemente no, asi que trataré de hacer las cosas más fáciles en esto... y si los leíste o sabes algo de ensamblador para DOS, muy bien :-)

    Vamos a iniciarnos por Windows y sus Dll's ..y a preguntarnos qué es una dll?????????

    Como su nombre lo indica.. hablamos de una Dinamic Link Library(una librería dinámica de enlaces), y tienen un trillar de funciones... vamos a aprender como usar una dll (como programador iniciado), y cómo atacar a una dll (Como cracker desquiziado)...

    Una dll puede ser definida como una librería de donde se sacan funciones a los programas para ser ayudados y no ocupar tanto espacio... mmm ... no creo que me esté explicando bien :

    Tenemos un programa por ejemplo hecho en lenguaje c++, y necesitamos que este programa abra un pedazo de una cadena dentro de un archivo... imagínate que este programa debe sacar de alguna sección de por ejemplo un archivo de configuración INI el nombre de usuario de la persona que está usando el programa ... y en el INI dice así :

    [USUARIO]
    NOMBRE=FULANITO

    Para que el programa tenemos dos opciones:

    a) Crear un código que lea la función (Muy engorroso y imagínate crear un código para cualquier función que necesites!)

    b) Llamar alguna función de algun archivo que lo haga (Aquí le damos en el tongo a las Dll's)

    Las dll's... son como grandes bibliotecas que alojan por así decirse libros, y cada libro tiene su determinada función computacional, por ejemplo un libro crea un archivo, un libro lee parte de un archivo, otro libro borra archivo(s), lee fechas, y miles que se irán aprendiendo de a poco .. estos libros son llamadas FUNCIONES API, claro que no los aprenderemos todos por que son mas de 2000 en unas cuantas dlls.. sino .. aprenderemos las funciones mas importantes.

    Cada función api tiene claramente un rango especializado, o sea, tiene una función específica. Y si buscas dlls en tu equipo, encontrarás bastantes... las más importantes y comunes son :

    c:\windows\system\toolhelp.dll
    c:\windows\system\shell.dll
    c:\windows\system\commdlg.dll
    c:\windows\system\olesvr.dll
    c:\windows\system\olecli.dll
    c:\windows\system\mmsystem.dll
    c:\windows\system\kernel32.dll
    c:\windows\system\user32.dll < Esta especialmente
    c:\windows\system\gdi32.dll
    c:\windows\system\comdlg32.dll
    c:\windows\system\shell32.dll
    c:\windows\system\advapi32.dll
    c:\windows\system\shell232.dll
    c:\windows\system\comctl32.dll
    c:\windows\system\crtdll.dll
    c:\windows\system\version.dll
    c:\windows\system\netlib32.dll
    c:\windows\system\msshrui.dll
    c:\windows\system\msnet32.dll
    c:\windows\system\mspwl32.dll
    c:\windows\system\mpr.dll

    Bien, una vez mas hagamos nuestro trabajo para aprender mas, tomemos la user32.dll y la pasamos al W32Dasm (te acuerdas de esta joyita?) .. una vez desensamblado veremos en el botón (exported functions/funciones exportadas).. este botón se ocupa cuando el objetivo que desensamblamos tiene funciones que se pueden llamar de otros programas ... o sea .. funciones API. ahí podremos observar todos los "libros" que contiene la Dll user32.dll :


    1.2 Mini - F.a.q.

    ¿ Que necesitaremos ?

    Turbo Assembler 5.0, MASM 5 o 6(este lo utilizaremos después)y futuramente quizás NASM.


    ¿ Donde los podemos conseguir ?

    Los podemos conseguir en la página de (Tasm50)Dolphinz(http://personal5.iddeo.es/ret007ow/), o en (Tasm50)CrackStore(http://www.crackstore.com). y el Masm lo puedes encontrar en la página de Hutch's(http://www.pbq.com.au/home/hutch/)


    ¿ Donde podemos conseguir más información ?

    En la buenísima página de nuMIT_or [Kut](http://members.xoom.com/numit_or/asm.html),en la página del proyecto Visual Assembler(http://www2.crosswinds.net/~xiphias/files.html), y por supuesto, en la excelente página de Iczelion(http://win32asm.ownz.com/)


    ¿ Que son TASM, MASM, y NASM ?

    Son Compiladores del código fuente en hecho en Win32asm, hechos para Windows.. ¡Ojo!.. el Compilador de Tasm (turbo assembler) para windows es el compilador tasm32.exe de Tasm50, versiones anteriores son de D.O.S.

    Recordemos que los compiladores son los que convierten de código fuente (Ya sea hecho en C,C++,Pascal u otro cualquier código) a lenguaje de máquina para que esta lo comprenda (exe's, com).


    Ahora ... iremos con la estructura assembler ...

    1.3 Principios y estructuras.

    Bueno, después de estos paréntesis seguiremos con analizar un programa sencillo para Windows :

    ;-------------------*Empieza código*-----------------

    .386
    .MODEL Flat, StdCall

    extrn MessageBoxA : Proc
    extrn ExitProcess : Proc

    .data
    titulo_dialogo db "Tutor 1b [Win32Asm]",0h
    texto_dialogo db "Prueba de cuadro de diálogo MessageBox",0h

    .Code

    Main:

       push 0
       push offset titulo_dialogo
       push offset texto_dialogo
       push 0
       call MessageBoxA
       call ExitProcess

    End Main

    ;-------------------*Termina código*-----------------

    Antes de proseguir te digo que el código fuente de estos ejemplos está en un zip que se puede obtener aquí(MSG_1b.zip), y también en este zip se incluyen 5 ejecutables de la explicación que vendrá a continuación sobre el código.

    Análisis (Hey!. si no entiendes lo que sigue no te preocupes, yo se que te costará, por eso lo repasaré dos veces)

    .386
    Esto le declara al ensamblador que vamos a usar los sets de instrucciones del ensamblador 80386, le podemos poner una 'p' al final (.386p) pero no es conveniente ya que si le ponemos una p estaríamos hablando de instrucciones reservadas de la unidad procesadora central. También se pueden usar .486 y .586, pero lo mas recomendable es .386. Cualquier cosa que empieze por '.'(Punto) Es una directiva o instrucción personalizada hacia el ensamblador. Sé que todo esto puede parecer complicado pero tomemoslo como variables que vamos a dejar fijas siempre =).

    .MODEL Flat, StdCall

    ¿Te acuerdas de las direcciones (por ejemplo :0040147A)? ... En D.O.S resultase que una vez a alguien se le ocurrió que con 64kb de memoria en 16 bits nos iba a alcanzar para todo (64 es un rango ínfimo), pero en Windows no hay que preocuparse por usar 64kb. Windows es un sistema operativo con un sistema de direcciones plano, en vez de tener 64kb Windows usa un carril de 4gb. para las aplicaciones que se ejecuten. Este modelo (Flat = Plano), flat le indica al ensamblador que usará el carril de 4gb. y StdCall le indica al carril de 4gb. como será usada la pila del programa, recordemos que la pila es como el valor tope del momento(la cima de la montaña), y el StdCall manejará las instrucciones de izquierda a derecha y que uno como programador debe dejar equivalente la pila después de cada instrucción que se ejecute.

    extrn MessageBoxA : Proc
    extrn ExitProcess : Proc

    Aquí viene lo difícil, MessageBoxA es una función API de la librería User32.dll, y se tiene que declarar al comienzo que función API deberá ser usada, ExitProcess también, otra función ... pero ¡Atención!.. esto es importante, cuando queramos usar por ejemplo una función API en algún programa, debemos distingir de las mayúsculas y minúsculas, por ejemplo, si queremos usar la función MessageBoxA en Windows95/98 debemos escribir MessageBoxA y no se puede escribir messageboxa .

    .data
    Esta es nuestra locación donde queremos declarar todo lo que vamos a usar en el programa.

    titulo_dialogo db "Tutor 1b [Win32Asm]",0h
    texto_dialogo db "Prueba de cuadro de diálogo MessageBox",0h

    Aquí declaramos nuestras etiquetas, debemos recordar que antes de declarar algo de debe poner db y se debe poner " texto aquí " y de debe finalizar con un ,0h  .

    .Code
    Aquí comienza la programación en sí de Win32Asm, con esto definimos que se empezará a programar

    Main:
    Cada sección en la cual queremos que se ejecute alguna función debemos poner una "etiqueta", en este caso es Main pero eso puede variar según tu gusto =)

       push 0
       push offset titulo_dialogo
       push offset texto_dialogo
       push 0
       call MessageBoxA

    Empezamos con lo difícil... Cada función de las librerías esta específicamente definida, o sea, que cada función tiene un fin. Este función MessageBoxA es proveniente de la librería User32.dll, y sirve para mostrar un cuadro de diálogo. En el zip mencionado anteriormente se encuentran los 5 tipos de MessageBoxes, si observas bien, cada MessageBox tiene diferentes íconos :

     Iconos

    También podemos observar que podemos llamar a una ventana sin íconos :

    MessageBox

    TSi te diste cuenta .. ¿porqué uso a veces MessageBox y a veces MessageBoxA?... El MessageBox es para Windows en 16 bits... Y el MessageBoxA es para Windows en 32 bits.

    Tal como te recomendé antes te dije que descargaras la Win32 Programmers Guide, si no lo hiciste puedes hacerlo en CrackStore(http://www.crackstore.com), esta ayuda contiene las funciones API y cómo utilizarlas.

    Según la Win32 Programmers Guide esta es la definción de MessageBoxA:
     
    La función MessageBox crea, muestra, y opera un cuadro de mensaje. El cuadro de mensaje contiene un título y mensaje definido por la aplicación. Mas cualquier combinación de íconos y botones predefinidos.

    int MessageBox(

    HWND hWnd, // Manejo de la ventana maestra
    LPCTSTR lpText, // dirección del texto en el cuadro de mensaje
    LPCTSTR lpCaption, // dirección del título del cuadro de mensaje
    UINT uType // Estilo del cuadro de diálogo
    );

    Parámetros

    hWnd
    Identifica una ventana maestra de el cuadro de diálogo a ser creado. Si este parámetro es NULO(NULL), el cuadro de diálogo no tiene una ventana maestra del cual dependa.

    lpText
    Apunta a la cadena de texto que se mostrará en el cuadro de diálogo.

    lpCaption
    Apunta al titulo de el cuadro de diálogo que se mostrará.

    uType
    Especifíca un seteo de unos bits que determinan los contenidos del comportamiento del cuadro de diálogo.Este parámetro puede ser una combinación de los siguientes grupos de flags.
    Por si no sabes lo que son los flags .. son como las configuraciones especifícadas que hay que hacer en algo. Un Flag, es como un indicador.
    hay que especificar uno para usarlo en el Cuadro de Diálogo (MessageBox):
    MB_ABORTRETRYIGNORE
    El cuadro de diálogo tendrá los siguientes botones: Abortar, Reintentar, y Ignorar.
     
    MB_OK
    El cuadro de diálogo tendrá el siguiente botón: Aceptar. Que es el predeterminado
    MB_OKCANCEL
    El cuadro de diálogo tendrá los siguientes botones: Aceptar y Cancelar.
    MB_RETRYCANCEL
    El cuadro de diálogo tendrá los siguientes botones: Reintentar y Cancelar.
    MB_YESNO
    El cuadro de diálogo tendrá los siguientes botones: si y no.
    MB_YESNOCANCEL
    El cuadro de diálogo tendrá los siguientes botones: si,no, y cancelar

    Specify one of the following flags to display an icon in the message box:
    Especificar uno de los siguientes indicadores(flags) para mostrar un ícono en el MessageBox:

    Significado de flag
    MB_ICONEXCLAMATION,
    MB_ICONWARNING
    AUn ícono de exclamación aparece en el cuadro de dialogo
    MB_ICONINFORMATION, MB_ICONASTERISK
    Un ícono consistente en una " i " minúscula de información.
    MB_ICONQUESTION un ícono con un signo de interrogación en el cuádro de diálogo.
    MB_ICONSTOP,
    MB_ICONERROR,
    MB_ICONHAND
    Un signo de "PARE" aparece en el cuadro de diálogo.
    Una vez visto lo anterior vamos a distribuir las siguientes propiedades :
    1.- HWND hWnd, // Manejo de la ventana maestra
    2.- LPCTSTR lpText, // dirección del texto en el cuadro de mensaje
    3.- LPCTSTR lpCaption, // dirección del título del cuadro de mensaje
    4.- UINT uType // Estilo del cuadro de diálogo
    .
    1.-   push 0 ; Cero = MB_OK(El predeterminado). Si queremos usar por ejemplo los botones "SI - NO"(MB_YESNO), deberíamos ponerlo así:

    push MB_YESNO

    2.-   push offset titulo_dialogo ; Empuja el titulo de la ventana
    3.-   push offset texto_dialogo ; Lo que va dentro de la ventana, o sea, el texto
    4.-   push 0 ; El Handle, por ahora lo dejaremos así para no complicarnos la vida, no te preocupes de esto aún =)
    ; Llamada a la función MessageBoxA de User32.dll, recordemos que no puede ser messagebox ni algo parecido, debe ser exactamente MessageBoxA
       call MessageBoxA

    Luego tenemos lo siguiente después de MessageBoxA

       call ExitProcess

    Esta es una función API que termina todo un proceso, en este caso el programa y la función MessageBox.

    End Main

    Termina con la etiqueta con que empezamos, o sea, Main:, y a la vez, con el programa.

    Ojalá que hayas entendido lo máximo posible.. si es que no. Ahora se viene el resumen.


    1.4 Resumen.

    .386 ; Usamos el modelo de programación 80386, lo usaremos así siempre
    .MODEL Flat, StdCall ; Usamos el espacio de Windows en memoria (4gb.)
    extrn MessageBoxA : Proc
    extrn ExitProcess : Proc
    ; Especificamos las funciones API que se utilizarán
    .data ; Aqui comienza el espacio donde declaramos la etiquetas que vamos a utilizar y otros "detales" que veremos a futuro
    titulo_dialogo db "Tutor 1b [Win32Asm]",0h ; Título del MessageBox
    texto_dialogo db "Prueba de cuadro de diálogo MessageBox",0h ; Texto contenido del MessageBox
    .Code ; Aquí comienza a programarse, aquí comienza el código fuente
    Main: ; Etiqueta con la que empezaremos, no olvidemos que es opcional el nombre
       push 0
    ; Típo de botón para el MessageBox, 0 = Predeterminado, o sea, solamente el botón "Aceptar"("OK")
       push offset titulo_dialogo ; Empujamos el Valor del Título de la MessageBox
       push offset texto_dialogo ; Empujamos el Valor del Texto de la MessageBox
       push 0 ; El Handle, no lo ocuparemos mucho por ahora.
       call MessageBoxA ; Llamada a MessageBoxA de User32.dll
       call ExitProcess ; Llamada a la función que termina los procesos

    End Main

    ; Termina con la etiqueta que comienza el código, o sea, "Main".

    ¿Esta claro?... al final incluiré un diccionario mini de términos usados en este curso... Cualquier cosa que no se haya entendido por favor Contáctame(Sigrid_mapc@hotmail.com)o postea cualquier duda o consulta que tengas en el siguiente foro :

    Cracking para newbies y todos los grados(http://disc.server.com/discussion.cgi?id=64395) .

    1.5 Compilación.

    Para poder convertir este código en ejecutable, o sea, .exe, debemos usar lo que se llama un compilador, que convierte el código de programación que hemos creado en una estructura que entienda la máquina. En este caso vamos a usar el compilador de Turbo Assembler 5.0 (TASM32) explicado anteriormente en el Mini.F.A.Q:

    Esto debemos hacerlo en DOS, pero en el zip que incluí lo metí en un .BAT para que se faciliten las cosas, imaginemos que nuestro archivo se llama así tutor1b.asm, y que queremos comprimirlo, para esto sería así :

    tasm32 /ml tutor1b

    tasm32 es el compilador incluido en el directorio \bin de el Tasm, la función "/ml" es para que no pase por el linkeo,no te preocupes por esto del linkeo. Una vez terminado este comando nos dará un archivo llamado tutor1b.obj, ahora debemos llamar al linkeador que une todo para compilarlo (no te amargues la vida con el linkeador).

    tlink32 -x /Tpe /c tutor1b,tutor1b,, import32.lib

    Bien, pero necesitamos el archivo import32.lib, ¿Para qué sirve?. ¿Te acuerdas de las siguientes funciones?:

    extrn MessageBoxA : Proc
    extrn ExitProcess : Proc

    Son las llamadas a las librerías DLL, y hay que declararlo en alguna parte, import32.lib contiene las funciones api a ejecutar.:

    Del *.Obj

    Los archivos *.OBJ no nos servirán en cuanto se compile el exe, asi que se eliminan. Para mas información verifica el bat dentro del Zip.


    2. - El Código ASCII 

    Bien, como vimos en el curso anterior, sabemos pasar de Hexadecimal a Decimal, de Binario a decimal, Hexadecimal a Binario, y ahora aprenderemos usar el código Hexadecimal(El más cómodo para nuestros propósitos), con el código ascii, ... pero .. ¿Qué es el código ASCII? ...

    El código ASCII significa American Standard Code for Information Interchange. Y cada carácter tiene su valor propio en hexadecimal, por ejemplo la letra M equivale en hexadecimal a 4D, esto es un byte. Miremos mejor el ejemplo :

    Carácter

    M

    A

    N

    I

    A

    C

    P

    C

    Hexadecimal 4D 41 4E 4D 49 4D 50 43

    ¿Cómo saber los valores de cada letra?

    Los valores son diferentes entre mayúsculas y minúsculas, por eso he incorporado esta tabla que me ha facilitado Mr.Port(Muchas Gracias Bambino!)

    Código ASCII (0 - 127)


    Código ASCII (128 - 255)

    Es importante tener esta tabla a mano, para hacer varias cosas, futuramente nos servirá para hacer Key Generators.


    3 -Crack, por fín Práctico 

    Empezamos una vez mas :-), esta vez elegí este programita por que tiene algo mas que un "salto a cambiar", veamos sus detalles: 

    Nombre : LP Ripper  Tamaño del ejecutable: 650.240 Bytes
    Versión : 3.0.5 Ubicación : Incluído con este curso
    Nombre del ejecutable : Lpripper.exe Tamaño del zip:448 Kb
    Características : Programa que permite copiar los "long plays" a mp3 Protección : Sencilla
    Tiempo estimado : 20 Minutos (Para ayudar a los principiantes) Tipo de protección : Serial*
    Precio : US$20 Limitaciones : 30 Segundos de grabación por pista solamente.
    Herramientas a utilizar : WDasm, Editor hexadecimal, Zen Cracking.

    Empezaremos por usar el programilla, observemos que este programa no tiene ni siquiera un editor de Wav ni un compressor de Mp3, o sea, estamos obligados a comprar unos dos programas mas para que funcione bien este... por favor .. que arrogancia!!!!!.

    Vayamos a los típicos menús, "Help" ... y tenemos dos submenús que dicen "About", "Register","Content & Index".. Vayamos a "Register" ... nos aparece unos cuadros donde escribir nuestro Nombre, Locación y Número de registro, escribamos cualquier cosa, por ejemplo :
    Name : Maniac PC
    Location: Kut
    Registration No: 1234567890

    Demosle a Ok y veamos que nos aparece :


    Arggg!!, este programa me es útil, pero es uno de los mas arrogantes que he visto y que me molesta, otro molesto es el TechFacts,pero vayamos a lo nuestro... Cada vez nos vamos a ir organizando mas... Ahora, para organizarnos tomaremos el LpRipper.exe y le haremos una copia que se llame Cracked.exe, y otra que se llame Lpripper2.exe.. ¿Para qué diras tu? .... Una copia (Lpripper2.exe) será para el W32Dasm, la Cracked.exe será una copia de seguridad por si pasa algo con el LpRipper.exe... Ahora, tomemos nuestra herramienta favorita por ahora, W32Dasm, y desensamblemos nuestro LpRipper2.EXE...

    Ahora, vayamos al botón de Referencias Y busquemos la cadena que nos interesa, "Invalid Registration No", y ... Bingo! .. lo encontramos, démosle doble Click y apareceremos aquí :

    * Possible StringData Ref from Code Obj ->"Invalid Registration No"
    |
    :004806F3 B834074800      mov eax, 00480734
    :004806F8 E80FDDFCFF      call 0044E40C

    Ok, no problema, ahora miremos un poco mas arriba de esto :

    :004806D9 E8BAFEFFFF      call 00480598
    :004806DE 84C0            test al, al
    :004806E0 751B            jne 004806FD
    :004806E2 837DFC00        cmp dword ptr [ebp-04], 00000000
    :004806E6 7415            je 004806FD
    :004806E8 6A05            push 00000005
    :004806EA 668B0D28074800  mov cx, word ptr [00480728]
    :004806F1 B201            mov dl, 01

    * Possible StringData Ref from Code Obj ->"Invalid Registration No"
    |
    :004806F3 B834074800      mov eax, 00480734
    :004806F8 E80FDDFCFF      call 0044E40C

    Ok, no problema, ahora miremos un poco mas arriba de esto, nada, no tenemos ninguna cadena que nos diga que esto proviene de un salto. Solo tenemos esto :

    cmp dword ptr [ebp-04], 00000000
    je 004806FD
    push 00000005
    mov cx, word ptr [00480728]
    mov dl, 01

    Aqui viene explicar los flags de activación, he remarcado esto : cmp dword ptr [ebp-04], 00000000,en este caso el flag de activación será cero, los flags de activación son como un interruptor, por ejemplo, Si es Cero, no esta bien (0=ERROR), si es uno, esta Bien (1=Prosigue), en la ingeniería inversa, se pueden usar de esta manera :

    0= NO REGISTRADO
    1= REGISTRADO =)

    Esto también puede ser al revés, o sea, uno no es registrado, cero lo es, pero en el caso de este programa es así, y si explicamos bien, este es un esquema importante en el cracking. Y tengo que explicar otro:

    En el curso anterior expliqué que la mayoría de las veces había que verificar la siguiente cadena

  • * Referenced by a (U)nconditional or (C)onditional Jump at Address: <- ¿RECUERDAS?
  • En este tutorial vamos a hacer algo diferente, vamos a ver si es que existe algún tipo de salto antes del error

     

    :004806D9 E8BAFEFFFF      call 00480598
    :004806DE 84C0            test al, al
    :004806E0 751B            jne 004806FD
    :004806E2 837DFC00        cmp dword ptr [ebp-04], 00000000
    :004806E6 7415            je 004806FD <- Observa BIEN!!
    :004806E8 6A05            push 00000005
    :004806EA 668B0D28074800  mov cx, word ptr [00480728]
    :004806F1 B201            mov dl, 01

    * Possible StringData Ref from Code Obj ->"Invalid Registration No"
    |
    :004806F3 B834074800      mov eax, 00480734
    :004806F8 E80FDDFCFF      call 0044E40C

    Tenemos lo siguiente.. Se comprueba si estas registrado(cmp dword ptr [ebp-04], 00000000)Y si es igual  (Flag a CERO), salta leejos y evita el error, que tal si hacemos lo siguiente: "Comprueba si esta correcto (cmp dword ptr [ebp-04], 00000000) y salta si no es igual, vamos a cambiar un byte :

     

    :004806D9 E8BAFEFFFF      call 00480598
    :004806DE 84C0            test al, al
    :004806E0 751B            jne 004806FD
    :004806E2 837DFC00        cmp dword ptr [ebp-04], 00000000
    :004806E6 7
    515            jne 004806FD
    :004806E8 6A05            push 00000005
    :004806EA 668B0D28074800  mov cx, word ptr [00480728]
    :004806F1 B201            mov dl, 01

    * Possible StringData Ref from Code Obj ->"Invalid Registration No"
    |
    :004806F3 B834074800      mov eax, 00480734
    :004806F8 E80FDDFCFF      call 0044E40C

    Ok, para cambiar los bytes voy a explicar como usar los editores hexadecimales (lo que tanto han pedido por email), pero para eso, necesitaremo saber el OFFSET de la instrucción, y para eso usaremos nuevamente WDASM:

     
    Para saber el OffSet, necesitamos situar el teclado sobre la instrucción en la cual queremos saber el OffSet:

     

    Si eres observado de seguro que lo habías visto antes, si no, te explico, en la barra inferior del Wdasm observa lo siguiente :

    Aja!, esta es toda la magia del Offset, si nos ponemos a hablar en términos teóricos nos complicaremos con matemáticas y eso no queremos.. ¿Cierto?, asi que dejemoslo así : PREGUNTA, ¿POR QUE OMITÍ LOS "000" Y LA "H" DEL OFFSET?, solamente hay que preocuparse del número marcado en rojo(7FAE6)ya que los ceros son notaciones para que los entienda el desensamblador y la "h"  significa Hexadecimal, o sea, el número está en Hexadecimal.

    Con esta información un poco mas adelante enseñaré a usar tres editores hexadecimales: UltraEdit, HexWorkshop,Hacker's View(Hiew).


    3.1 Uso de los editores Hexadecimales.

    USO DE HACKERS VIEW (HIEW)

    Corramos el ejecutable de Hackers View, y tenemos una pantalla donde nos aparecen una serie de archivos. Vayamos al directorio donde se encuentra instalado el LpRipper y abramos directamente el ejecutable(Lpripper.exe),con un enter sobre el EXE, bien, aparece una información bien poco legible, pero si presionamos F4 nos da tres tipos de usos,'Text - Hex -Decode', y elijamos Decode,mmmm.. nos aparece algo familiar.. pero nosotros queremos modificar el byte, y para eso presionaremos F5 que sirve para ir al Offset, y introduzcamos nuestro lindo offset 7FAE6, ... un enter y que aparece ... MmM... esto se pone bueno =)

    .004806E6: 7515          je .0004806FD -------- (1)

    En este momento presionaremos F3 que sirve para EDITAR una sección, en este caso la sección que estamos viendo, ESTAMOS EDITANDO, cambiemos ese feo je por un jne (Cambiando el 75 por un 74), y una vez hecho presionemos F9 para guardar los cambios hechos, una vez hechos presionemos ESC para salir del programa


    USO DE Hex WorkShop (cualquier versión)

    Corramos Hex WorkShop,y abramos nuestro lpripper.exe,... vayamos al menú edit(editar) y a la sección GOTO(Ir a..) y dejemos las configuraciones así :

    Luego en el Offset pongamos nuestro OffSet 7FAE6, y caeremos justamente en la línea Hexadecimal que dice 7415, cambiemos ese 7415 por un 7515 y guardemos el Exe.


    USO DE UltraEdit 6.x o 7.x

    Corramos UltraEdit,y abramos nuestro lpripper.exe,... vayamos al menú Search(buscar) y a la sección Goto Line/Page(Ir a línea/página..) y le ponemos así : 0x7FAE6,no te preocupes por el 0x, ponselo para ir al offset y así modificar el byte... y guardarlo =) :


    3.2 El nuevo dilema.

    Una vez guardado, ejecutemos el programa y pongamos cualquier serial y número, demosle "Ok", y bien .. pasó de largo y aceptó el serial,... vamos ahora a ver como nos quedó nuestro serial. vamos al menú "Help". y en "About", de seguro deberíamos ver nuestro nombre diciendo "Licensiado a tal :", en la mayoría de nuestros casos... pero... pero .. ¿Qué pasó?

    El perro bastardo nos dice "Trial Version", es como decir "No me puteaste bien".... no me gusta nada eso.. Vayamos de nuevo al W32Dasm y veamos si se puede hacer algo al respecto. Veamos las Referencias.. No aparece nada diciendo Trial Version pero aparece una cadena que dice Trial, seamos intrusos y veamos que es :

     

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0045371C(C)
    |
    * Possible StringData Ref from Code Obj ->"Trial"
    |
    :00453766 BADC374500      mov edx, 004537DC
    :0045376B 8B86DC020000    mov eax, dword ptr [esi+000002DC]
    :00453771 E8B691FDFF      call 0042C92C

    * Possible StringData Ref from Code Obj ->"Version"
    |
    :00453776 BAEC374500      mov edx, 004537EC
    :0045377B 8B86E0020000    mov eax, dword ptr [esi+000002E0]
    :00453781 E8A691FDFF      call 0042C92C

    Es Increíble.. ¿Verdad?, como nos dejan a las puertas del cielo como diciendo 'Aquí estoy'... Bueno, vamos al salto de donde proviene y 0045371C y veamos que aparece:

     
    :0045371A 84DB       test bl, bl
    :0045371C 7448       je 00453766 <- "EL" Salto
    :0045371E 8D55FC     lea edx, dword ptr [ebp-04]
    :00453721 A1C8224800 mov eax, dword ptr [004822C8]

    Ok, probemos cambiando este je por un jne, busquemos el Offset de esta dirección, resulta que es el 52B1C, hagamos los cambios correspondientes y veamos que sucede :


    Listo, hemos revertido exitosamente LP Ripper 3.0.5.

    3.3 Resumen del Crack.

    Empezamos con ver que mensaje de error proveniente tenía, resúltase que era "Invalid Registration No", encontramos la cadena con W32Dasm y encontramos que antes del error había un salto que evitaba que llegase al error,(je 004806FD proveniente de la dirección 004806E6 en el offset 7FAE6), invertimos el je por un jne. 2º problema, no nos dice que estamos registrados, sino que 'estamos en la versión Trial', buscamos la cadena Trial Version y solo se encontró Trial, pero era la correspondiente, vimos que provenía de un salto (je 00453766 que provenía de la dirección 0045371C con el Offset 52B1C), invertimos correspondientemente el salto y probamos el ejecutable, todo resultó ok. =) =) =)

    4 -Mini-Diccionario Práctico de Cracking y Win32asm 

    Handle: Manipulación de un programa en ejecución. (no lo veremos mucho hasta la próxima). 
    Push: Comando de assembler por el cual se empuja un comando o algun valor, registro, etc. A la memoria temporal, pero esta memoria temporal será la primera que se tome hasta que use otro push.
    Call: "Llamada", a través de este se pueden llamar a funciones API de Windows(en Win32Asm). 
    MessageBoxA: Función de la librería donde se muestra un cuadro de diálogo con iconos si se apetece. 
    Flag: Se puede definir como un "indicador", o sea, un flag es una referencia de algo. 
    OffSet: La dirección REAL de memoria. 
    Handle: Manipulación de un programa en ejecución. (no lo veremos mucho hasta la próxima). 
    .386: Modelo del ensamblador 80386. 
    MODEL FLAT, stdcall: Carril de 4gb. Planos de memoria. 
    .data: Donde se pone todo el contenido de un código en asm para empezar a trabajar luego en el code. 
    .code: Donde se empieza a trabajer el código
    ExitProcess: Función API que sale de el proceso. . 
    Compilador: Programa que convierte del código fuente a lenguaje de máquine. 
    API: Funciones de las librerías dinámicas. 
    ASCII: American Standard Code for Information Interchange. 
    DLL: Dinamic Link Library (Librería dinámica de enlaces), estas contienen las APIS.. 

    Se me acabaron las ideas, cualquier otro término que conozcas y que crees que esta apropiado para este curso y para las definiciones por favor hazmelo saber (Sigrid_mapc@hotmail.com). 

    5 -Recomendaciones 

    Una recomendación importante: Soy humano, cometo errores, hice este manual mientras estaba enfermo, si crees que falta algo por explicar o me equivoqué en algo hazmelo saber, si quieres dar las gracias(Lo que hace que siga haciendo manuales y que esto valga realmente la pena), recomendaría que buscaras e intentaras aprender Win32Asm, busca manuales , o puedes postear en el foro cualquier duda de programación/cracking/win32asm que quieras en este foro de newbies(http://disc.server.com/discussion.cgi?id=64395),o trata de buscar otros manuales para ver otras cosas, recomiendo los de karpoff(http://welcome.to/karpoff), en el curso dos hablaremos sobre el uso y como atacar con SoftICE![Hot!] : 

    Donde encontrar herramientas : 

    http://reversing.is-here.net 
    http://enginetools.tsx.org
    http://w3.to/protools
    http://kut.tsx.org
    http://www.crackstore.com
    http://www.suddendischarge  

    6 -Mis palabras finales =) 

    SE lo que piensas, así que mueve tu tras-0 y manda un mail con preguntas (solo para ayudar a la labor, no aceptaré hazme cracks ni tipos así) o con mis posibles errores, ya que cualquier cosa que no se entienda y me manden un mail, los ayudaré cambiando este curso y agregando temas, perdon por esta version errónea, pero todos somos humanos, todos podemos meter la pata alguna vez ..,

    Salu2 a :

    nuMIT_or, Henry, Retevision, a todo el resto que me ha consultado(a todos!), a los que tuvieron paciencia al esperar mis respuestas, a TNT!,xasx, SkUaTeR(:-), karpoff, KarlitoxZ(eres grande!), WkT! en general, Mr.Port, Carota T(especialmente), T.L, y al resto del cual me olvidé! . 

    ¡H A S T A   L A   P R O X I M A! :-) :-) :-)

    Maniac PC 

    Sigrid_mapc@Hotmail.com  

    Kr@cKerZ United Team 2000 

    Kayut99@Hotmail.com  


    http://kut.tsx.org 

    http://kut.da.ru 

    http://kut99.cjb.net 


    *Fin del documento*

     

    www.000webhost.com