Como
siempre fundamental prepararnos el terreno para tener todo a mano, hacemos una copia de
vzprp.exe con el nombre cvzpre.exe y cargamos nuestro debugger softice o TRW2000 (da
igual), ahora nos haremos con toda la informacion posible sobre la victima, existen muchos
programas que nos dan informacion sobre el encabezado PE y el compilado de la victima yo
uso el File Analicer, solo tenemos que pinchar con el mousse una copia de la victima osea
cVzprp.exe y arrástrarla sobre fa.exe el resultado es:
A simple vista ya sabemos que vzprp.exe
no esta empakado y no esta protegido contra desensamblado, de estar protegido tendriamos
en la seccion CODE, Flags un valor de C0000040 (para mas informacion sobre encabezados PE
leer los trabajos de nuMIT_or explica paso a paso y detalladamente todo lo que veis en la
imagen.)
Bueno ya sabemos algunas cosillas, no
tendremos ningun problema a la hora de desensamblarlo (por lo general) ahora debemos
averiguar que limitaciones tiene la victima, solo con leer en la ayuda del programa su
autor nos dice ya cuales son las restricciones que segun dice son: un horrible NagScreen
cada 1.000.000 de password en modo brute force y en otros modos cada 100.000 password, por
si acaso lo comprobamos no valla ha ser que sea un pequeño engaño para despistarnos a la
hora de crackearlo, y bueno yo por mas pruebas que hago me escupe el nag cada 10.000.000
de password en brute force y cada 10.000 password en otros modos Mnnnn que mariconcete
jeje.
Como atacamos a este programa??
aparentemente no parece que sea muy dificil no esta comprimido, no tiene proteccion
antidasm y tampoco antidebugger (lo se, por que tengo el Softice cargado y puedo ejecutar
la victima sin ningun problema)asi que veamos si encontramos en las String Ref algo
interesante, procedamos a desensamblarlo con W32Dasm, ya esta ?? pues guardalo como
proyecto para no tener que desensamblarlo de nuevo, pulsamos sobre [String-Ref]
y no veo nada interesante, vaya putada, se me ocurre tracearlo con Apis32 , este programa
da mucha informacion y suele ahorrar mucho trabajo. Ya os habreis dado cuenta de que
nuestra victima nos da la opcion de registrarnos mediante el tipico Name / Serial, asi que
igual guarda en el registro de Windows la informacion del registro si es asi Apis32 nos
dara informacion sobre ello, ejecutamos Apis32 y cargamos vzprp.exe como lo que nos
interesa es ver que hace en el registro de Windows borramos todas las apis que tengamos
para monitorear en apis32 y metemos solo las que tienen que ver con el registro de
Windows, que como lo hago ?? veamos un gif de Apis32:

Para borrar todas las apis que hay en la
ventana pulsamos el boton Del all ya
tenemos la ventana en blanco, sin ninguna api, ahora tenemos que meter las
correspondientes al archivo Advapi32.dll que es el encargado de gestionar las apis basadas
en el reg de Windows, pulsamos Add y nos dara a elegir entre algunos
archivos.fnl seleccionamos advapi32.fnl y pulsamos la
opcion Add all y ya tenemos agregadas todas la apis, tambien
podemos agregarlas de otra forma pulsamos la opcion Imports y
veremos todas las apis que manejara nuestra victima podemos agregarlas una a una :) pero
creo que es mas comoda la primera opcion, ahora pulsamos Run
y veamos que ocurre cuando se este ejecutado vzprp.exe intentamos registrarnos mediante
Help Register y nos escupe el mensaje de que los datos no son validos, ahora veamos la
ventana del apis32 se aprecia claramente que solo toca el registro de Windows al iniciarse
el programa asi que antes de cerrar nada pulsamos en save log para guardar los eventos creados hasta ahora, los demas no nos importan y
cerramos todo el apis32 y vzprp.exe, ahora editemos el archivo vzprp.log que ha creado
Apis32 en el directorio donde tenemos intalada la victima, entre todo lo que hay lo unico
que me parece algo interesante es:rdar los eventos creados hasta ahora, los
demas no nos importan y cerramos todo el apis32 y vzprp.exe, ahora editemos el archivo
vzprp.log que ha creado Apis32 en el directorio donde tenemos intalada la victima, entre
todo lo que hay lo unico que me parece algo interesante es:
son estas lineas que cuando el programa se
inicia parece que chekea en el registro si estamos o no registrados, fijaros en esta
ultima linea donde RegQueryValueExa Chekea "Key" el
sitio dode podria estar la clave de registro si seriamos usuarios registrados como tenemos
la direccion de memoria donde ocurre esto vallamos al W32dasm e intentemos modificar
codigo para que reciba el valor contrario al que esta recibiendo de "Key" como se ve, la direccion de memoria es 0047522E veamos que encontramos en ella, y si os fijais es una direccion que se
repite bastante en el log (igual sacamos algo interesante :)) bueno pues buscamos y
encontramos:

