Indice :

--Cracking Bussiness Card Design Plus--

--Cracking Labels, Cars & More--

--Cracking Grab-It--

--Cracking LViewPro--

--Cracking Memory Analyst--

--Cracking Six Feet--

--Cracking SmileShell--

--Cracking WinImage Version 2.20--
 

--IR AL MENÚ PRINCIPAL--
 



 

Cracking Businness Card Design Plus

               By
 

                 Vil Roach
 

Este mundo esta lleno de gente estupida e imbecil, y si no me creen, miren este programa y su
fabulosa rutina de proteccion :

Lo desensamblamos y buscamos "be sure", y encontramos esto :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044EFC5(C)
|
:0044F0EF 68FF000000              push 000000FF
:0044F0F4 8D85E4FDFFFF            lea eax, dword ptr [ebp+FFFFFDE4]
:0044F0FA 50                      push eax

* Possible Reference to String Resource ID=18022: "Invalid Registration ID.

Please be sure to enter the ID EXA"
                                  |
:0044F0FB 6866460000              push 00004666

Asi que miramos :0044EFC5, para ver el condicional :

:0044EFBE E8B60C0000              Call 0044FC79
:0044EFC3 85C0                    test eax, eax
:0044EFC5 0F8524010000            jne 0044F0EF
:0044EFCB 8B4324                  mov eax, dword ptr [ebx+24]

y simplemente cambiamos el jne por je, arrancamos el programa ponemos cualquier cosa, presionamos
Ok y sale registrado, nada raro, la prueba de fuego es reiniciar el programa, asi que lo hacemos
y sucede lo increible, el programa sigue regsistrado !, asi que miramos  :

HKEY_LOCAL_MACHINE\SOFTWARE\CAM Development\Business Card Designer Plus V4.0\Register

y encontramos el nombre que pusimos y en el ID una clave totalmente distinta, lo que significa
que el estupido programdor guarda en el registro la clave que el genera y no la que ponemos
nosotros, algo muy estupido en mi opinion !

Guia rapida de crack :  offset 0x3F5C5 = 85 -> 84 y listo !

Ir al indice...


Crackin Labels, Cars & More

                         By

                           Vil Roach

Parece que este programador es mas estupido de lo que parece ya que en su otro program la prote-
ccion es la misma y solo cambia el offset del salto, asi que aqui va otra

Guia rapida de crack : Guia rapida de crack :  offset 0x6AC8D = 85 -> 84 y listo !
 

                              Vil Roach/Trenchcoat Legion - We're just a bored guys

Ir al indice...


Crack Grab-It

     By

       Vil Roach

Antes de describir Grab-It quiero aclarar dos puntos :

1 . El cracking es ilegal segun la mayoria de leyes del estado !.

2 . El cracking es el principio de todo, es quiza la unica oportunidad que tenemos en la vida
    de ver las cosas como realmentes son, libres de engaños y de mascaras, y modificarlas
    para nuestro beneficio, y en un futuro sera quiza la unica forma de que tengamos control
    sobre nuestras vidas y sobre lo que las grandes corporaciones quieren que hagamos.
 

Asi que por estas y mas razones me gusta el cracking !.
 

GrabIt Pro es un buen programa que nos permite capturar imagenes de la pantalla de windows, con
una serie de opciones que mejora las capacidades de captura de pantalla de windows (Prnt Scrn),
resultando muy uitl este programilla para la realizacion de tutoriales o cursos.

La proteccion es la clasica Name/Serial, asi que buscamos "Not a -valid registration " luego de
desensamblar el programa y encontramos :

:004090FC 6A1E                    push 0000001E
:004090FE 68509A4100              push 00419A50
:00409103 6859020000              push 00000259
:00409108 FF7508                  push [ebp+08]
 

* Reference To: USER32.GetDlgItemTextA, Ord:00EDh
                                  |
:0040910B FF15C8064200            Call dword ptr [004206C8]
:00409111 68509A4100              push 00419A50
:00409116 E8CF900000              call 004121EA
:0040911B 83C404                  add esp, 00000004
:0040911E 8945FC                  mov dword ptr [ebp-04], eax
:00409121 6880000000              push 00000080
:00409126 6A00                    push 00000000
:00409128 68509A4100              push 00419A50
:0040912D E876900000              call 004121A8
:00409132 83C40C                  add esp, 0000000C
:00409135 6A40                    push 00000040
:00409137 68509A4100              push 00419A50
:0040913C 6858020000              push 00000258
:00409141 FF7508                  push [ebp+08]

* Reference To: USER32.GetDlgItemTextA, Ord:00EDh
                                  |
