Documentos de Académico
Documentos de Profesional
Documentos de Cultura
[ReVeRsEr]
Introducción
Bienvenidos otra vez a un nuevo tut...!!!. Esta vez con un nuevo crackme de mi amigo
Yllera. Cada día vamos mejorando en esto del ASM y este crackme es prueba de ello.
Como en el tut del carckme anterior, intentaremos conseguir el serial válido para
nuestro nombre y luego hacer el KeyGen.
Comezemos
Una interfaz muy mejorada respecto el crackme anterior,te quedo muy bonita Yllera XD
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 1
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
Ya sabemos que este es el EP (EntryPoint) del programa. Pero como vamos a conseguir
romper el programa para conseguir el serial. Pues bueno, hay varios caminos que
podemos seguir:
Cuando se trata de crackmes de este estilo, con poco código, cosa que no quiere decir
que sea fácil, al contrario, he tratado con crackmes como el de Enforcer o el de
eSn mIn que son bastante cortos pero que son terribles para crackear, sino mirenlos y
luego me cuentan, je.
Tenemos suerte, porque hay solo dos llamadas a GetDlgItemTextA, y sabemos que esta
es la api que habitualmente se usa para tomar los datos el nombre y serial.
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 2
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
Ahí podemos observar las dos llamadas a GetDlgItemTextA. La primer llamada es para
tomar el nombre y la segunda para tomar el serial. Luego de la segunda llamada a
GetDlgItemTextA viene una llamada a lstrlenA que se utiliza para tomar la longitud del
serial. Si la longitud es cero (0), quiere decir que no hay ninguna cadena en la EditText,
por lo tanto no llamara a la rutina de generación del serial que está en [401122], en
cambio si hay algo escrito en dicho Edit, procederá a generar el serial.
Nota: como una vez me dijo ‘KoaD, no hace falta tomar la longitud del serial
nuevamente dado que en la llamada a GetDlgItemTextA ya se toma una vez y queda
en EAX. Por lo tanto se podría hace de esta manera:
Pero uno por costumbre siempre lo hace, o por lo menos a mi me pasa. En fin
...sigamos.
Hemos metido nombre y serial, por lo tanto entraremos en la llamada y veremos esto:
0040118E $ C705 20344000>M OV DWORD PTR DS:[403420],0 ;M ueve un cero a una variable
00401198 . 33C0 XOR EAX,EAX ;Limpia EAX
0040119A . 33DB XOR EBX,EBX ;Limpia EBX
0040119C . 33C9 XOR ECX,ECX ;Limpia ECX
0040119E . A1 38344000 M OV EAX,DWORD PTR DS:[403438] ;M ueve el nombre a EAX
004011A3 > 8A81 38344000 M OV AL,BYTE PTR DS:[ECX+403438] ;Toma un carácter del nombre
004011A9 . 0AC0 OR AL,AL ;M ientars haya caracteres...
004011AB . 75 08 JNZ SHORT CrackM E2.004011B5 ;Va a la segunda comprobación
004011AD . 890D 8C344000 M OV DWORD PTR DS:[40348C],ECX ;M ueve a una varible el contador del bucle.
004011B3 . EB 07 JM P SHORT CrackM E2.004011BC
004011B5 > 0AC0 OR AL,AL ;Como no es el último carácter, incrementamos el contador para tomar el
siguiente carácter
004011B7 . 74 03 JE SHORT CrackM E2.004011BC
004011B9 . 41 INC ECX ;Incrementa el contador
004011BA .^ EB E7 JM P SHORT CrackM E2.004011A3 ;Vuelve al inicio del bucle
Bueno, sin mucha vuelta, lo que hace acá es contar la cantidad de caracteres del nombre
incrementando un contador. Una vez que ha terminado con todos los caracteres, mueve
el contador, en este caso ECX, a una variable.
Una vez que hemos pasado eso seguimos por esta parte:
004011BC > \33C0 XOR EAX,EAX ;Vuleve a lipiar los registros que utiliza en la rutina
004011BE . 33DB XOR EBX,EBX
004011C0 . 33C9 XOR ECX,ECX
004011C2 . A1 38344000 M OV EAX,DWORD PTR DS:[403438] ;Otra vez mueve el nombre a EAX
004011C7 > 8A81 38344000 M OV AL,BYTE PTR DS:[ECX+403438] ;Va tomando de a un caracter
004011CD . 8B1D 8C344000 M OV EBX,DWORD PTR DS:[40348C] ;M ueve la cantidad de caracteres del
nombre a EBX
004011D3 . 3BCB CM P ECX,EBX ;Se fija si ha tomado el último carácter....
004011D5 . 75 06 JNZ SHORT CrackM E2.004011DD ;Si no es el último..salta a generar el primer serial
004011D7 . E8 C5000000 CALL CrackM E2.004012A1 ;Llamada a la segunda parte de la generacion del serial
004011DC . C3 RETN ;Vuelve de la llamada anterior
004011DD > 3C 2F CM P AL,2F ; Switch (cases 0..F1) ;Aquí comienza con las
comparaciones ......
004011DF . 77 0C JA SHORT CrackM E2.004011ED
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 3
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
Bien, vemos que esta parte es bastante fácil. Lo que es ir comparando cada carácter del
nombre con algunas constantes....voy a explicar algunas:
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 4
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
004011DD > \3C 2F CM P AL,2F ; Switch (cases 0..F1) ;El carácter es mayor o igual que 2Fh?.....
004011DF . 77 0C JA SHORT CrackM E2.004011ED ;Si es mayor o esta por encima de 2Fh, salta a la otra
comparación...sino....
004011E1 . B8 31000000 M OV EAX,31 ; Cases ;M ueve 31h (1 en decimal) a EAX
004011E6 . E8 AA000000 CALL CrackM E2.00401295 ;Llama a una rutina....
Vemos que siempre hace este tipo de comparaciones...y que la rutina a la que está
llamando continuamente, salvo en la última comparación....es a [401295]. Si vemos que
hay en esa dirección, observamos esto:
esta subrutina es sencilla, solo va guardando los caracteres finales (luego de hacer las
restas, en algunos casos) del serial en la variable que ha destinado para ello.
Bueno, esto no se para que lo utiliza....veremos más adelante para que es útil o si es un
detalle menor que no influye demasiado.
Por que al inicio dije que con esto genera la primera parte del serial o el primer
serial?...pues porque este serial que genera no es el definitivo, sino que a partir de este
luego generara el serial definitivo y el que nos servirá para pasar todas las
comprobaciones.
Una vez que ha tomado todos los caracteres del serial, podemos hacer un Follow in
Dump en esta parte:
Ahí podemos ver el primer serial que se genera a partir de nuestro nombre.
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 5
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
Bien, básicamente, lo que hace acá es ir tomando uno a uno los caracteres del nombre y
los va comparando con dos contantes que son 2 y 3, hace su comparación y en base al
resultado tiene dos caminos para elegir:
Bien, si una vez que ha tomado todos los caracteres hacemos un Follow in Dump en
esta línea:
Hasta acá ya tenemos para ahcer el KeyGen, luego repasaremos lo que hace y lo
programaremos. También tenemos realizada la tarea de conseguir el serial, por
supuesto, si ahora vamos con este numerito y lo ponemos en el edit del serial con el
mismo nombre que antes, veremos que nos da las gracias....pero sigamos a ver que hace
luego.
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 6
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
Bien, en esta parte, lo que hace es lo mismo que al inicio de todo este lio. Como antes
contó los caracteres del nombre, ahora cuenta los caracteres del serial falso que hemos
metido nosotros. Luego recupera ambos valores, la cantidad de caracteres del nombre y
la cantidad de caractere del serial falso, los compara y si no son iguales, mueve un 1 a
esa variable que al inicio, no sé si recuerdan, no sabíamos para que utilizaba, parece que
la está utilizando como un tipo de flag, luego veremos para que.
Bien, pasada esa otra parte, vemos que hay tres rutinas, o subrutinas, ya no sé por donde
ando, je, que están seguidas unas de otras. Bueno, en la primer rutina veremos esto:
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 7
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
En esta parte lo que hace es a partir de nuestro serial, generar otro para luego usarlo en
la comparación. Es de suponer que si el serial es falso, no se generará lo que el
programa espera y nos hechará afuera con el RET, pero si el serial es el verdadero,
generara un serial idéntico al válido y luego los comparará carácter a carácter. Esta
subrutina se engancha con la que sigue. Nos importante para nuestra tarea de conseguir
el serial o de programar el KeyGen, pero si quieren entender bien como hace la
comparación sigan la ejecución del programa y entenderán lo que quiero decir.
Ahí lo que hace es tomar carácter a carácter nuetro serial válido y el falso generado
nuevamente en la rutina anterior y los va comparando. Si alguna comparación no diera,
se iría nuevamente a la runtina que utiliza como flag. Si todos las comparaciones
resultaron satisfactorias, el programa devía su ejecución a la parte en la que comienza a
generar el mensaje de felicitaciones. Al principio no sabía para que se utilizaba esto,
pero luego me di cuenta treceando con los datos válidos, je.
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 8
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 9
CrackME2 – Yllera by +NCR/CRC! [ReVeRsEr]
Vemos que a la salida del call, recupera el flag de la rutina que estaba en [40128ª] y la
testea con 1, si es igual a 1, señal de que el flag ha sido modificado, nos saca del
programa sin dar señal de mesaje de error, en cambio si el flag no fue modificado, lo
que hace es llevarnos a la zona en la que ya ha desencriptado el mensaje de
Felicitaciones y nos muestra dicha MessageBoxA.
Por lo tanto, pienso que con solo forzar un 1 dentro del flag con un injerto pequeño, nos
daría la posibilidad de que el crackme nos diera la posibilidad de registrarnos con
cualquier serial sea falso o verdadero dado que la comparación siempre daría
satisfactoriamente y así estariamos siempre en el mensaje de felicitaciones, je, yo lo he
probado y me ha funcionado perfectamente. Pero esa no es el objetivo de los crackmes,
con un programa suele ser distinto pues hay veces en las que calcular el serial resulta
bastante complicado y resulta más fácil modificar el código. Pero los objetivos de los
crackmes es que aprendamos.....
Bueno, esto se ha extendido demasiado, así que el keygen lo dejaremos para la segunda
parte.
Salu2.......
+NCR/CRC! [ReVeRsEr]
Agosto de 2004
reversing_ar@yahoo.com.ar http://www.joe-cracker.tk/ncr.htm 10