--

ESTUDIO COLECTIVO DE DESPROTECCIONES
WKT Tutorialz Site
WKT
progrAmA AddSoft 2.26 W95
DEsCripCión Internet
tipo Shareware ($89)
url http://www.cyberspacehq.com/addsoft
protECCión 90 dias de evaluacion pero pasado este tiempo, sigue funcionando y Nag-Screen
DiFiCultAD 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
hErrAmiEntAs SoftIce 3.24, W32Dasm 8.93
CrACkEr Jumanji
FEChA Diciembre de 1998
ComEntArio Programa para desarrolladores de Shareware que permite subir los programas a mas de 100 sitios a la vez

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

Al Atake

Para buscar el numero de serie, usaremos el W32Dasm ya que si intentamos usar el SoftIce con un BreakPoint en GetWindowTextA o GetDlgItemTextA, no funcionaria.
Podriamos usar HMEMCPY, pero en este caso no lo usaremos.

Arrancar el W32Dasm y abrir una copia del fichero Addsoft.exe.
Una vez desensamblado, salvar el proyecto para no tener que volver a desensamblarlo.

Abrir la ventana de String Data References y buscar el texto "Thanks for registering! :)".
Hacer doble click sobre el texto y nos posicionaremos en la linea donde aparece.
Cerrar la ventana de String Data References.

En pantalla tendremos el siguiente codigo:

:00480AF1 E8DE49FFFF call 004754D4
:00480AF6 8BD8 mov ebx, eax
:00480AF8 A12C644A00 mov eax, dword ptr [004A642C]
:00480AFD 8B00 mov eax, dword ptr [eax]
:00480AFF 889884070000 mov byte ptr [eax+00000784], bl
:00480B05 A12C644A00 mov eax, dword ptr [004A642C]
:00480B0A 84DB test bl, bl
:00480B0C 740A je 00480B18

* Possible StringData Ref from Code Obj ->"Thanks for registering! :)"
|
:00480B0E B8580B4800 mov eax, 00480B58
:00480B13 E808CEFBFF call 0043D920

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00480A8D(C), :00480AAE(C), :00480B0C(C)
|
:00480B18 33C0 xor eax, eax
:00480B1A 5A pop edx
:00480B1B 59 pop ecx
:00480B1C 59 pop ecx
:00480B1D 648910 mov dword ptr fs:[eax], edx

Como se puede ver, en la linea :00480B0C hay un salto condicional en el cual se hace un TEST de BL, si es 0, se salta el mensaje de registro que es lo que intentamos evitar.
Si miramos unas lineas hacia arriba, en la :00480AF1 hay una llamada a 004754D4, la cual devuelve en EAX el valor que luego se mira en BL ya que si vemos en la siguiente linea a la llamada, se mueve EAX sobre EBX.
Vallamos a la llamada a 004754D4:

* Referenced by a CALL at Addresses:
|:00480AF1 , :0049DD19
|
:004754D4 55 push ebp
:004754D5 8BEC mov ebp, esp
:004754D7 6A00 push 00000000
:004754D9 6A00 push 00000000
:004754DB 6A00 push 00000000
:004754DD 53 push ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475477(C)
|
:004754DE 56 push esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047548A(C)
|
:004754DF 8BF0 mov esi, eax
:004754E1 33C0 xor eax, eax
:004754E3 55 push ebp
:004754E4 6879554700 push 00475579
:004754E9 64FF30 push dword ptr fs:[eax]
:004754EC 648920 mov dword ptr fs:[eax], esp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00475479(C)
|
:004754EF 33DB xor ebx, ebx
:004754F1 8D55FC lea edx, dword ptr [ebp-04]
:004754F4 8BC6 mov eax, esi
:004754F6 E85DFDFFFF call 00475258
:004754FB 8B45FC mov eax, dword ptr [ebp-04]
:004754FE E8E5E7F8FF call 00403CE8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047548D(C)
|
:00475503 85C0 test eax, eax
:00475505 7457 je 0047555E
:00475507 8D55F8 lea edx, dword ptr [ebp-08]
:0047550A 8BC6 mov eax, esi
:0047550C E80FFEFFFF call 00475320
:00475511 8B45F8 mov eax, dword ptr [ebp-08]
:00475514 E8CFE7F8FF call 00403CE8
:00475519 85C0 test eax, eax
:0047551B 7441 je 0047555E
:0047551D 8D4DF4 lea ecx, dword ptr [ebp-0C]
:00475520 BACE070000 mov edx, 000007CE
:00475525 8B45FC mov eax, dword ptr [ebp-04]
:00475528 E8D3C9FFFF call 00471F00
:0047552D 8B45F4 mov eax, dword ptr [ebp-0C]
:00475530 8B55F8 mov edx, dword ptr [ebp-08]
:00475533 E8C0E8F8FF call 00403DF8
:00475538 7504 jne 0047553E
:0047553A B301 mov bl, 01
:0047553C EB02 jmp 00475540

En la linea :004754FE hay una llamada que devuelve la longitud del ID que se introdujo seguida de una comprobacion para ver si se dejo vacio.
Siguiendo el flujo, en la linea :00475514 hay otra llamada que devuelve la longitud del numero de registro que se introdujo seguida de una comprobacion para ver si se dejo vacio.
La siguiente llamada que tenemos, se encuentra en la linea :00475528 que es la que calcula el numero de registro real.

Arranquemos ahora el Symbol Loader del SoftIce y cargemos el modulo Addsoft.exe.
Pondremos un BreakPoint en la linea :00475528 asi:

bpx 00475528

y pulsaremos F5 para que continue la carga del programa.

Nos aparecera la Nag-Screen para que pongamos la informacion de registro:

Enter Registration ID: JUMANJI
Enter Registration Number: 30071996

y pulsaremos el boton Continue.

Apareceremos en el SoftIce, en la linea en la que pusimos el BreakPoint.
Aqui podemos pulsar la tecla F8 para entrar en la rutina del calculo del numero real o pulsar la tecla F10 para pasar a la siguiente linea.
En este caso, pulsaremos F10 aunque si alguien quiere ver como se calcula el numero real, tiene que pulsar F8.
Pulsar otra vez F10 y F10 para situarnos en la linea :00475533.

Llegados a este punto, si miramos el contenido del registro EAX y EDX, podemos ver el numero real y el nuestro:

d EAX=051062985 <-- Numero real
d EDX=30071996 <-- Nuestro numero

Ahora ya podemos desactivar el BreakPoint que teniamos entrando en el SoftIce y escribiendo:

BC *

y pulsar F5 para volver al programa. Una vez en el programa, escribir el codigo real y ya esta registrado.