:00409144 FF15C8064200            Call dword ptr [004206C8]
:0040914A FF75FC                  push [ebp-04]
:0040914D 68509A4100              push 00419A50
:00409152 E81FFBFFFF              call 00408C76   ; Rutina Z !!
:00409157 83C408                  add esp, 00000008
:0040915A 85C0                    test eax, eax
:0040915C 0F851C000000            jne 0040917E   ' !!!
:00409162 6A30                    push 00000030
:00409164 6828DC4100              push 0041DC28

* Possible StringData Ref from Data Obj ->"Not A Valid Registration Number!"
                                  |

Justamente la pieza de codigo clasica que obtiene lo valores en dos llamda a GetDlgItemTextA y
luego se le pasan como parametro a la Rutina Z la cual seguramente genra el # verdadero y lo
compara con el nuestro y listo. Asi que miramos la rutina  Z:

* Referenced by a CALL at Addresses:
|:004013CF   , :00408B4A   , :00408B91   , :00409152
|
:00408C76 55                      push ebp
:00408C77 8BEC                    mov ebp, esp
:00408C79 83EC28                  sub esp, 00000028
:00408C7C 53                      push ebx
:00408C7D 56                      push esi
:00408C7E 57                      push edi
:00408C7F C745F800000000          mov [ebp-08], 00000000
:00408C86 C745F400000000          mov [ebp-0C], 00000000
:00408C8D C745F000000000          mov [ebp-10], 00000000
:00408C94 C745EC00000000          mov [ebp-14], 00000000
:00408C9B C745E800000000          mov [ebp-18], 00000000
:00408CA2 C745E491990000          mov [ebp-1C], 00009991
:00408CA9 8B4508                  mov eax, dword ptr [ebp+08]
:00408CAC 8945FC                  mov dword ptr [ebp-04], eax
:00408CAF 66C745D80000            mov [ebp-28], 0000
:00408CB5 E904000000              jmp 00408CBE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408D21(U)
:00408CBA 66FF45D8                inc [ebp-28]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408CB5(U)
|
:00408CBE 0FBF45D8                movsx eax, word ptr [ebp-28]
:00408CC2 83F82B                  cmp eax, 0000002B
:00408CC5 0F8D5B000000            jnl 00408D26
:00408CCB 0FBF45D8                movsx eax, word ptr [ebp-28]
:00408CCF 8B4DFC                  mov ecx, dword ptr [ebp-04]
:00408CD2 0FBE0408                movsx eax, byte ptr [eax+ecx]
:00408CD6 8945E0                  mov dword ptr [ebp-20], eax
:00408CD9 8B45E0                  mov eax, dword ptr [ebp-20]
:00408CDC 69C049870100            imul eax, 00018749
:00408CE2 0145F8                  add dword ptr [ebp-08], eax
:00408CE5 8B45E0                  mov eax, dword ptr [ebp-20]
:00408CE8 69C061870100            imul eax, 00018761
:00408CEE 0145F4                  add dword ptr [ebp-0C], eax
:00408CF1 8B45E0                  mov eax, dword ptr [ebp-20]
:00408CF4 69C095860100            imul eax, 00018695
:00408CFA 0145F0                  add dword ptr [ebp-10], eax
:00408CFD 8B45E0                  mov eax, dword ptr [ebp-20]
:00408D00 69C037870100            imul eax, 00018737
:00408D06 0145EC                  add dword ptr [ebp-14], eax
:00408D09 8B45E0                  mov eax, dword ptr [ebp-20]
:00408D0C 69C057870100            imul eax, 00018757
:00408D12 0145E8                  add dword ptr [ebp-18], eax
:00408D15 8B45E0                  mov eax, dword ptr [ebp-20]
:00408D18 69C0D9860100            imul eax, 000186D9
:00408D1E 0145E4                  add dword ptr [ebp-1C], eax
:00408D21 E994FFFFFF              jmp 00408CBA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408CC5(C)
|
:00408D26 8B45E4                  mov eax, dword ptr [ebp-1C]
:00408D29 0345E8                  add eax, dword ptr [ebp-18]
:00408D2C 0345F0                  add eax, dword ptr [ebp-10]
:00408D2F 0345EC                  add eax, dword ptr [ebp-14]
:00408D32 0345F4                  add eax, dword ptr [ebp-0C]
:00408D35 0345F8                  add eax, dword ptr [ebp-08]
:00408D38 B93DBB0D00              mov ecx, 000DBB3D
:00408D3D 99                      cdq
:00408D3E F7F9                    idiv ecx
:00408D40 8D4201                  lea eax, dword ptr [edx+01]
:00408D43 8945DC                  mov dword ptr [ebp-24], eax
:00408D46 8B450C                  mov eax, dword ptr [ebp+0C]
:00408D49 3945DC                  cmp dword ptr [ebp-24], eax
:00408D4C 0F850F000000            jne 00408D61    'Chico Malo
:00408D52 B801000000              mov eax, 00000001
:00408D57 E90C000000              jmp 00408D68
:00408D5C E907000000              jmp 00408D68

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408D4C(C)
|
:00408D61 33C0                    xor eax, eax
:00408D63 E900000000              jmp 00408D68

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00408D57(U), :00408D5C(U), :00408D63(U)
|
:00408D68 5F                      pop edi
:00408D69 5E                      pop esi
:00408D6A 5B                      pop ebx
:00408D6B C9                      leave
:00408D6C C3                      ret
 

