Crackear un programa con serial
-
Upload
comandpromt -
Category
Software
-
view
45 -
download
1
description
Transcript of Crackear un programa con serial
CRACKEAR UN PROGRAMA CON SERIAL
En esta seccion aprenderemos un metodo habitual y general de cracking de
programas con una pobre proteccion que consiste en un simple serial (en este
caso los que, despues una serie horrorosa de operaciones sobre el nombre,
acaban en una simple comparacion). Os vuelvo a repetir que esto es una simple
guia, no creais que va a funcionar en todos los programas, vosotros sois los
que debeis estudiar el codigo. Antes de nada deciros que para este cursillo
voy a usar como desensamblador el Win32Dasm y que voy a dar por sabido el
cómo usar el Win32Dasm y el SoftIce (SICE); para su uso hay otra seccion
mas adelante.
Programas con una proteccion tan pobre pueden ser: mIRC
(http://www.mirc.co.uk), WinZip (http://www.winzip.com), Hex WorkShop
(http://www.bpsoft.com), etc.
Para empezar, corremos el programa y vemos que nos pide que lo registremos,
y para ello nos pide un Nombre y un Numero de Serie, los cuales no sabemos
:-( Joder!!! Pues este programa me gusta y me lo quiero quedar asi que lo voy
a "petar" :-]
Para ello tenemos dos opciones:
1. Correr el Win32Dasm y desensamblarlo.
- Lo primero que os aconsejo es hacer una copia de fichero con el que vayas a
trabajar por seguridad mas que nada ;-)
- Una vez desensamblado corremos de nuevo el programa e introducimos un
nombre y una clave (Nombre: Mr_Burns Serial: 1234567890) le damos al OK
y nos dice "Wrong Password" (o algo por el estilo :-)) Bueno, pues apunta esa
frase!
- Volvemos al Win32Dasm y en la seccion de String Reference buscamos esa
cadena. Ahora le haces un dobleclick nos llevara a la direccion donde esta esa
cadena, lo normal es volver a darle un dobleclic ya que puede haber varias
referencias a esa cadena. Si al hacer eso os vais a otra direccion, volveis a
hacerlo hasta que llegueis a la primera. Espero que no haga falta decir que
debemos apuntar esas direcciones (o address, como querais decirlo).
- Antes de continuar, hay otra posibilidad... que no encontremos esa cadena
en String References :-( Para ello hay otra solucion: Le damos a buscar texto
(en el boton ese que tiene una linterna) e introducimos el texto. Si lo
encontramos estara, normalmente, al principio del programa y delante de esa
cadena veras algo como "ID=0075". Eso es que en ese sitio esta la referencia
a esa cadena asi que le damos nuevamente a buscar texto y ponemos ese
"ID=0075" y nos llevara ahi. En este momento estaremos en la misma
direccion que si le hubieramos encontrado en el Reference String y le
hubieramos hecho dobleclic.
- Una vez en la direccion de la cadena debemos buscar mas arriba un salto,
(JMP, JNE...) o una llamada (CALL). Algo parecido a esto:
* Referenced by a (U)ncondicional or (C)ondicional Jump al Address:
|: 0040CA91 (C), :00402809 (U) <-- Como podeis ver (C) es condicional y (U)
es incondiconal
|
* Referenced by a CALL at Address
|: 0000457FBA <-- Esto es una referencia a una llamada
|
- Estas referencias a llamadas y saltos significan que en otra parte del codigo
hay un salto que lleva aqui, si son condicionales saltan ante una comparacion,
es decir, comparan dos numeros, si son iguales sigue sino viene aqui o
viceversa. ¿Lo pillais? Al ser esta una cadena que nos dice que la password es
incorrecta, en alguno de estos saltos debe haber algo asi. Por ello debemos ir
a ellos y mirar el codigo que esta alrededor de ese salto. A lo mejor
encontramos algo parecido a esto:
xor eax,eax <-- Borra EAX
call 00495870 <-- Hace una llamada. Lo habitual es que esta sea la que
genera el codigo verdadero
pop ecx <-- Devuelve nuestra pass 1234567890
cmp eax,ecx <-- Compara EAX (con la pass verdadera) y ECX (con nuestra
pass)
jne PasswordIncorrecta <-- Si no son iguales te salta a la ventana de "The
Password is Wrong"
PasswordCorrecta <-- Si es igual, el programa queda registrado
- Espero que vayais entendiendo lo que os quiero decir. Lo que a mi se me
ocurre es cambiar ese salto JNE a JE asi al compararlas y ver que no son
iguales continue para registrar el programa. Este metodo tiene un fallo, y es
que si introducimos un serial correcto nos salta a la ventana de "Wong
Password", pero nada es perfecto :-)
- Otro metodo que podemos usar es hacer que esto:
cmp eax,ecx <-- Compara EAX (con la pass verdadera) y ECX (con nuestra
pass)
se convierta en esto:
cmp ecx,ecx <-- Compara ECX (con nuestra pass) y ECX (con nuestra pass)
y asi es mucho mas limpio xDDDDDD
- Para hacer los cambios que hemos dicho podemos meternos en el SICE
(entiendo que sepais usarlo :-) aunque habra una seccion del SICE!!) o usar el
debugger del Win32Dasm y probar que ese salto sea el que compruebe las
Password (ya no siempre va a ser tan facil ;-))
- Pero la cosa no se queda aqui, los programadores son tontos pero no tanto
:-] La mayoria de las veces que hacemos ese cambio en el salto y lo dejamos
fijo (es decir que modificamos el fichero con un editor hexadecimal) lo
corremos metemos nuestro nombre y cualquier codigo, nos dice que esta
regitrado pero... no os emocioneis tanto porque si lo volveis a correr, lo
habitual es que, vesis que os vuelve a pedir registro :-[
- Para subsanar esto ( joe que intelectual me ha quedado) lo que a mi se me
ocurrio en mi tiempo es entrar en la llamada de generaba el codigo real (os
acordais¿?) y ver las Referenced Call que habia. Pues eso, lo haceis y
apuntais esas Call. Despues nos vamos al SICE y ponemos un BPX en cada una
de esas llamadas y corremos el programa (F5) y antes de empezar... BOOM!!
el SICE salta!!! Pero que pasa!!! Pues que al programador se le encendio una
bombilla y se le ocurrio la MAGNIFICA idea de comprobar el serial correcto
con el que tu has introducido cada vez que corrieramos el programa y el
cambio que nosotros hicimos es tan solo para que nos apareciera una bonita
win que dijera "Thanks for register this program!!" xDDD asi que en el SICE
veremos algo parecido a esto:
CALL 00495870 <-- Llama a la rutina que genera al codigo
cmp eax,ecx <-- Compara el codigo que introdujimos la otra vez con el
verdadero
jne 00424344 <-- Si no es igual MALOOO!!!
- Hay ocasiones en las que el metodo anterior no es posible porque los
programadores, como un pobre medio de proteger sus creaciones, incluyen
gran cantidad de CALLs basura que no siven para nada y que nos volverian loco
si quisieramos parchear todas. Por ello, deduje un nuevo metodo, el cual no
siempre funciona, y es simplemente parchear esa rutina en vez de parchear la
call; me explico, para que leches voy a parchear 5 CALLs (por ejemplo) que
apuntan a una misma rutina cuando puedo parchear la propia rutina!!! ¿Lo
entendeis? Este metodo no siempre funciona, hay veces que provoca error en
el programa pero por probar que no quede ;-D
- Esto es siempre igual asi que una de dos, o cambiamos ese JNE por un JE ó
hacemos que ese CMP EAX,ECX se convierta en un CMP ECX,ECX.
- Despues de comprobar estos cambios y ver que una vez registrado lo
volvemos a correr y sigue registrado usamos el editor hexadecimal para fijar
lo datos. Y despues de tanto rollo ya teneis vuestro primer programa
crackeado!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2. Usar el SICE inmediatamente:
- Despues de haber instalado el programa y haberlo estudiado un poco
entramos en la seccion de registro donde nos pide un nombre y un serial, los
cuales rellenamos como queramos para ver que pasa. Lo mas habitual es que
nos aparezca una ventanita que nos diga "Wrong Password".
- Lo quee haremos es volver a la ventana de registro e introducir lo datos de
nuevo, pero antes de darle al Ok, nos metemos en el SICE (Control + D) y
ponemos un par de breackpoints: bpx getdlgitemtexta y bpx getwindowtexta
(los que no sepan de que va que miren la seccion de cómo usar el Softice).
Despues le damos de nuevo a Control + D para salir del SICE. Ahora es
cuando le damos al Ok y, lo mas seguro, es que nos salte de nuevo al SICE.
Una vez dentro salimos de las llamadas que hay hasta llegar a algo que posea
esto call [GetWindowTextA] ó call [GetDlgItemTextA]. Una vez ahi lo que
debemos hacer es tracear (F10) hasta que encontremos un salto que nos lleve
a la ventana de "Wrong Password"; eso suele ser un salto condicional, por ello
debemos apuntar la direccion de ese salto.
- Repetimos la operacion hasta llegar al salto apuntado anteriormente y lo
cambiamos como nos venga ( JE --> JNE o asi) y le damos al F5. Lo mas
seguro es que esta vez te salga la ventana de "Thanks for register this
program". Despues de esto, yo solia entrar en el Win32Dasm y hacer lo mismo
que en el paso 1º (con win32Dasm).
- Este metodo nos puede servir para programas que no realizan ninguna
accion, enseñar una ventana o un beep..., si el serial es invalido, por allo no
nos podmeos basar en una cadena como "Wrong Password". Asi con este
metodo podemos ver la direccion en la que se encuentra el escaneo del serial.
-TRUCO: Un truco que descubri (que de truco nada, simple ingenio y pensar),
es que cuando nosotros ponemos un bpx GetWindowTextA despues de
introducir nuestro Nombre, Compañia y Serial, y nos salta, lo primero que
salta no es el escaneo del serial sino el del Nombre, por ello cuando os salte a
la primera dadle al F5 las veces que haga falta (lo normal son 1 o 2 veces mas
como mucho) para llegar al escaneo del serial