--
ESTUDIO COLECTIVO DE DESPROTECCIONES | ||
![]() |
WKT Tutorialz Site | ![]() |
![]() |
![]() |
![]() |
progrAmA | File Compare Utility 3.0.002 | W95 |
DEsCripCi≤n | Programa para comparar ficheros. | |
tipo | Shareware (25 $) | |
url | http://www.oneysoft.com | |
protECCi≤n | Nag-screen si no estßs registrado. | |
DiFiCultAD | 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista | |
hErrAmiEntAs | SoftIce 3.22, JavaScript | |
oBjEtivo | Hacer un Generador de Claves (KeyGen). | |
CrACkEr | Mr.Brown | |
FEChA | 1 de Marzo de 1999 |
Introducci≤n |
El programa no tiene limitaciones por no estar registrado, pero aparece una nag-screen cada vez que se
arranca el programa. Hay una opci≤n para registrarse, introduciendo el nombre, la empresa y la clave.
El objetivo serß localizar la rutina de validaci≤n de la clave, comprenderla, y hacer un generador de claves. |
Al Atake |
Lo primero es ver c≤mo reacciona el programa al intentar registrarnos. Ponemos un nombre, empresa y clave cualquiera, y nos aparece un mensaje de clave incorrecta. El mensaje es el tφpico MessageBox de windows, lo cual nos facilita el poder acercarnos a la rutina de comprobaci≤n de la clave. Asφ pues, vamos al SoftIce(Ctrl+D) ,ponemos el breakpoint(BPX MessageBoxA) y volvemos al programa(Ctrl+D).
Intentamos registrarnos nuevamente para ver si nuestro breakpoint hace efecto.
Con un par mßs de F12 nos situaremos en 014F:00408FC0, y unas lφneas antes podemos ver una parte interesante del c≤digo : 014F:00408F9B 8B45E8 MOV EAX,[EBP-18] ;Clave 014F:00408F9E 8B4DE0 MOV ECX,[EBP-20] ;Empresa 014F:00408FA1 50 PUSH EAX 014F:00408FA2 8B55E4 MOV EDX,[EBP-1C] ;Nombre 014F:00408FA5 51 PUSH ECX 014F:00408FA6 52 PUSH EDX 014F:00408FA7 E854020000 CALL 00409200 ;ValidaClave 014F:00408FAC 83C40C ADD ESP,0C 014F:00408FAF 85C0 TEST EAX,EAX 014F:00408FB1 7531 JNZ 00408FE4 014F:00408FB3 6A11 PUSH 11 014F:00408FB5 A1DC5D4400 MOV EAX,[00445DDC] 014F:00408FBA 50 PUSH EAX 014F:00408FBB E8706B0000 CALL 0040FB30 014F:00408FC0 83C408 ADD ESP,08
Asφ pues, la validaci≤n de la clave introducida se hace en la rutina que empieza en :409200
Lo primero que hace, es verificar que la clave tenga exactamente 8 posiciones. 014F:00409200 56 PUSH ESI 014F:00409201 57 PUSH EDI 014F:00409202 33F6 XOR ESI,ESI ; ESI = 0 014F:00409204 8B7C2414 MOV EDI,[ESP+14] 014F:00409208 57 PUSH EDI 014F:00409209 FF1548A84400 CALL [KERNEL32!lstrlen] 014F:0040920F 83F808 CMP EAX,08 ;Clave de 8 posiciones? 014F:00409212 7405 JZ 00409219 014F:00409214 33C0 XOR EAX,EAX ;Clave incorrecta 014F:00409216 5F POP EDI 014F:00409217 5E POP ESI 014F:00409218 C3 RET 014F:00409219 8A07 MOV AL,[EDI] ;Comprueba letra 014F:0040921B 47 INC EDI 014F:0040921C 84C0 TEST AL,AL 014F:0040921E 743A JZ 0040925A 014F:00409220 C1E604 SHL ESI,04 014F:00409223 3C30 CMP AL,30 ;Entre '0' 014F:00409225 7C0C JL 00409233 ; .... 014F:00409227 3C39 CMP AL,39 ; y '9' 014F:00409229 7F08 JG 00409233 014F:0040922B 0FBEC0 MOVSX EAX,AL 014F:0040922E 83E830 SUB EAX,30 014F:00409231 EB1E JMP 00409251 014F:00409233 3C61 CMP AL,61 ;Entre 'a' 014F:00409235 7C0C JL 00409243 ; .... 014F:00409237 3C66 CMP AL,66 ; y 'f' 014F:00409239 7F08 JG 00409243 014F:0040923B 0FBEC0 MOVSX EAX,AL 014F:0040923E 83E857 SUB EAX,57 014F:00409241 EB0E JMP 00409251 014F:00409243 3C41 CMP AL,41 ;Entre 'A' 014F:00409245 7C3E JL 00409285 ; .... 014F:00409247 3C46 CMP AL,46 ; y 'F' 014F:00409249 7F3A JG 00409285 014F:0040924B 0FBEC0 MOVSX EAX,AL 014F:0040924E 83E837 SUB EAX,37 014F:00409251 03F0 ADD ESI,EAX ;A±ade letra a ESI 014F:00409253 8A07 MOV AL,[EDI] 014F:00409255 47 INC EDI 014F:00409256 84C0 TEST AL,AL 014F:00409258 75C6 JNZ 00409220 ;Bucle para las 8 letras 014F:0040925A 8B442410 MOV EAX,[ESP+10] ;Empresa (n║1) 014F:0040925E 50 PUSH EAX 014F:0040925F E83CFFFFFF CALL 004091A0 ;Calcula N·mero 014F:00409264 83C404 ADD ESP,04 014F:00409267 8BF8 MOV EDI,EAX ;EDI = n║1 014F:00409269 8B44240C MOV EAX,[ESP+0C] ;Nombre (n║2) 014F:0040926D 50 PUSH EAX 014F:0040926E E82DFFFFFF CALL 004091A0 ;Calcula N·mero 014F:00409273 83C404 ADD ESP,04 014F:00409276 03F8 ADD EDI,EAX ;EDI=n║1 + n║2 014F:00409278 03FE ADD EDI,ESI ;EDI=n║1 + n║2 + ESI 014F:0040927A 47 INC EDI ;EDI=n║1 + n║2 + ESI + 1 014F:0040927B 83FF01 CMP EDI,01 ;Assigna el BitDeAcarreo 014F:0040927E 5F POP EDI 014F:0040927F 1BC0 SBB EAX,EAX ;EAX=EAX-EAX-BitDeAcarreo 014F:00409281 5E POP ESI 014F:00409282 F7D8 NEG EAX ;Pone EAX=1 si Clave OK 014F:00409284 C3 RET 014F:00409285 33C0 XOR EAX,EAX ;Clave incorrecta 014F:00409287 5F POP EDI 014F:00409288 5E POP ESI 014F:00409289 C3 RET
Asφ pues, n║_Empresa + n║_Nombre + n║_Clave + 1 = 0 determina que la clave sea correcta. 014F:004091A0 56 PUSH ESI 014F:004091A1 57 PUSH EDI 014F:004091A2 33FF XOR EDI,EDI 014F:004091A4 8B74240C MOV ESI,[ESP+0C] 014F:004091A8 56 PUSH ESI 014F:004091A9 FF1548A84400 CALL [KERNEL32!lstrlen] 014F:004091AF 83F804 -- CMP EAX,04 014F:004091B2 7216 (1)| JB 004091CA 014F:004091B4 8BC8 | MOV ECX,EAX 014F:004091B6 C1E902 | SHR ECX,02 014F:004091B9 8D148D00000000 | LEA EDX,[ECX*4+00000000] 014F:004091C0 2BC2 | SUB EAX,EDX 014F:004091C2 033E | ADD EDI,[ESI] 014F:004091C4 83C604 | ADD ESI,04 014F:004091C7 49 | DEC ECX 014F:004091C8 75F8 -- JNZ 004091C2 014F:004091CA 83F802 -- CMP EAX,02 014F:004091CD 721C (2)| JB 004091EB 014F:004091CF 8BD0 | MOV EDX,EAX 014F:004091D1 C1EA01 | SHR EDX,01 014F:004091D4 8D0C5500000000 | LEA ECX,[EDX*2+00000000] 014F:004091DB 2BC1 | SUB EAX,ECX 014F:004091DD 33C9 | XOR ECX,ECX 014F:004091DF 83C602 | ADD ESI,02 014F:004091E2 668B4EFE | MOV CX,[ESI-02] 014F:004091E6 03F9 | ADD EDI,ECX 014F:004091E8 4A | DEC EDX 014F:004091E9 75F2 -- JNZ 004091DD 014F:004091EB 83F801 -- CMP EAX,01 014F:004091EE 720A (3)| JB 004091FA 014F:004091F0 33C9 | XOR ECX,ECX 014F:004091F2 8A0E | MOV CL,[ESI] 014F:004091F4 46 | INC ESI 014F:004091F5 03F9 | ADD EDI,ECX 014F:004091F7 48 | DEC EAX 014F:004091F8 75F6 -- JNZ 004091F0 014F:004091FA 8BC7 MOV EAX,EDI 014F:004091FC 5F POP EDI 014F:004091FD 5E POP ESI 014F:004091FE C3 RETLa rutina acaba devolviendo un valor en EAX. Para sus cßlculos, utiliza EDI para ir acumulando el c≤digo ascii de cada carßcter de la clave, de la siguiente manera : 1) Si la clave tiene 4 o mßs caracteres, acumula en bloques de 4 bytes en orden inverso. 2) Si quedan 2 o mßs caracteres no acumulados, se suman en bloques de 2 bytes en orden inverso. 3) Si queda alg·n carßcter no tratado, tambiΘn se suma.
Quizßs con un ejemplo se entienda mejor, asφ que veamos c≤mo actuarφa la rutina con el texto "WKT-ECD",
que en hexa es: 57 4B 54 2D 45 43 44 1) EDI=2D544B57 ;los 4 primeros bytes en orden inverso 2) +00004345 ;los 2 siguientes bytes en orden inverso 3) +00000044 ;el ·ltimo byte --------- EDI=2D548EE0 ;valor que devuelve la rutina |
El Generador de Claves (KeyGen) |
Ahora que ya hemos visto todo el proceso para calcular la clave, s≤lo nos queda hacer el Generador de Claves. Se puede utilizar cualquier lenguaje de programaci≤n para implementar la rutina, pero en este caso usaremos el JavaScript, que pese a no ser el mßs c≤modo, nos servirß para ver los resultados directamente desde esta pßgina web, sin tener que ejecutar ning·n programa. |
Para ver el c≤digo fuente del generador de claves, mirar la parte de JavaScript al principio del c≤digo fuente .htm de esta pßgina. |
[ Entrada | Documentoz GenΘricoz | WKT TEAM Main Site ] |
[ Todo el ECD | x Tipo de Protecci≤n | x Fecha de Publicaci≤n | x orden AlfabΘtico ] |