La miramos por encima y vemos un salto (Chico Malo) el cual pone EAX a cero lo cual no nos
conviene asi que cambiamos el jne po je Y :

Listo , papa !

Afortunadamente la funcion que patcheamos era la que se llama siempre que se vaya a verificar el
numero y por eso el programa se inicia registrado y no vuelve a joder la vida

Fin

Guia rapida de crack : Gp50.Exe Offset 0x00814D = 85 -> 84
 

                                       Vil Roach/Trenchcoat Legion - Crack The Planet ;)

Ir al indice...


Cracking LViewPro

                By

                  Vil Roach
 
 

LView Pro es un buen programa para visualizar y editar imagenes y aunque no es tan poderoso como
Paint Shop Pro tiene buenas opciones y filtros. Desensamblamos el programa y buscamo el mensaje
de error, y sale :
 

:0041ED48 8D4C2414                lea ecx, dword ptr [esp+14]
:0041ED4C 83C404                  add esp, 00000004
:0041ED4F 50                      push eax
:0041ED50 51                      push ecx
:0041ED51 E86AFEFFFF              call 0041EBC0
:0041ED56 83C408                  add esp, 00000008
:0041ED59 85C0                    test eax, eax
:0041ED5B 751A                    jne 0041ED77

* Possible StringData Ref from Data Obj ->"User name and ID numbers do not "
                                        ->"match, please verify if name and "
                                        ->"ID# were typed correctly."
                                  |
:0041ED5D 68188F4600              push 00468F18
:0041ED62 56                      push esi
:0041ED63 E82857FEFF              call 00404490
:0041ED68 83C408                  add esp, 00000008
:0041ED6B 33C0                    xor eax, eax
:0041ED6D 5F                      pop edi
:0041ED6E 5E                      pop esi
:0041ED6F 5B                      pop ebx
:0041ED70 81C478020000            add esp, 00000278
:0041ED76 C3                      ret
 
 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041ED5B(C)
|
:0041ED77 8D44240E                lea eax, dword ptr [esp+0E]

Vemos la tipica llamda con dos parametros (ID y NAME) y un salto condicional en base a esta, asi
que cambiamos el condicional, ejecutamo y Listo!

Este es otro de esos estupidos programas en los que el progrtama solo verifica el serial una vez
y escribe el serial que el genero en el registro, DEMASIADO ESTUPIDO .
 

Guia rapida de crack :

Lviewpro.exe  - Offset 0x1E15E = 75 -> 74
 

Nos vemos.
 
 

                                                        Vil Roach/Trenchcoat Legion

Ir al indice...


Cracking Memory Analyst

                    By

                     Vil Roach

Memory analyst es un excelente programa que nos muestra un analisis detallado de nuestra memoria
ram tanto fisica como swap, e incluso nos aconseja como optimizar nuestra RAM, asi que procedemos
a desesamblarlo con el WDasm y a buscar el mensaje de error :
 

:0040615D 83C408                  add esp, 00000008
:00406160 85C0                    test eax, eax
:00406162 744E                    je 004061B2   ' ------>> Chico Bueno
:00406164 6A10                    push 00000010
:00406166 8BCE                    mov ecx, esi

* Possible StringData Ref from Data Obj ->"Password invalid"
                                  |
:00406168 6898354300              push 00433598

* Possible StringData Ref from Data Obj ->"Sorry, this password is not correct. "
                                        ->"Please read and copy carefully "
                                        ->"the user name and password written "
                                        ->"in the mail we sent you."
                                  |
:0040616D 6818354300              push 00433518
:00406172 E817490100              call 0041AA8E

Asi que cambiamos este salto y listo !, increible otro programador mediocre, como sera de medio-
cre que incluso con que pongamos esta linea en el .ini (que esta en la carpeta de windows) :
USERNAME=Jose pepe

