Cita de: ||MadAntrax||
Te ha resultado complicada la VM?
Te ha resultado complicado el algoritmo del keyfile?
Alguna sugerencia que me puedas indicar para mejorar? Espero con ansias algún tutorial (aunque sea cortito) destripando el keyfile_me, incluyendo también el "fallo" que has descubierto
Saludos y gracias por participar!!
1.- Mi opinión
La idea de usar una VM (Máquina Virtual) es muy interesante para evitar que te puedan desensamblar el código, sin embargo, la has usado en la mayoría de subrutinas. Esto en un Crackme no lo veo del todo bien, porque limitas la resolución a las personas que conozcan dicha VM. Me lo imagino como analizar un P-Code sin ninguna herramienta y desde cero: es muy difícil.
Por este motivo yo creo que el Crackme debería haber usado la VM en una sola subrutina, así se hubiese animado más gente a analizarlo.
Sobre la VM: es impresionante (yo me quito el sombrero ante la programación de este "bicho"), va cambiando y no es igual en cada compilación y no he visto en la red ningún tutorial sobre cómo desvirtualizar (desensamblar los opcodes) de la última versión (aunque lleva años sin actualizarse). Sin embargo, la protección de esta VM no es completa porque deja muchas cosas a la vista, por ejemplo, la IAT está intacta. Esto es un punto débil que he aprovechado.
2.- Solución SENCILLA
Está comprimido con UPX, yo lo desempaco con el mismo UPX (no hace falta pero se trabaja mejor y es muy sencillo):
Código:
C:\upx309w>upx -d keyfile_me.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.09w Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
864256 <- 791040 91.53% win32/pe keyfile_me.exe
Unpacked 1 file.
Llegas al OEP: 4013EC. Fíjate qué 2 funciones tenemos encima:
Código
CPU Disasm Address Hex dump Command Comments 004013BA .- FF25 CC104000 jmp dword ptr ds:[4010CC] ; MSVBVM60.__vbaFileOpen 004013C0 $- FF25 0C104000 jmp dword ptr ds:[40100C] 004013C6 .- FF25 C4104000 jmp dword ptr ds:[4010C4] 004013CC .- FF25 80104000 jmp dword ptr ds:[401080] ; MSVBVM60.__vbaStrCmp 004013D2 .- FF25 94104000 jmp dword ptr ds:[401094] 004013D8 .- FF25 7C104000 jmp dword ptr ds:[40107C] 004013DE .- FF25 8C104000 jmp dword ptr ds:[40108C] 004013E4 $- FF25 F8104000 jmp dword ptr ds:[4010F8] 004013EA 00 db 00 004013EB 00 db 00 004013EC > 68 5C1D4000 push 00401D5C 004013F1 . E8 EEFFFFFF call <jmp.ThunRTMain> ; Jump to MSVBVM60.ThunRTMain
Poco más queda por decir. Pon un BP en __vbaStrCmp (gran debilidad) y verás qué muestra la pila en la primera parada:
Código:
0012F8F0 004540C1 /CALL to __vbaStrCmp
0012F8F4 004033A0 |Cadena1 = ""
0012F8F8 002BD55C \Cadena2 = ""
0012F8FC 0012FAE8
0012F900 0012FBB8
0012F904 00000001
0012F908 00000000
0012F90C 00000000
0012F910 00000000
0012F914 00000000
0012F918 00000000
0012F91C 004083A4 keyfile_.004083A4
0012F920 00000000
0012F924 002BD5D4 UNICODE "\filekey.lic"
Parece que el archivo se debe llamar filekey.lic. Crealo en el mismo directorio del Crackme y en él escribe varias líneas (verás que necesita 7). Por ejemplo escribe esto:
Código:
Primera
Segunda
Tercera
Cuarta
Quinta
Sexta
Séptima
Y ahora reinicia el depurador y simplemente con un BP en __vbaStrCmp observa la pila. El Crackme estará resuelto:
1ª línea
Código:
0012F8F0 00454237 /CALL to __vbaStrCmp
0012F8F4 001D7D94 |Cadena1 = "Registration keyfile"
0012F8F8 001DD624 \Cadena2 = "Primera"
etc...
2.- Solución compleja analizando la VM
Analizar la VM desde cero sin nada de información, es muy difícil. He visto algún artículo interesante en inglés, pero tutoriales y ejemplos ninguno.
Sin embargo, existe un poderoso plugin para OllyDBG 1.10 (sin ayuda de cómo utilizarlo) que puedes descargar de aquí: http://tuts4you.com/download.php?view.3108
Su manejo tampoco es que sea muy sencillo pero verás que (por ejemplo) si pulsas el botón derecho sobre:
Código:
00403C70 .- E9 67F40C00 jmp 004D30DC ; keyfile_.004D30DC
Así comprobé que el número de líneas era 7, que algunos textos (líneas) del archivo de la licencia tenían que tener más de 3 letras porque si no llegaba a NULL, que existía un código que creo que descifra strings y a veces se utiliza más de 1 vez, que se utiliza StrReverse ... todo el pastel
Lo único que no he analizado son las 3 o 4 licencias.
Finalmente, para los menos experimentados, decir que muchas veces algo complejo (una VM lo es) puede solucionarse de forma muy sencilla como se ha visto hoy...
Saludos