aqui tenemos la api y su correspondiente
codigo, la direccion que hemos buscado nos muestra una llamada (call
00406740) pulsemos sobre [Call] y veamos que hace:

Aqui lo no hace mas que saltar a un valor
lejano y hacer algunas operaciones en advapi32.dll y retorna enseguida asi que vamos a ver
que hace la siguiente llamada (call 00474fac) nos situamos
encima y pulsamos sobre [Call] :

Aqui es donde podemos manipular e invertir
el valor de que recibe de "Key" en esta
instrusión cmp eax,000001 pone a 1 el flag con lo que hace que jne
00474fb4 se ejecute osea que salta a esa direccion y evita el retorno (ret) que le
sigue, bueno pues invertimos el salto para ver que pasa (aclaracion,
este proceso no es mas que una valoracion para ver como y por donde podriamos atakar a el
programa) tenemos que cambiar 00474faf
7403 jne 00474fba por 00474faf 7503 je 00474fba para hacerlo vamos a nuestro editor hexadecimal y mediante el offset de
esa instruccion que es 743af localizamos la instruccion en valores hexadecimales 7503 B001
cambiamos por 7403 B001 salvamos y probamos el resultado (recordare que estas
modificaciones las hacemo en una copia de vzprp.zip) redobleeeeee ejecucion y..... VaYA !!
el mensaje de "Unregistered version!" que canta nada mas ver el programa a desaparecido y en su lugar
vemos "System messages",
es una buena señal probemos a hacer alguna prueba, pero ohh todo sigue igual, que coño
hacemos ahora bueno de momento dejamos los cambios que hemos hecho por lo menos ya no
canta tanto el mensaje rojo ese y el programa funciona igual osea que algo hemos
adelantado je, hay que ser optimistas :).
Cambiando la tactica,
sabemos que cada 10.000.000 de password sale el Nag no? pues pasemos a hexadecimal ese
numero y rastreemos en busca de la instruccion que que chekea el asunto, 10.000.000 en
Hexadecimal es = 989680 haber si tenemos suerte y encontramos coincidencias, metemos el
numero en la opcion buscar (la linterna) Bien !! tenemos suerte y encontramos la primera,
ademas tiene toda la pinta de estar hay para hacer esa comprobacion :)