Y sin importar si el ejecutable esta parcheado,el programa ya no mostrara el molesto UNREGISTERED

Guia Rapida de crack : Offset 0x5562 = 74 -> 75
 
 

               Another stupid crack by Vil roach/Trenchcoat Legion - Kill your God
                                                                           Kill Your TV

Ir al indice...



 

Crack Six Feet

             By

               Vil Roach

Que mas, bien o que?, mi cordialidad se debe a que estoy contento porque el juego que vamos a
crackear a continuacion es un excelente jueguito y me ha divertido mucho, tiene 50 niveles, e
incluso el formato en el que se guardan los niveles esta en texto plano, por lo tanto si algun
dia me lo permite la redaccion, hare un cursito sobre creacion de niveles para este juego, claro
todo con miras de ir aprendiendo la teoria basica del diseño de videojuegos (algo fascinante) :)

Buscamos el mensaje de error y encontramos :

:0002.076E 46                     inc si

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0002.073A(U)
|
:0002.076F 83FE64                 cmp si, 0064
:0002.0772 7CC8                   jl 073C
:0002.0774 57                     push di
:0002.0775 16                     push ss

* Possible StringData Ref from Data Seg 003 ->"Access Code Incorrect!"
                                  |
:0002.0776 685A22                 push 225A
:0002.0779 16                     push ss

* Possible StringData Ref from Data Seg 003 ->"Access Error"
                                  |
:0002.077A 687122                 push 2271
:0002.077D 6A10                   push 0010
:0002.077F 9AFFFF0000             call USER.MESSAGEBOX

Esta rutina es llamda incondicionalemente desde  :

:0002.072B 6A67                   push 0067
:0002.072D 16                     push ss
:0002.072E 686E2C                 push 2C6E
:0002.0731 6A09                   push 0009
:0002.0733 9AFFFF0000             call USER.GETDLGITEMTEXT
:0002.0738 33F6                   xor si, si
:0002.073A EB33                   jmp 076F

Y el problema es que este mensaje tambien aparece cuando el password que nos dan para los mundos
esta incorrecto, asi que debemos buscar la rutina de registro mas arriba, asi que investigamos el
salto que va al mensaje, y vemos que es incondicional asi que la ebvaluacion se debe llevar a cabo
en :0002.0772 7CC8                   jl 073C, y el cmp si,64 significa que se evalua 64 veces y
para seguramente comparar con todos los passwords de los mundos, asi que debemos buscar otro men-
saje de incorrect e investigar ese :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0002.084C(C)
|
:0002.088F 56                     push si
:0002.0890 16                     push ss

* Possible StringData Ref from Data Seg 003 ->"Access Code Incorrect!"
                                  |
:0002.0891 685A22                 push 225A
:0002.0894 16                     push ss

* Possible StringData Ref from Data Seg 003 ->"Access Error"
                                  |
:0002.0895 687122                 push 2271

Lo encontramos y buscamos el condicional que lo llama :

:0002.0836 688049                 push 4980
:0002.0839 6A0B                   push 000B
:0002.083B 9AFFFF0000             call USER.GETDLGITEMTEXT
:0002.0840 C6068A4900             mov byte ptr [498A], 00
:0002.0845 90                     nop
:0002.0846 0E                     push cs
:0002.0847 E88B59                 call 61D5
:0002.084A 0BC0                   or ax, ax
:0002.084C 7441                   je 088F  ' !!!!!
:0002.084E C7066B490000           mov word ptr [496B], 0000
:0002.0854 C7066D496400           mov word ptr [496D], 0064
:0002.085A 16                     push ss

Cambiamos el condicional por jne y YEES!!, cuando introducimos cualquier numero no sale el mensa-
je y la opcion de registrarlo aparece deshabilitada, preo reiniciamos el programa y se vuelve a
habilitar :( ... si analizamos el codigo anterior nos daremos cuenta que la funcion 61d5 debe
ser la que analiza la gold key, ya que se le pasa un parametro obtenito con getdlgitemtext y
en base a su resultado se hace el salto, elemental ! mis  queridos lectores ;)

