Hola, estoy intentando crackear un crackme hecho en VB, utilizo el Olly y hago lo siguiente:
- El crackme tiene un cuadro de texto, debajo un botón y debajo un cuadro de texto en el que pone bien o mal si se hacierta el serial o no.
Sigo un tutorial de Coco en el que se explica que VB utiliza generalmente los registro EAX, ECX y EDX, y en el Olly se puede buscar el valor de estos.
Hay que hacer FIND COMMAND (control + F) y probar con alguna de estas CALL:
Visual Basic 5.0
CALL [EAX+000000A0]
CALL [EDX+000000A0]
CALL [ECX+000000A4]
Visual Basic 6.0
CALL [EAX+000000A0]
CALL [ECX+000000A0]
Poner un bp, F9 y tracear hasta llegar a:
API: MSVBVM60.__vbaVarTstEq (comparar cadenas)
entrar en esta Call ,tracear y donde pone PUSH 0, hacer CLIC DERECHO sobre el registro EAX,EDX o ECX (según que call se ha utilizado de las que estan escritas arriba) - FOLLOW IN STACK, y en la ventana STACK debería de poner el valor.
He probado esto con los registros EAX, ECX y EDX, pero no lo he conseguido. ???
Si alguien puede corregir algo de lo que he escrito o escribir algún otro procedimiento, estaré muy agradecido.
Saludos. ::)
Sigo sin encontrar el serial, :-[ estas son las funciones que utiliza el crackme:
MSVBVM60.__vbaChkstk
MSVBVM60.__vbaExceptHandler
MSVBVM60.__vbaFPException
MSVBVM60.__vbaFreeObj
MSVBVM60.__vbaFreeStr
MSVBVM60.__vbaFreeVar
MSVBVM60.__vbaFreeVarList
MSVBVM60.__vbaHresultCheckObj
MSVBVM60.__vbaObjSet
MSVBVM60.__vbaVarAdd
MSVBVM60.__vbaVarCopy
MSVBVM60.__vbaVarMove
MSVBVM60.__vbaVarTstEq
MSVBVM60.__vbaVarTstNe
MSVBVM60._adj_fdiv_m16i
MSVBVM60._adj_fdiv_m32
MSVBVM60._adj_fdiv_m32i
MSVBVM60._adj_fdiv_m64
MSVBVM60._adj_fdiv_r
MSVBVM60._adj_fdivr_m16i
MSVBVM60._adj_fdivr_m32
MSVBVM60._adj_fdivr_m32i
MSVBVM60._adj_fdivr_m64
MSVBVM60._adj_fpatan
MSVBVM60._adj_fprem
MSVBVM60._adj_fprem1
MSVBVM60._adj_fptan
MSVBVM60._allmul
MSVBVM60._CIatan
MSVBVM60._CIcos
MSVBVM60._CIexp
MSVBVM60._CIlog
MSVBVM60._CIsin
MSVBVM60._CIsqrt
MSVBVM60._CItan
MSVBVM60.EVENT_SINK_AddRef
MSVBVM60.EVENT_SINK_QueryInterface
MSVBVM60.EVENT_SINK_Release
MSVBVM60.rtcMidCharVar
MSVBVM60.ThunRTMain
Yo he utilizado esta función para buscar el serial como he escrito arriba:
MSVBVM60.__vbaVarTstEq
¿En que otra función se podría encontrar el serial?
Conozco al creador del crackme y me ha dado una pista:
1- No ha utilizado IF- END IF para la comprobación del serial bueno con el malo.
2- Ha utilizado SELECT CASE- END SELECT
¿Puede esto haber complicado más encontrar el serial?
Cuando busco las referencias de cadenas de texto, me aparece algo sospechoso: ASCII "xxxx"".
No se porque me aparece asi, porque en otros crackmes aparece el serial, pero en este no. ???
Espero vuestra ayuda.
Gracias de antemano.
Saludos.
Hola, aquí os dejo el enlace del Crackme #1 by P@KO: ;D
http://s6.yousendit.com/d.aspx?id=1XTSWOQLNO66D0T9YXDJYTTEJD
Este enlace será funcional durante los siguientes 7 dias desde hoy.
Probad a crackearlo y si podeis encontrar el serial, poned la solución. ;D
Saludos.
Buenas, antes que nada recordar que odio visual basic, por lo tanto mi entendimiento es bastante pobre, acepto cualquier corrección o sugerencia
ANALISIS PRELIMINAR
Abrimos el crackme y vemos un lugar para poner contraseña, un botón que se llama command1 ( :P) y otro lugar. Ponemos serial 234567890, presionamos botón y dice mal (para eso era la 2º caja). Abrimos el PEID y nos dice que no sta comprimido ni nada raro, abrimos Smart Check.
CRACKING...
Corremos el Crackme (desde ahora CM) ponemos serial chungo, click en command1 y cerramos el CM. El Smart check ha registrado todos los eventos, nos interesa el que dice _Click.Expandimos, y ponemos show all events en el menú view.
Mirando un poco vemos que hay muchas funciones sospechosas como _vbaVarTstEq entre otras, pero si agudizamos más la vista ( ::)) vamos a notar que una función (_vbaVarTstNe) engloba muchisimas "cosas". Nos vamos a View y tildamos "arguments" y vemos que al lado de la función dice String:"2" y después En Variant: Const Integer:1
En este punto sospecho que es una comparación de mi primer caracter con un 1 (porque dice const integer), lo que hago es volver a correr el CM pero esta vez pongo como primer caracter del serial una "a" y oh sorpresa, en _vbaVarTstNe nos dice String:"a" , Variant: Const Integer:1
Pero luego de eso tenemos la cadena mal y se acaba todo. Pensamos, pensamos y por lo primero que optamos es por hacer que el primer caracter de nuestro serial chungo sea 1.
Volvemos a correr el CM, ponemos 1234567890 y cuando vamos al Smart Check vemos que esta vez hay dos _vbaVarTstNe en la primera se compara 1 con 1 y en la segunda 2 con 3 :P. Lo que hacemos entonces es ir haciendo coincidir cada uno de los caracteres de nuestro serial con
el que nos va mostrando la función y deducimos que los caracteres que importan son los 4 primeros, es decir que no importa el serial que sea siempre y cuando contenga 4 caracteres determinados al principio
Entonces el serial es 1346********
Saludos
Hola 4rS3NI(, muchas gracias por encontrar el serial y explicar de forma clara como lo has hecho. ;D
Si alguien más sabe como encontrar el serial utilizando el Ollydbg o el SoftIce, que lo escriba si quiere, para poder saber que otras formas hay de conseguir el serial aparte del siempre útil SmartCheck.
Saludos. ;D
Hola, yo lo hice de la siguiente manera:
Con el PEiD lo examine y me dice Microsoft Visual Basic 5.0 / 6.0, entonces lo descompilo con el w32dasm y el plugin para VB, ahí busco las str ref, en mi caso solo hay 3, VB5!, mal, y bien, doble clic en 'mal' y me manda a 004021DE, un poco arriba de eso veo que hay 4 referencias a este, o sea que desde 4 lugares distintos salta hacia acá:
401FC5, 40205E, 4020F7, 402190
Con el sice pongo un breakpoint en el primero 401FC5, un poco arriba de eso veo que antes de la llamada a vbaVarTstNe se mueven unos valores a la pila,
MOV DWORD PTR SS:[EBP-A4],1 <-- valores a comparar
MOV DWORD PTR SS:[EBP-AC],EDI <-- valores a comparar
CALL DWORD PTR DS:[40107C] <-- llamada a vbaVarTstNe
TEST AX,AX
JNZ 004021C5 <--Salto a mal
Lo que me lleva a pensar que el primer dato del serial es 1, luego en las restantes 3, siguiendo la misma técnica, se mueven los datos, 3, 4, 6, o sea que el serial es: 1346
Saludos!
Hola xkill, mucha gracias a ti también por escribir como lo has hecho, yo utilizo más el Ollydbg y he podido ver claramente como el programa hace la comprobación.
Saludos. ;D