--Cracking Bussiness Card Design Plus--
--Cracking Labels, Cars & More--
--Cracking
WinImage Version 2.20--
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 !
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
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 ;)
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
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
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 ;)
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
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