* Referenced by a CALL at Addresses:
|:0002.0847, :0002.0ABA, :0002.4DD8
|
:0002.61D5 8CD8                   mov ax, ds
:0002.61D7 90                     nop
:0002.61D8 45                     inc bp
:0002.61D9 55                     push bp
:0002.61DA 8BEC                   mov bp, sp
:0002.61DC 1E                     push ds
:0002.61DD 8ED8                   mov ds, ax
:0002.61DF 83EC22                 sub sp, 0022
:0002.61E2 16                     push ss
:0002.61E3 8D46DC                 lea ax, [bp-24]
:0002.61E6 50                     push ax
:0002.61E7 FF366949               push word ptr [4969]
:0002.61EB FF366749               push word ptr [4967]
:0002.61EF 90                     nop
:0002.61F0 0E                     push cs
:0002.61F1 E82A00                 call 621E
:0002.61F4 83C408                 add sp, 0008
:0002.61F7 16                     push ss
:0002.61F8 688049                 push 4980
:0002.61FB 16                     push ss
:0002.61FC 8D46DC                 lea ax, [bp-24]
:0002.61FF 50                     push ax
:0002.6200 9AFFFF0000             call 0001.22EEh
:0002.6205 83C408                 add sp, 0008
:0002.6208 0BC0                   or ax, ax
:0002.620A 7507                   jne 6213
:0002.620C B80100                 mov ax, 0001
:0002.620F EB06                   jmp 6217
:0002.6211 EB04                   jmp 6217
 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0002.620A(C)
|
:0002.6213 33C0                   xor ax, ax
:0002.6215 EB00                   jmp 6217

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0002.620F(U), :0002.6211(U), :0002.6215(U)
|
:0002.6217 8D66FE                 lea sp, [bp-02]
:0002.621A 1F                     pop ds
:0002.621B 5D                     pop bp
:0002.621C 4D                     dec bp
:0002.621D CB                     retf

Definitivamente esta es la rutina y si es asi, la parte de chico malo debe estar en 0002.6217 un
xor ax, ax, asi que para ni cambiar los jumps que van a aqui, cambiamos el xor por un par de inc
eax (40h), y listo!, el programa desde que se inicia tiene el menu de "Gold Key", deshabilitado
lo que significa que estamos registrados :)

Nota : Por cierto el aspecto de este programa es asi de raro porque es para Win 3.1, con sus
terribles offsets y segmentos, pero afortunadamente eso ya quedo atras .

Nota 2 : si alguien le interesa el password del mundo 12 es : USJXLFMZ ;)
 
 

Vil Roach/Trenchcoat Legion - Hacemos las cosas bien ! :)


Ir al indice...


Cracking SmileShell

             By

               Vil Roach
 

El programa que nos ocupa hoy es una simple interface entre nosostros y el Command.com, lo
que hace es simplemente recibir datos en una Editbox y mandarselos al Command.Com, lo mas curioso
del programa es el mensaje de error que sale al intentar registrarse :
 

------------------------------------------------------------------------------------------------
Aw c'mon. Yopu know that's not a valid registration number. Are you trying to crack my program ?
To save a few bucks?
Look - I'm just one guy, with s litlle company. I'm just trying to put some good stuff out there
and make enough of a living so i can keep at it.

I need your support to keep doing this. Give me a hand, ok?

Thanks for your help with this.

        -Barry
------------------------------------------------------------------------------------------------

Si, si estoy tratando de crackear su programa y no no es por salvarme unos dolares, es simplemen-
te por que puedo hacerlo, y a mi no me importa su vida ni quien es usted, y no le voy a dar una
mano en nada. Ok ?

A la orden por nada, igualado venido a mas, poca cosa !.
 

Ahora procedemos a buscar el ridiculo mensaje en el codigo desensamblado y encontramos :

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040215C(C), :00402169(C)
|
:004021A4 6A30                    push 00000030
:004021A6 68B8A24200              push 0042A2B8

* Possible StringData Ref from Data Obj ->"Aw c'mon.  You know that's not "
                                        ->"a valid registration number.  "
                                        ->"Are you trying to crack my program? "
                                        ->" To save a few bucks?"
                                  |
:004021AB 68F4A04200              push 0042A0F4
:004021B0 53                      push ebx

* Reference To: USER32.MessageBoxA, Ord:0188h
                                  |
:004021B1 FF15A8364300            Call dword ptr [004336A8]

Asi que miramos la zona donde se salta aqui y encontramos algo muy particular, resulta que
hay toda una serie de saltos y no el tipico call-test-je, lo que significa seguramente que se
calcula digito por digito, asi que vamos a analizar todo la secuencia para mostrarle a Barry nues
tras buenas intenciones ;)

* Reference To: USER32.GetDlgItemTextA, Ord:00EDh
                                  |
