Cuando arrancamos el programa, sale directamente la Nag-Screen,
avisandonos de que el programa es shareware y de que nos debemos de
registrar. Tendremos dos posibilidades, una es el boton Register
o el boton OK.
Pulsaremos el boton Register y nos saldra una pantalla
pidiendonos el nombre de usuario y la clave.
Registration Name: Mr.Grey Registration Key: 30071996
Antes de pulsar el boton OK, pondremos 2 BreakPoints en el
SoftIce. Para ello, pulsar CTRL+D y escribir lo siguiente:
bpx GetWindowTextA bpx GetDlgItemTextA
Pulsar la tecla F5 para volver al programa y pulsar el boton
OK. Veremos que no sale el SoftIce y que en cambio, sale
otra ventana con el mensage de Sorry not a correct reg key. Esto
quiere decir que la forma de seguimiento no va por los conductos mas
normales. Pulsar otra vez CTRL+D para quitar los
BreakPoints anteriores escribiendo bc * y despues la tecla
F5.
En lugar de usar el SoftIce directamente, pasaremos a traves del
WDasm. Arrancar el WDasm y abrir una copia del fichero Uninsman.exe. Una
vez que tengamos el programa desensamblado, salvar el proyecto para no
tener que desensamblarlo otra vez.
Ahora seleccionaremos el menu Refs / String Data References
que nos mostrara todas las cadenas de caracteres que el WDasm
considere como tales. Aqui intentaremos buscar el mensaje que nos
salio cuando intentamos registrar el programa, pero .... resulta que
no esta este mensaje y no tenemos mas pistas que seguir.
En estos casos, una de las cosas que se pueden hacer, es buscar
cualquier tipo de referencia o cadena de caracteres que nos den una
pista sobre que el programa es shareware, que no esta registrado, que
es de evaluacion o algo fuera de lo que se pudiera considerar normal.
En el caso de este programa, hay una referencia que salta a la vista
que no es muy normal, esta es SILICON SURFER [PC] ya que no es
un texto muy normal y ademas esta en mayusculas, mas bien parece un
nombre de algun grupo.
Si pulsamos un doble click, saltaremos directamente a la siguiente
linea en donde se encuentra este texto:
* Referenced by a (U)nconditional or
(C)onditional Jump at Address: |:0045BFAE(C) | :0045BFC2
8D55F4 lea edx, dword ptr [ebp-0C] :0045BFC5 8B45FC mov eax,
dword ptr [ebp-04] :0045BFC8 8B800C020000 mov eax, dword ptr
[eax+0000020C] :0045BFCE E8B539FCFF call 0041F988 :0045BFD3
8B45F4 mov eax, dword ptr [ebp-0C] :0045BFD6 8D55EC lea edx,
dword ptr [ebp-14] :0045BFD9 E89AB0FAFF call 00407078 :0045BFDE
8B45EC mov eax, dword ptr [ebp-14]
*
Possible StringData Ref from Code Obj ->"SILICON SURFER [PC]"
| :0045BFE1 BAA0C34500 mov edx, 0045C3A0 <--
Aparecemos aqui :0045BFE6 E8297EFAFF call 00403E14 :0045BFEB
753D jne 0045C02A :0045BFED 6A00 push 00000000 :0045BFEF
B8B9000000 mov eax, 000000B9 :0045BFF4 E877100000 call 0045D070
:0045BFF9 50 push eax :0045BFFA B828000000 mov eax, 00000028
:0045BFFF E890100000 call 0045D094 :0045C004 50 push eax
:0045C005 668B0DB4C34500 mov cx, word ptr [0045C3B4] :0045C00C
33D2 xor edx, edx
Vamos a hacer una prueba, ejecutar otra vez el programa e ir a
registrarlo con el nombre anterior. Resulta que nos sale una
ventana con el mensaje This registration info is illegal. No need
to pirate this software. It is just 10$ to register. Por lo
visto, este grupo debio de haberles crakeado alguna version anterior o
algo asi y han metido este control.
Volvamos al WDasm e intentemos buscar el texto pirate a ver
que sale, ir al menu Search / Find Text y escribirlo. Resulta
que si que hay un texto con esta palabra y resulta que es el mensaje
que nos habia salido:
* Possible StringData Ref from Code Obj ->"This
registration info is illegal. " ........................................->"No
need to pirate this software. " ........................................->"It
is just 10$ to register" | :0045C00E B8C0C34500 mov
eax, 0045C3C0 <-- Aparecemos casi aqui :) :0045C013
E87000FEFF call 0043C088 :0045C018 8B45FC mov eax, dword ptr
[ebp-04] :0045C01B C7805001000002000000 mov dword ptr
[ebx+00000150], 00000002 :0045C025 E93A030000 jmp 0045C364
Si os fijais y subis unas lineas hacia arriba, vereis el texto que
hace referencia al grupo justamente en la linea :0045BFE1 y en
la siguiente linea una llamada a 00403E14 y que a su vuelta
hace un salto condicional si no es igual. Esto quiere decir que si
el nombre introducido no es igual al del grupo, que salte a 0045C02A:
* Referenced by a (U)nconditional or
(C)onditional Jump at Address: |:0045BFEB(C) | :0045C02A
8B45FC mov eax, dword ptr [ebp-04] <-- Aparecemos aqui :0045C02D
E8E6F8FFFF call 0045B918 <-- Comprobacion numero registro :0045C032
3C01 cmp al, 01 <-- AL es igual a 1 ? :0045C034
0F8551020000 jne 0045C28B <-- Si AL no es 1, malo :0045C03A
B201 mov dl, 01 <-- Bien, bravo... registrado
Aqui podemos ver que hace una llamada a 0045B918 y a la
vuelta, compara el contenido del registro AL con el valor 1
y si el resultado no es igual, salta a 0045C28B que es la
rutina de error. Veamos el codigo de la llamada a 0045B918:
* Referenced by a CALL at Address: |:0045C02D
| :0045B918 55 push ebp :0045B919 8BEC mov ebp, esp
:0045B91B 33C9 xor ecx, ecx :0045B91D 51 push ecx ..... :0045B936
8D55F4 lea edx, dword ptr [ebp-0C] :0045B939 8B860C020000 mov
eax, dword ptr [esi+0000020C] :0045B93F E84440FCFF call 0041F988
:0045B944 837DF400 cmp dword ptr [ebp-0C], 00000000 :0045B948
747E je 0045B9C8 ..... :0045B96D 8B55F0 mov edx, dword ptr
[ebp-10] :0045B970 8D45FC lea eax, dword ptr [ebp-04] :0045B973
E8A881FAFF call 00403B20 :0045B978 33DB xor ebx, ebx :0045B97A
85FF test edi, edi :0045B97C 7E20 jle 0045B99E
Vemos que en la linea :0045B944 hace una comprobacion de si
el nombre introducido esta vacio o no y en la linea :0045B97A
hace otra comprobacion. El codigo que nos interesa, es el que
viene a continuacion:
* Referenced by a (U)nconditional or
(C)onditional Jump at Address: |:0045B99C(C) | :0045B983
8B55FC mov edx, dword ptr [ebp-04] :0045B986 8A5402FF mov dl,
byte ptr [edx+eax-01] :0045B98A 80FA20 cmp dl, 20 :0045B98D
740B je 0045B99A :0045B98F 8B4DFC mov ecx, dword ptr [ebp-04]
:0045B992 81E2FF000000 and edx, 000000FF :0045B998 03DA add
ebx, edx
* Referenced by a (U)nconditional or (C)onditional
Jump at Address: |:0045B98D(C) | :0045B99A 40 inc eax
:0045B99B 4F dec edi :0045B99C 75E5 jne 0045B983
*
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045B97C(C) | :0045B99E 81F389000000 xor ebx,
00000089 :0045B9A4 83F333 xor ebx, 00000033 :0045B9A7 43 inc
ebx :0045B9A8 8D55F8 lea edx, dword ptr [ebp-08] :0045B9AB
8B8610020000 mov eax, dword ptr [esi+00000210] :0045B9B1
E8D23FFCFF call 0041F988 :0045B9B6 8B45F8 mov eax, dword ptr
[ebp-08] :0045B9B9 E876BAFAFF call 00407434 :0045B9BE 3BD8
cmp ebx, eax :0045B9C0 7504 jne 0045B9C6 :0045B9C2 B301 mov
bl, 01 :0045B9C4 EB02 jmp 0045B9C8
Desde la linea :0045B983 y hasta la linea :0045B99C,
lo que hace es un bucle en el que monta la primera parte del numero de
registro. Cuando a terminado de recorrer todo el nombre, sigue en
la linea :0045B99E y hace un par de XOR al contenido
del registro EBX y lo incrementa en 1.
Si miramos unas lineas mas abajo, vemos que hay una comparacion
entre EBX y EAX que es evaluada en la siguiente linea
haciendo un salto a 0045B9C6 en caso de que no sean iguales. Si
son iguales, mueve un 1 a BL.
Llegados a este punto, vamos a usar el Symbol Loader del
SoftIce y elegiremos el menu File / Open Module, cogeremos el
fichero uninsman.exe. Elegir el menu Module / Load y poner
un BreakPoint en la linea :0045B9BE y pulsar la tecla F5
para que se ejecute el programa.
Nos aparecera la Nag-Screen y pulsaremos el boton de Register
e introducir el nombre y clave que se pusieron la vez anterior y
pulsar el boton de OK. Automaticamente, aparecera la
pantalla del SoftIce, justo en la linea donde pusimos el BreakPoint, o
sea, en la linea del CMP EBX, EAX. Si evaluamos el
contenido de ambos registros, veremos lo siguiente:
? EBX = 597 <-- Numero real ? EAX = 30071996 <--
Nuestro numero
Ahora ya sabemos el numero de registro real, solo queda desactivar
el BreakPoint que pusimos:
bd 00
Pulsar F5 para volver al programa que nos saldra una ventana
diciendo que el numero es erroneo. Volver a pedir el registro y
poner el numero real y el programa ya esta registrado.
|