Y tenemos un bonito salto que si queremos
la puede evitar jeje pues no se hable mas y adelante convirtamos ese condicional a un
incondicional ousease jne por jmp el cambio a realizar (para los que no os empapais mucho todavia)
:00484DCA 0F85E5000000
jne 00484EB5 por :00484DCA E9E6000000 jmp
00484EB5
Que como se que el valor E9E6000000 Corresponde a un salto
incodicional a la mima direccion de memoria (00484EB5) que nuestro :00484DCA 0F85E5000000 jne 00484EB5 , bueno en casi todos mis manuales lo
explico asi que este por se el nº17 no lo explicare, si alguien tiene dudas que consulte
los anteriores, creo que en casi todos esta explicado. Bueno a lo que vamos metemos la
direccion del offset 841CA en el editor hexadecimal y veremos
0F85 E500 0000 lo cambiamos por E9E6 0000 0090 Que que pinta ese 90 puesto
hay?? pos muy facil tenemos que sustituir 6 bytes pero al cambiar el salto a un salto
incondicional este solo se representa con 5 bytes entonces lo que hacemos es anular el
sexto. Bueno una vez realizados los cambios probemos, hacemos una prueba y OK el Nag que
escupia cada 10.000.000 de passwords ya no es un problema jeje. Ahora seria igual de facil
localizar la rutina que chekea que salga el nag cada 10.000 pasword, seria lo mismo pasar
a hexadecima 10.000 (que son = 2710) y buscar las posibles coincidencias,
pero ojo 2710 es una cifra que nos la vamos a encontrar muchas veces, por que la busqueda
no va a mostrarnos solo las coincidencias de la instruccion relacionada, sino que nos va
ha mostrar todas esto incluye direcciones de memoria etc. pero esto no es ningun problema
ya que es bien facil distinguir cual es solo tenemos que descartar las que aparezcan en
direcciones de memoria y buscar las que coincidan con el valor de una instruccion (push
00002710 o Mov xxx,00002710 etc.) pero eso que el valor sea exacto a 2710, bueno pues a
partir de aqui si quieres puedes seguir por este camino o podemos cambiar la tactica e ir
a por algo mas seguro, Me explico.
Sabemos que cada cierto
numero de comprobaciones saca un nag, nosotro hemos manipulado la instruccion que chekea
la comprobacion de 10.000.000 de password, pero tiene que haber una instruccion encargada
unicamente de que salga el nag y que se pueda modificar sin necesidad de que afecte a
otras instrucciones, asi que busquemos esa instruccion y veamos de que va, sabemos que esa
instruccion esta relacionada con el salto que hemos manipulado no?? pues solo tenemos que
tracearla paso a paso con nuestro debugger y observar en que preciso momento lanza el nag,
que os parece?? es por cambiar de tactica y aprender algo mas, pues al atake:
Cargamos nuestro debugger
preferido (softice o TRW2000) y seleccionamos vzprp.exe (pero qque sea virgen, osea una
copia sin manipular) la cargamos con el debugger y ponemos um break point en la direccion
del salto manipulado osea
:00484DCA 0F85E5000000 jne 00484EB5
BPX 00484dca
[RETURN]
Algunas obserbaciones: el primer nag
saldra cunado chekee 10 millones de password con lo cual si ponemos el Break Point nada
mas empezar a chekear password nos podemos morir hasta dar con la instruccion que lanza el
nag ya que pasara por esa direccion de memoria 40.000 veces (por decir algo) entonces
mejor de momento no ponemos el Brak Point y corremos Vzprp.exe desde el debugger, y y lo
hacemos que testee cualquier zip protegido estamos atentos para cuando llegue a mas
o menos 9.999.999 pasword comprobadas interumpimos el proceso
pulsando [Ctrl + D] los que utilizais Softice o [Ctrl + N] los que ulilizamos TRW2000 y eso, se trata de interrumpir
el proceso lo mas cerca posible a 10 millones, yo lo he parado en 9.931.363 ahora es cuando ponemos el Brak Point a nuestro salto :00484DCA 0F85E5000000 jne 00484EB5
BPX 00484dca
[RETURN]
si os habeis quedado bastante alejados de
10.000.000 vamos pulsando F5 hasta que nos hacerquemos un poco, para saber cuanto os vais
acercando pulsais F4 y mirais , pulsais nuevamente F4 y otra vez a softice, ahora vamos
traceando con F10 hasta que salte el nag con tener pulsado F10 es suficiente (es para ir
mas rapidos) y derrepente boom!! el nag atencion ahora pulsamos en OK y nos devuelve al
softice justo debajo de la instruccion que ha sacado el nag que si todo os ha ido bien al
pulsar OK aparecereis en:
00484E6A 8B45EC
mov eax, dword ptr [ebp-14]
00484E6D 8B10 mov edx, dword ptr
[eax]
00484E6F FF92D8000000 call dword ptr [edx+000000D8]-- Esta es la responsable del Nag
00484E75 83F802 cmp eax,
00000002 -- Aqui aparecemos al pulsar OK en el Nag
00484E78 750E jne
00484E88
Bueno pues ya hemos localizado quien saca
el maldito Nag ahora solo tenemos que eliminar esa instruccion (ah acordaros de borrar el
break point del softice), para hacerlo localizamos el offset que es 8426f y vemos FF92 D800 0000 asi que para eliminar la instruccion lo sustituimos por 9090 9090 9090 salvamos los cambios y probamos, je hemos tenido exito ya no hay nag,
ohhh pero ahora nos sale el de las 10.000 password, que quiere decir esto?? pues que
posiblemente existan mas instrucciones iguales en otra parte del codigo, pero buscarlas es
bien sencillo solo tenemos que coger el valor hexadecimal de
call dword ptr
[edx+000000D8] que era FF92D8000000 y buscar todas las coincidencias en el W32dasm, pos vamos
alla, y aparecen 16 coincidencias Mnnnn son muchas solo una de ellas seguramente es la que
sacara el nag de las 10.000 pasword, Como sabemos cual es?? muy sencillo, apuntemos las
direcciones de memoria en donde se encuentran todas las coincidencias en mi caso han sido
en
454239
454515
45CD26
48310B
483130
484E6F
485196 -- a este no hace falta poner un BP, ya lo hemos
eliminado.
487FC8
48A829
48BCB3
48C035
48C92D
48CB40
48D34F
48D6A8
48D744
Ahora solo tenemos que
poner unos Break Points a todas estas direcciones y correr el programa, cuando salga el
nag se interrumpira el proceso y se parara en una de esas direcciones en la que se pare es
la encargada de escupir el nag de las 10.000 password seguimos los mismos pasos que con el
anterior (osea la anulamos con 90s)y ya esta, tenemos el programa 100 x 100 funcional,
jeje y con la primera operacion del registro de windows que hicimos al comienzo del manual
hemos eliminado hasta el unrregistered version :-).
Bueno espero que os sirva
para ampliar algo vuestros conocimiento, he intentado dar a entender que siempre se pueden
tomar varios caminos mientras estamos crackeando un programa, se trata de ir valorando
mientras lo trabajas y pensar en todas las posibilidades, yo siempre os recomiendo que no
sigais siempre los mismos atakes intentar pensar e imaginar otras formas de atakar, este
programa tiene muchas mas maneras de atakarle, como siempre es un placer escribir para
vosot@s
Cualquier duda, critica,
sugerencias
Email
http//welcome.to/karpoff http://members.xoom.com/kf_karpoff
Saludos a todos y
especialmente a TNT!,KUT ,WKT ,TUTORIAL LETAL ,KarlitoxZ ,Esiel2 y a todos los que me
envias vuestros emails con dudas e ideas.
karpoff /TnT!Cracker
Este material es solo para
uso educativo.
|