:0040208D 8B2DA4364300            mov ebp, dword ptr [004336A4]
:00402093 53                      push ebx
:00402094 FFD5                    call ebp    !!! CON ESTA FUNCION OBTENEMOS EL DIGITO INTRODUCIDO
:00402096 85C0                    test eax, eax    !!! POR EL USUARIO
:00402098 0F84F3000000            je 00402191
:0040209E 0FBE442410              movsx eax, byte ptr [esp+10]
:004020A3 BE01000000              mov esi, 00000001
:004020A8 50                      push eax
:004020A9 8BFE                    mov edi, esi
:004020AB E84C9D0100              call 0041BDFC
:004020B0 88442414                mov byte ptr [esp+14], al
:004020B4 83C404                  add esp, 00000004
:004020B7 807C241100              cmp byte ptr [esp+11], 00 !! EN ESP ESTA EL NUMERO
:004020BC 7440                    je 004020FE   !! AQUI SALTAMOS A LA RUTINA QUE COMPARA LOS NUMEROS
 

En esta zona se compara digito po digito :

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004020BC(C), :004020FA(U)
|
:004020FE 85F6                    test esi, esi
:00402100 7424                    je 00402126
:00402102 8D7C2410                lea edi, dword ptr [esp+10] !!MOVEMOS EL NUMERO A EDI
:00402106 B9FFFFFFFF              mov ecx, FFFFFFFF   !! HACEMOS UN LOOP HASTA  QUE SE COPIE TODO EDI A EAX
:0040210B 2BC0                    sub eax, eax
:0040210D F2                      repnz
:0040210E AE                      scasb
:0040210F F7D1                    not ecx
:00402111 49                      dec ecx
:00402112 83F90B                  cmp ecx, 0000000B  !! MIRAMOS SI LOS DIGITOS COPIADOS SON 11 (11 = Bh)
:00402115 7402                    je 00402119  !! SI SON 12 NOS SALTAMOS EL XOR ESI ESI
:00402117 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402115(C)
|
:00402119 85F6                    test esi, esi
:0040211B 7416                    je 00402133
:0040211D 807C241733              cmp byte ptr [esp+17], 33 !!    COMPARAMOS LA POSICION 8 CON 3
:00402122 7402                    je 00402126   !! (33h = 51 -> Asc(51) = 3)
:00402124 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402100(C), :00402122(C)
|
:00402126 85F6                    test esi, esi
:00402128 7416                    je 00402140
:0040212A 807C241236              cmp byte ptr [esp+12], 36  !! COMPARAMOS LA POSICION 3 CON 6
:0040212F 7402                    je 00402133
:00402131 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040211B(C), :0040212F(C)
|
:00402133 85F6                    test esi, esi
:00402135 7416                    je 0040214D
:00402137 807C241334              cmp byte ptr [esp+13], 34  !! COMPARAMOS LA POSICION 4 CON 4
:0040213C 7402                    je 00402140
:0040213E 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402128(C), :0040213C(C)
|
:00402140 85F6                    test esi, esi
:00402142 7416                    je 0040215A
:00402144 807C241132              cmp byte ptr [esp+11], 32  !! COMPARAMOS LA POSICION 2 CON 2
:00402149 7402                    je 0040214D
:0040214B 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402135(C), :00402149(C)
|
:0040214D 85F6                    test esi, esi
:0040214F 7416                    je 00402167
:00402151 807C241531              cmp byte ptr [esp+15], 31 !! COMPARAMOS LA POSICION 6 CON 1
:00402156 7402                    je 0040215A
:00402158 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402142(C), :00402156(C)
|
:0040215A 85F6                    test esi, esi
:0040215C 7446                    je 004021A4
:0040215E 807C241043              cmp byte ptr [esp+10], 43 !! COMPARAMOS LA POSICION 1 CON C
:00402163 7402                   je 00402167
:00402165 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040214F(C), :00402163(C)
|
:00402167 85F6                    test esi, esi
:00402169 7439                    je 004021A4   !! SI ALGO VA MAL SALTAMOS EL MENSAJE DE ERROR

Lo que averiguamos es que el numero debe tener 11 digitos  y que ciertas posiciones deben tener
un valor determinado asi :

C 2 6 4 _ 1 _ 3 _ _  _

1 2 3 4 5 6 7 8 9 10 11

Esto lo sabemos por las numerosas sentencias del tipo "cmp byte ptr [esp+15], 31" en las que
byte ptr[esp+15] es la posicion de la cadena 6, ya que sabemos que la cadena comienza en [esp+10]
y 31 es el valor Hex de 49 que es el codigo Ascii de 1.Lo mas gracioso es una de las inteligentes
artimañas de barry al comparar los digitos en desorden, seguramente penso que asi iba a engañar
a los malvados crackers ;)

A continuacion un pequeño y mediocre Key-Generator, aunque este programa no se merezca tanto :

