ESTUDIO COLECTIVO DE DESPROTECCIONES
Última Actualizacion: 25/10/2001

Programa Jammer v1.95 (Build 0811) W95 / W98 / NT
Descripción Programa anti Back Orifice / Net-bus, una joya
Tipo Serial number
Tipo de Tutorial [X]Original, []Adaptación, []Aplicación, []Traducción
Url http://www.agnitum.com
Protección 30 dias de prueba
Dificultad 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas SoftIce v4.0 (sólo)
Objetivo Obtención de un número de Serie y estudio de GetWindowTextA
Cracker Mr.GReeN
Grupo Whiskey Kon Tekila
Fecha 09 de Mayo de 2000

INTRODUCCION
En este tutorial vamos a examinar una simple rutina de generación de número de serie y estudiar el comportamiento de GetWindowTextA y los pasos a seguir hasta alcanzar un resultado amable... }:-[

Bien, al clickear sobre la ventana de registro nos encontramos que consta de Nombre, y un serial tipo XXXXXXX-XXXXXXXXXXXXXX pero solo conocemos la aparente longi- tud de la primera parte del serial. Entremos en materia.
AL ATAQUE
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.
[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers.
Si necesitas contactar con
nosotros , lee esto antes e infórmate de cómo puedes ayudarnos