Bueno, te tema
es largo para tí, pero este serial se encuntra en 3 ó 4
minutos. Recuer- do que cuando leía tutos en yanki
algunos decian: "feel the code..." Hehehehehe,
¿En ASM?. ¡Imposible para mí!. Desgraciado incrédulo,
me digo ahora.... Así que tío "siente el
código" te digo. Pero te voy a coger de la manita y
viajaremos dentro de la rutina ilustrándote paso a paso
lo poco que cuesta pillar el serial de un programa.
¿ok?. Como
sabrás GetWindowTextA es uno de los breakpoints más
conocidos dentro del Reverse, pero no vamos a hacer de
entrada el célebre bpx getwindowstexta, sino que te lo
vás a encontrar :)
Ante todo y por encima de
todo cópia y pega esta línea en tu WINICE.DAT, es
impres- cindible. Pantalla 800 x 600:
INIT="color 07 0A 79 30
17;faults off;"
INIT="X;code on;ew;wl;code on; altscr off; lines
57;wc 32; wd 8;WATCH *eax; WATCH *ebx;WATCH *ecx;WATCH
*edx;WATCH *esi;WATCH *edi;"
Esta es la que yo uso. Tengo
configurado Soft-Ice así. ¿De acuerdo?. (un momento,
voy a comprar tabaco).
Bién, entramos en la
ventana de registro el nick: Mr.GReeN [WkT!], la primera
parte del serial: 9900990 y la segunda: 1234567890123456
(por si acaso son 16 caracte- res). NO PULSAMOS OK aún.
Entramos en Soft-Ice pulsando CRTL-D, una vez den- tro
escribimos: bpx hmemcpy (porque no sabemos que llamada
del API se vá a encar- gar del asunto). Pulsamos ENTER y
despues CTRL-D para salir de S-I. Estamos en la ventana
de registro. Clickeamos en OK, y pá dentro S-I
(=Soft-Ice). Bueno, estamos en lo que se llama el Kernel,
lo cual no nos interesa para nada, asi que como locos
pulsamos F12 hasta llegar a una zona como esta:
0020 JMP 0137:BFF72B0A ; (en
mi máquina son estos valores)
0028 JMP 0137:BFF72964
0030 JMP 0137:BFF72BD4 Y te
preguntarás que pa que sirve esto????, Pues sirve para
que te estés quieto yá con el F12, porque el siguiente
es AREA DE TRABAJO!!!!!
Pulsa una véz más F12 y
que asoma?
5F414606 CALL
[USER32!GetWindowTextA]
¡Vále! Entramos en
materia...Avanzamos hasta nuevo aviso con F10. La primera
instrucción es: MOV
ECX, [EBP+10],
Veamos que carajo hay ahí. Hacemos D
@ECX ó D
*ECX (así te vás
familiarizando con las instrucciones S-I) Con esto vemos
el contenido de la dirección almacenada en ECX, y
observamos que el nick está con- tenido ahí. Bueno,F10
hasta salir al Kernel, F12 hasta entrar de nuevo en
GetWin- dowTextA. ¡¡¡¡Quietor!!!! que ya estás de
nuevo. Haces lo mismo que antes y que hay en ECX?. La 2º
parte del fake serial. Bueno no mas misterios. F10 hasta
salir al Ker- nel y otra vez F12. Como eres tán
espavilado habrás observado que la entrada y salida de
GetWindowTextA las hás realizado tantas veces como cajas
tiene la ventana de registro, no?. Buena observación.
Por lo tanto, el serial lo trata en dos partes
diferenciadas y no en una, asi el formato del serial no
es XXXXXXX-XXXXX XXXX, sino que XXXXXXX y XXXXXXXXXX sin
guión. ¿ok?. Sigamos.
Ya estamos de nuevo en la
rutina y ahora tenemos en ECX la dirección que guarda la
1º parte del serial, 9900990. Traceamos con F10 y
llegamos a la zona de comprobación del la longitud de
este serial. EAX=00000007. Esta es importánte porque en
muchos casos, si no has introducido la cantidad de
dígitos correcta el pro- grama te escupe hacia "la
cagaste, entra de nuevo el serial!". Aki puedes
hacer dos cosas, o bien sales de nuevo al Windows y
entras la longitud correcta o bien patcheas directamente
haciendo: CMP EAX, EAX / NOP, pero te aconsejo que asumas
la primera alternativa... En nuestro caso hemos acertado
porque la caja del serial admitia solo 7 digitos. :)
Asi pues, la rutina es; MOV
EAX, [EBP+0C] y MOV
EAX, [EAX+08]. ¿Te
situas? Ahora EAX=00000007. Yo siempre patcheo, el caso
es !mentir y joder! (lo hacemos cuando podemos XDDDD).
Continuamos con F10 aún es pronto para ver cosas raras,
y seguimos hasta que veamos esto: MOV EAX, [ESI+64], ALTO!!!!! Miramos en la zona donde
estan los *eax, *ebx, *ecx, arriba del c´digo y vemos
que *eax=472E724D, bueno, pues hacemos D EAX y vemos que aparece en la zona ASCII
mi nick. La siguiente instrucción es PUSH DWORD PTR [ESI+6C]. ¡Sitúate! MOV EAX, [EAX-08], EAX=0000000F (=Long. del nick). No
te pierdas, tio!. Le vamos dando a F10 hasta llegar a MOV EAX, [ESI+68], ¡¡¡¡ojo al parche!!!!. Entramos
en zona caliente? Creo que sí!.En la zona Watch vemos
que *eax=343332 31 osease que estamos sobre la 2º parte
del serial. Pulsamos F8 y entramos pa fisgonear en CALL [00425950], pulsamos F8 hasta llegar a: MOV ESI, [ESP+0C], miramos *ESI=30303939, sobre la 1º
parte del serial, ok??? le damos a F10 y ¡ATENCION!,
Area de Trabajo: MOVZX
EAX; BYTE PTR [ESI], y vemos en DS el primer digito de
la 1º parte del serial. Pulsamos F8 y MOV ECX, [EDI+40], miramos *ECX=200020, Una rutinilla
llenas de AND,s que va a pillar la primera parte del fake
serial y la va a metamorfosear en otra cifra. Aqui es
cuando paso de todo y me meto en el deo un F12 pa
abreviar, pero nos lo cuarramos con F10 pa que veas el
paisaje :). Pulsamos F10 y alcanzamos estas líneas de
código. Observa los valores que se almacenan en EAX con
cada instrucción, puedes hacer un ? EAX, para verlo.
Asi: 1º linea: LEA
EAX, [EAX*4+EAX] ,
2º línea: LEA
EAX, [EAX*2+ECX-30],
bueno si quieres te coges papil y lápiz y van anotando
los valores que se dejan en EAX . Al final de los saltos
El primer valor almacenado en EAX es 4B89DF = 4950495, y
el segundo es 9713BE = 9900990. Sigamos pues. Estos
valores se usarán mas adelante. LEA EBX, [ESI+60], miramos con D @EBX ó D *EBX, y aparece esto: FAE6DA1212. Pero,
¿Qué es?, no hemos visto ningún otro cálculo... no
impor- ta, si quisieramos hacer un keygen hubieramos
traceado desde muy atrás con F8 para descubrir de donde
coño sale esto. Bueno, MOV
[EBP-20], EAX, en
esta offset se al- macena el fake serial camiflado, EAX=
009713BE=9900990. Para situarte, si te has perdido, te
coloco esto como referencia: MOV DWORD PTR [ESP],
004313B0, seguimos pulsando F10 y pasamos, sin entrar
encima de CALL [Kernel32!Strlen]. Es pesadito, no?. Pues
más todavía. Nos metemos en todos los call con F8, Si
no te acuerdas, existe una cosa que se llama traceo, :) y
debes hacerlo si quieres pescar la puta rutina que genera
el serial. Traceamos hasta que nos encontramos en MOV
EAX, [ES`+01] = 472E724D, y vemos que es el nick.
Yastá!!!!! ¿Vés MOV DL, [ECX +EAX]????. Mira DS: Hay
un 4D, Es el primer carácter del nick.
Pues haces encima de esta instrucción un doble-click de
ratón y la conviertes en BPX. No movemos con F8. MOV
[EBP-0D], DL, almacenamiento en este offset de 4D.
Seguimos traceando:
MOV EDX, [EBP-1C]; Edx= F, Longitud del nick
MOV ECX, EDI; Ecx =1
MOV AL, [EDX+EAX+01]; AL = 5D = "]", último
carácter del nick.
IMUL ECX, EDI; Edi=Ecx=1;
MOVSX EDX, AL; Edx=5D="]"
ADD EDX, [EBP-20]; Miramos SS y vemos que contiene:
9713BE. Te acuerdas? Pues ahora Edx=9713BE+5D.
MOVSX EAX, BYTE PTR
[EBP-0D];
Eax = 4D, 1er. carácter del nick.
ADD EDX, ECX; Edx= 9714113+ Ecx=1
MOV ECX, 000000FF
ADD EAX, EDX; Eax=4D + 97141C = 971469
XOR EDX, EDX ; Pone a 0 Edx.
DIV ECX ; Divide Eax entre Ecx y el resultado
vá a Edx
MOVZX EAX, DL; Eax= 15.
PUSH EAX, Guarda Eax. Yá aparecerá este
valor por algún sitio :)
CALL 420AC6 Entramos ahí
con F8, tenemos que ir con cuidado y sin perder detalle
:) Para que te sitúes detrás del call viene ADD ESP,
0C. Entramos y vemos JMP [004252F8], Dos
F10 y vemos que en EAX se lamacena una dirección que
contiene 15. Jejejejeje Hacemos d EAX y
ahi está 15, Hacemos bpx 6A42A0 y pasamos del call
apareciendo en, JODER!!!! LEA EAX, [EAX*4+EAX] y LEA EAX,
[EAX*2+ECX -30] . ¿Te suenan? Hace rato estuvimos ahí.
Le damos a F10 para acelerar el asunto y alcanzamos el
offset 41BE90. ¡Vaya programita he escogido para joderos
la marra- na. ¿Eh?, heheheheh. Pero teneis que hacerlo,
a mi no me ayudaron tánto, jur. Tutos en yanki sobre
listado muerto y sin muchas explicaciones. Traceamos y
vemos que en DL se almacena el 2º carácter del nick, 72 ="r", por lo que de un
momento a otro re- petimos todo el ciclo expuesto hasta
ahora, asi que como vamos detrás de un serial y no un
keygen, damos al F10 hasta, mirad hacia los registros
arriba, que ECX =
6A4- 2A0 y EDX= 6A42A1, y ¡¡¡no os movais de ahí!!!!,
¿Véis en la zona ASCII el 15?, bien, pues pulsad F12 hasta que
veais que cambia el valor a 01, contad cuantas pulsacio-
nes dáis hasta que el cambio sucede. Hay valores que
puede repetirse. Id escribiendo en un papel los valores.
Tenemos esta secuencia: 15,
01, F4, 2C, 2C.
Nos ha dado una secuencia alfanumérica que solo cabe en
la casilla del 2º serial. Pulsamos F12 otra vez y
¡Boom! Mensaje de error: Es serial entrado no vale. Por
lo que vamos a entrar en la casilla del 2º serial la
secuencia que nos ha dado Sof-Ice: 1501F42C2C. Asi pues,
tenemos en Name:
Mr.GReeN [WkT!] y
en Serial Number:
9900990 - 1501- F42C2C,
Pulsamos ok y... "The
registration completed successfully". Pero como se- guro que
despues de este esfuerzo realizado lo querrás tener
registrado a tu nombre, jejeje, puedes empezar de nuevo
con el tute.
Analicemos ahora
GetWindowTextA:
1.- Entra y sale al Kernel
tantas veces como datos existan en las boxes de
registro-1 . En este caso 2 veces. En
la última no sale más al Kernel. ¿Ok?. Si hay 2 cajas
saldrá 1 vez y entrará en GetWindowTextA para no salir
mas. Esta regla es general. Puede que alguna vez se salta
pero será porque el developer haya hecho algun tipo
extraño de cálculo.
1.1.- Primera entrada en
GetWindow... controla la caja del Nombre.
2.1.- Segunda entrada en
GetWindow... controla 2 serial.
3.1.- Tercera y última
entrada controla el primer serial.
2.- Una vez dentro definitivamente, controla
longitudes de los datos entrados en las
cajas, si no son iguales, salta a rutina de "la
cagaste".
3.- Cálculo sobre el
serial o el nombre, no hay una regla
fija en el orden. Conversión de los datos en
HEXADECIMAL. Si primero es el Nombre, luego viene la
conversión del serial y viceversa.
4.- Traceado cuidadoso
en busca de la rutina de cálculo, casi
siempre es sobre el nombre. Buscad cuando el programa
pilla el primer carácter del nombre y tracead hasta ver
que hace con el resultado final: ¡Dónde lo almacena!.
¿¿Ok??
Aunque no lo creais, este
crack se tarda en hacer en 3 o 4 minutos :) Sólo hay que
sentir el código y el te dará la respuesta ;-)). Esto
suena a New Age!!
Pos bueno muchachos, la saga
de la captura del Serial Number continuará estudiando
otros diferentes métodos.
Y ya está todo
hecho Newbies ;-). AstalaVista
*±±========-*-*-*-* P E R S O N A L G R E E T Z *-*-*-*-========±±*
A todos los Crackers del pasado, del presente y del futuro.
|