CLS
RANDOMIZE TIMER
DIM digitos$(11)
digitos$(1) = "C"
digitos$(2) = "2"
digitos$(3) = "6"
digitos$(4) = "4"
digitos$(5) = LTRIM$(STR$(INT(RND * 10) + 1))
digitos$(6) = "1"
digitos$(7) = LTRIM$(STR$(INT(RND * 10) + 1))
digitos$(8) = "3"
digitos$(9) = LTRIM$(STR$(INT(RND * 10) + 1))
digitos$(10) = LTRIM$(STR$(INT(RND * 10) + 1))
digitos$(11) = LTRIM$(STR$(INT(RND * 10) + 1))
FOR x = 1 TO 11
PRINT digitos$(x);
NEXT x
PRINT " Code for Smile Shell 1.5 - Courtesy of Vil Roach/Trenchcoat Legion "
PRINT " A big hi! to Barry ;)"
 

Por si alguien no lo ha notado esta en QuickBasic ;)
 
 
 

                                     Vil Roach/Trenchcoat Legion - Fucking Barry 4Ever XDDD

Ir al indice...


Cracking WinImage Version 2.20

                   By

                      vIl RoAcH
 

Aunque este programa es un poco viejo, es bueno y util. Su principal funcion consiste en crear
"imagenes" de un disquete y luego poder guardar estas en el disco duro o copiarlas a otros
disquetes, una "imagen" de un disquete es como una fotografia con todos los datos del disquete
incluyendo tabla de localización (FAT), sector de arranque, directorios...etc. Es muy util
para cuando necesitamos una serie de disquete iguales, o incluso para hacer copias de seguridad.

La version que yo tengo esta traducida al español, pero en el codigo muerto los mensajes aparecen
en varios idiomas, asi que desensamblamos WinImage.exe y buscamos el mensaje de error, y sorpre-
sivamente este no esta en ningun lado, asi que buscamos en las Str.References algo sospechoso y
encontramos :

008 - ControlID:080C, Control Class:"STATIC" Control Text:"Unregistred version"

Esta debe ser la que sale en la nag del principio asi que la buscamos y encontramos :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040A189(C)
|
:0040A199 FF7508                  push [ebp+08]
:0040A19C E8754C0000              call 0040EE16
:0040A1A1 83C404                  add esp, 00000004
:0040A1A4 833D2410420000          cmp dword ptr [00421024], 00000000  !!!!!!!!!!!!
:0040A1AB 7424                    je 0040A1D1
:0040A1AD 68280E4200              push 00420E28

* Reference To: USER32.SetDlgItemTextA, Ord:01DEh
                                  |
:0040A1B2 8B35EC574200            mov esi, dword ptr [004257EC]

* Possible Reference to Dialog: ENUSPLASH, CONTROL_ID:080C, "Unregistred version"
                                  |
:0040A1B8 680C080000              push 0000080C
:0040A1BD FF7508                  push [ebp+08]
:0040A1C0 FFD6                    call esi
:0040A1C2 68780B4200              push 00420B78

* Possible Reference to Dialog: ENUSPLASH, CONTROL_ID:080D, "DON'T FORGET TO REGISTER !"

Y en este codigo observamos algo sumamente interesante :

:0040A1A4 833D2410420000          cmp dword ptr [00421024], 00000000  !!!!!!!!!!!!

La desicion de mostrar o no el Unregistred se toma en base a un puntero global, algo asi como
una variable global , en la cuyal se guarda un 0 o 1  dependiendo de si elstamos registrados o no

Asi que nuestra mision ahora es encontrar el punto donde el programa le da un valor a la variable
asi que buscamos : "mov cmp dword ptr [00421024]", y encontramos :

:0040DD98 6828304200              push 00423028

* Possible StringData Ref from Data Obj ->"NameRegistered"
                                  |
:0040DD9D 681C3D4200              push 00423D1C
:0040DDA2 E8FBF7FFFF              call 0040D5A2
:0040DDA7 83C410                  add esp, 00000010
:0040DDAA 6A0F                    push 0000000F
:0040DDAC 68780B4200              push 00420B78
:0040DDB1 6828304200              push 00423028

* Possible StringData Ref from Data Obj ->"CodeRegistered"
                                  |
:0040DDB6 680C3D4200              push 00423D0C
:0040DDBB E8E2F7FFFF              call 0040D5A2
:0040DDC0 83C410                  add esp, 00000010
:0040DDC3 68780B4200              push 00420B78
:0040DDC8 68280E4200              push 00420E28
:0040DDCD E863F5FFFF              call 0040D335    !!!!!FUNCION X!!!!!!!
:0040DDD2 83C408                  add esp, 00000008
:0040DDD5 A324104200              mov dword ptr [00421024], eax
:0040DDDA 85C0                    test eax, eax
:0040DDDC 750F                    jne 0040DDED

