--

Whiskey Kon Tekila CrACking tEAm.
WKT Tutorialz Site
DiFiCultAD WKT DiFiCultAD
progrAmA Picture Explorer 1.2.1 W95
DEsCripCión Imagen
tipo Shareware ($26)
url http://www.secret-dan.com/pe
protECCión Nag-Screen
DiFiCultAD 2) Amateur
hErrAmiEntAs W32Dasm
CrACkEr Jumanji
FEChA Diciembre 1998
ComEntArio Administrador de ficheros gráficos.

Introducción
El objetivo sera encontrar el numero de registro real del programa.

Al Atake

Cuando arrancamos el Picture Explorer, nos sale directamente una Nag-Screen recordandonos que estamos en una version Shareware y dandonos opcion a registrarla o escribir un Password que el nos da para trabajar en modo Shareware.
Este Password que el nos da, y que sale en las lineas que hay encima de donde pide los campos, varia cada vez que arrancamos el programa.

Si intentamos registrar el programa, vemos que nos pide tres campos:

User Name: Jumanji
Organization: Jumanji
Password: 30071996

pero si nos fijamos, el boton de Siguiente > esta desactivado hasta que se introduzca un Password correcto.
En este momento, introduciremos el Password que el nos da y que es de 5 caracteres.

Una vez introducido, el boton de Siguiente > se convierte en el boton Finalizar y esta activado, pulsar este boton y entraremos en el programa.

Si miramos en el menu Help / About Picture Explorer... veremos que como registro, nos sale No register en lugar de lo que pusimos nosotros en la pantalla de registro.
Esto nos servira para atacar la proteccion del programa desde el W32Dasm.

Arrancar el W32Dasm y abrir una copia del fichero Picexpl.exe, una vez desensamblado, salvarlo para no tener que volverlo a hacer.

Ir al menu Refs / String Data References y buscar la frase No register, una vez encontrada, hacer doble click sobre ella para situarnos en la parte de codigo que corresponda:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004011DF(C)
|

* Possible StringData Ref from Data Obj ->"No Register"
|
:0040125A BE74A14A00 mov esi, 004AA174
:0040125F 8D4F5C lea ecx, dword ptr [edi+5C]
:00401262 56 push esi
:00401263 E864C40500 call 0045D6CC
:00401268 56 push esi
:00401269 8D8F98000000 lea ecx, dword ptr [edi+00000098]
:0040126F E858C40500 call 0045D6CC

Vemos que aqui se viene por un salto condicional en la linea :004011DF, luego esto quiere decir que en esa parte de codigo debe estar la verificacion de si se esta registrado o no, veamos esta parte de codigo:

:00401174 33DB xor ebx, ebx
:00401176 3C79 cmp al, 79 <-- Interesante
:00401178 0F95C3 setne bl
:0040117B 33C0 xor eax, eax
:0040117D 80FA58 cmp dl, 58 <-- Interesante
:00401180 0F95C0 setne al
:00401183 03D8 add ebx, eax
:00401185 33C0 xor eax, eax
:00401187 807DF365 cmp byte ptr [ebp-0D], 65 <-- Interesante
:0040118B 0F95C0 setne al
:0040118E 03D8 add ebx, eax
:00401190 33C0 xor eax, eax
:00401192 807DF273 cmp byte ptr [ebp-0E], 73 <-- Interesante
:00401196 0F95C0 setne al
:00401199 03D8 add ebx, eax
:0040119B 33C0 xor eax, eax
:0040119D 807DF178 cmp byte ptr [ebp-0F], 78 <-- Interesante
:004011A1 0F95C0 setne al
:004011A4 03D8 add ebx, eax
:004011A6 33C0 xor eax, eax
:004011A8 807DF078 cmp byte ptr [ebp-10], 78 <-- Interesante
:004011AC 0F95C0 setne al
:004011AF 03D8 add ebx, eax
:004011B1 33C0 xor eax, eax
:004011B3 807DEF37 cmp byte ptr [ebp-11], 37 <-- Interesante
:004011B7 0F95C0 setne al
:004011BA 03D8 add ebx, eax
:004011BC 33C0 xor eax, eax
:004011BE 80F978 cmp cl, 78 <-- Interesante
:004011C1 0F95C0 setne al
:004011C4 03D8 add ebx, eax
:004011C6 33C0 xor eax, eax
:004011C8 807DEE36 cmp byte ptr [ebp-12], 36 <-- Interesante
:004011CC 0F95C0 setne al
:004011CF 03D8 add ebx, eax
:004011D1 33C0 xor eax, eax
:004011D3 807DED35 cmp byte ptr [ebp-13], 35 <-- Interesante
:004011D7 0F95C0 setne al
:004011DA 03D8 add ebx, eax
:004011DC 895DE0 mov dword ptr [ebp-20], ebx
:004011DF 7579 jne 0040125A <-- No registrado
:004011E1 CC int 03
:004011E2 C3 ret