Muy Interesante !!

Se menciona dos variables muy sospechosas, seguramente para leer informacion del registro. Luego
se pasan estas dos variables a una funcion y el resultado se mueve a el puntero magico. Asi que
ya sabemos que la funcion x es donde se validan los numeros y es la que debemos crackear.

* Referenced by a CALL at Addresses:
|:0040A500   , :0040DDCD

:0040D335 55                      push ebp
:0040D336 8BEC                    mov ebp, esp
:0040D338 83EC28                  sub esp, 00000028
:0040D33B 56                      push esi
:0040D33C 8D4DEC                  lea ecx, dword ptr [ebp-14]
...

:0040D372 85C0                    test eax, eax
:0040D374 7507                    jne 0040D37D
:0040D376 B801000000              mov eax, 00000001
:0040D37B EB7B                    jmp 0040D3F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D374(C)
|
:0040D37D 8D45EC                  lea eax, dword ptr [ebp-14]
:0040D380 8D8E48190514            lea ecx, dword ptr [esi+14051948]
:0040D386 50                      push eax
:0040D387 8D55D8                  lea edx, dword ptr [ebp-28]
:0040D38A 51                      push ecx

:0040D38B 52                      push edx
:0040D38C E856FFFFFF              call 0040D2E7
:0040D391 83C408                  add esp, 00000008
:0040D394 50                      push eax

* Reference To: CRTDLL.strcmp, Ord:01CCh
                                  |
:0040D395 E83EE50000              Call 0041B8D8
:0040D39A 83C408                  add esp, 00000008
:0040D39D 85C0                    test eax, eax
:0040D39F 7507                    jne 0040D3A8
:0040D3A1 B801000000              mov eax, 00000001
:0040D3A6 EB50                    jmp 0040D3F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D39F(C)
|
....

:0040D3CF 7427                    je 0040D3F8
:0040D3D1 8D45EC                  lea eax, dword ptr [ebp-14]
:0040D3D4 81C681190510            add esi, 10051981
:0040D3DA 50                      push eax
:0040D3DB 8D4DD8                  lea ecx, dword ptr [ebp-28]
...

:0040D3EE 83C408                  add esp, 00000008
:0040D3F1 83F801                  cmp eax, 00000001
:0040D3F4 1BC0                    sbb eax, eax
:0040D3F6 F7D8                    neg eax
 

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040D37B(U), :0040D3A6(U), :0040D3CF(C)  ---------------.
|                                                          \
:0040D3F8 5E                      pop esi                   \ Ret
:0040D3F9 8BE5                    mov esp, ebp              /
:0040D3FB 5D                      pop ebp                  /
:0040D3FC C3                      ret       --------------'

Como cualquier funcion tipica de cheque hay una parte donde eax se deja bien y luego se va al Ret
y otra parte donde se pone mal y luego se va al Ret (el ret es la seccion de la rutina donde se
cuadra la pila de nuevo y se sale de la funcion !).

Tambien vemos que antes del Ret hay una parte que pone eax a cero, asi que lo que debemos hacer
es arreglar los saltos al Ret para que siempre llegue ahi y se salte lo de la negacion.

Son 3 saltos a Ret : :0040D37B(U), :0040D3A6(U), :0040D3CF(C)

El primero :

:0040D374 7507                    jne 0040D37D
:0040D376 B801000000              mov eax, 00000001
:0040D37B EB7B                    jmp 0040D3F8

Es incondicional pero antes hay un condicional asi que cambiamos "jne 0040D37D" -> "je 0040D37D"

El segundo :

:0040D39F 7507                    jne 0040D3A8
:0040D3A1 B801000000              mov eax, 00000001
:0040D3A6 EB50                    jmp 0040D3F8

Es casi igual pero como ya cambiamos el primero y va saltar siempre no lo tocamos .

Y el Tercero :

:0040D3CF 7427                    je 0040D3F8

Lo cambiamos por je y listo !

Cambiamos el offset C7CF por 75 y C774 por 74, luego ejecutamos el programa y nos sale la Nag,
luego introducimos el nombre y el serial, y nos dice que estamos registrados :) reiniciamos
y ya nos sale ninguna Nag :)
 

Guia Rapida de crack :  Winimant.exe Offset 0x0C7CF 74 -> 75
                                     Offset 0x0C774 75 -> 74
 

Vil Roach/Trenchcoat Legion
Ir al indice...


 

--IR AL MENÚ PRINCIPAL--