Poner atencion a las lineas anteriores al salto a la rutina de error, en las comparaciones o CMPs que hay sobre valores fijos y que en total son 10.
estas comparaciones son:

  AL DL EBP-D EBP-E EBP-F EBP-10 EBP-11 CL EBP-12 EBP-13
Hexadecimal 79 58 65 73 78 78 37 78 36 35
ASCII y X e s x x 7 x 6 5

Como se puede suponer, este es el Password de registro real y que ademas es siempre el mismo.
Mirando unas lineas mas arriba de donde empieza la rutina de comprobacion, podemos ver como hay que colocar el Password para que coincida luego con la comprobacion:

:00401142 8A5001 mov dl, byte ptr [eax+01]
:00401145 8A08 mov cl, byte ptr [eax] <-- 1 caracter
:00401147 8855ED mov byte ptr [ebp-13], dl <-- 2 caracter
:0040114A 8A5002 mov dl, byte ptr [eax+02]
:0040114D 8855F0 mov byte ptr [ebp-10], dl <-- 3 caracter
:00401150 8A5003 mov dl, byte ptr [eax+03]
:00401153 8855EE mov byte ptr [ebp-12], dl <-- 4 caracter
:00401156 8A5004 mov dl, byte ptr [eax+04]
:00401159 8855F1 mov byte ptr [ebp-0F], dl <-- 5 caracter
:0040115C 8A5005 mov dl, byte ptr [eax+05]
:0040115F 8855EF mov byte ptr [ebp-11], dl <-- 6 caracter
:00401162 8A5006 mov dl, byte ptr [eax+06]
:00401165 8855F2 mov byte ptr [ebp-0E], dl <-- 7 caracter
:00401168 8A5007 mov dl, byte ptr [eax+07]
:0040116B 8855F3 mov byte ptr [ebp-0D], dl <-- 8 caracter
:0040116E 8A5008 mov dl, byte ptr [eax+08] <-- 9 caracter
:00401171 8A4009 mov al, byte ptr [eax+09]<-- 10 caracter

Partimos de la base de que en el registro EAX esta el Password correcto y haciendo un seguimiento de los movimientos, obtenemos el siguiente resultado:

Destino AL DL EBP-D EBP-E EBP-F EBP-10 EBP-11 CL EBP-12 EBP-13
Origen EAX+9 EAX+8 EAX+7 EAX+6 EAX+4 EAX+2 EAX+5 EAX EAX+3 EAX+1
  y X e s x x 7 x 6 5
                     
Resultado EAX EAX+1 EAX+2 EAX+3 EAX+4 EAX+5 EAX+6 EAX+7 EAX+8 EAX+9
  x 5 x 6 x 7 s e X y

Ahora ya tenemos el Password correcto.
Solo nos queda volver a ejecutar el programa y rellenar los campos de la siguiente manera:

User Name: Jumanji
Organization: Jumanji
Password: x5x6x7seXy

Tener en cuenta que como la clave es unica, en los campos de User Name y Organization, se puede poner lo que se quiera.