Qué he hecho mal: no está crackeado del todo

Iniciado por baldito, 4 Abril 2010, 19:22 PM

0 Miembros y 1 Visitante están viendo este tema.

baldito

No entiendo por qué no vale sólo con el editor de recursos.

Cuando tenga tiempo ( que tengo mucho que estudiar esta semana en la uni :-( ) lo pruebo como dices.

Tengo éste soft registrado, lo podría comparar con el turbodiff, con él mismo pero estando sin registrar para ver qué camino toma cada uno? ó solo sirve el turbodiff para compararlo con uno crackeado, como he visto en algunos tutos?

Gracias LSL   ;-) .

LSL

de nada,  :D

con el editor de recursos, en este caso solo evitas el tema de la licencia, pero los programadores pueden tomar otras medidas adicionales de su propia cosecha, en base a la existencia o no de algun valor concreto en algun fichero o de registro, etc.

Turbodiff es una herramienta desarrollada como un plugin de IDA. Descubre y analiza las diferencias entre las funciones de dos archivos binarios. Por ejemplo un archivo original y uno crackeado, o dos archivos de diferentes versiones.

Lo que quieres comparar es el comportamiento de cada instruccion al correrlo en la version registrada y en la no registrada, para ello puedes salvar en un archivo el traceo de uno y otro, y luego compararlos. Lo puedes hacer con el Ollydbg, en el botón "..." nos muestra el "run trace" es decir, aquí quedan logueadas las instrucciones ejecutadas cuando se tracea. Para esto debemos "abrir el run trace" esto se hace en el menú DEBUG > Open or Clear Run Trace, y para guardar el log en un archivo txt, pinchas en el botón "...", en esa ventana click derecho y seleccionas "Log to file", le pones un nombre.txt y abrir, ahora corres el programa con control+F12, cuando decidas cortar el log del  traceo, vuelves al menú DEBUG > Close Run Trace, y en "..." click derecho Close Log file.

una vez obtienes los dos traceos por separado, los comparas con alguna herramienta para comparar contenidos de archivos, y estudias las diferencias.

Saludos.

LSL.

baldito

Muy bueno LSL  ;-) , pero hay una cosa que he tenido que modificar para que no me apareciera una nag diciéndome que el ejecutable había sido modificado:

OnExeModified=IceLicenseLicenseFull

Y donde has puesto que tienes dudas no lo he movido y funciona bien.

Pero me gustaría saber cómo has llegado tan rápido hasta alli, a parte de que seas un máquina  ::)

Saludos

LSL

#13
pues a mi no me sale la nag, con OnExeModified=Nil
puede que la nag se genere tambien dependiendo de otros factores que existan en cada instalación.

¿que como he llegado alli?, pues en este caso fue muy facil ...

con el RDG Packer o Peid, nos dice que está hecho en Delphi.

como es Delphi, con el DeDe ó con E2A2 podemos ver donde comienzan las direcciones de los eventos de los
formularios, tambien vemos que hay un formulario principal con el nombre TfrmMain (en programación de
delphi se le suele poner el nombre Main al formulario principal que es con el que se inicia el programa),
asi que vamos a empezar a tracear en el evento FormShow del formulario Main, que es cuando se muestra en
pantalla.

La direccion donde comienza el evento FormShow del TfrmMain, en este caso es en 0062F364

Abrimos el programa con Olly, pulsamos Control+G para ir a la direccion 0062F364, alli ponemos un bp con
F2, para que se detenga en dicho lugar cuando lo ejecutemos con Run F9



además vamos a mirar el código que hay por ahí; mas abajo vemos que hay un mensaje en inglés que
traducido nos dice "Base de datos para los valores materiales no se establece.", lo cual no nos ha
mostrado ni siquiera anteriormente,al correr la presunta versión sin registrar, y para llegar a dicho
mensaje ó no pasar por dicho lugar hay un par de comparaciones que deciden el resultado de sendos saltos
condicionales, por lo que seria interesane echarles un ojo, ya que con la primera comparación, si salta
se envita realizar la segunda que es la que te puede llevar al mensaje de error al cargar la base de
datos, por lo que intuyo que al producirse el primer salto se evita la zona donde se carga la base de
datos y por eso ya no se muestra ni siquiera el mensaje de advertencia, asi que le ponemos unos BP en
las comparaciones previas y en los saltos para ver que valores compara y según el resultado la decisión
que toma para saltar a un destino distinto según el caso.



en el momento de la comparación del valor que hay en AL con el valor 2, vemos que AL=00 por lo que con el
JNZ se produce el salto que queremos evitar,

¿donde toma AL el valor 00, pues lo mas seguro en el último CALL previo, que nos lleva a la dirección
0059883C, donde vemos que se mueve a EAX el valor que existe en la dirección de memoria DS :[011377F9]



Entonces sabemos que si conseguimos que en la dirección de memoria 011377F9 en el momento previo a la
comparación que se introduzca el valor 2, el programa cargará la base de datos.

Despues de reiniciar un par de veces el programa y detenerse con el Breakpoint puesto en dicho evento
comprobamos que la dirección de memoria siempre es la misma, asi que reiniciamos de nuevo y vamos a
detenernos en la entrada del formulario, es el momento de poner un BP Memory On Write, en el primer Byte
de la direccion de memoria 011377F9, al que nos trasladamos pinchando en la zona del Dump y Control+G,
después damos a Run F9, y comprobamos que el Olly se detiene una primera vez en 005A2D00 para mover el
valor 00 a dicho lugar de memoria,



pero vamos a dar de nuevo F9 para continuar y comprobar si hay mas veces que se sobreescriba en dicho
lugar antes de llegar al codigo de comparación, lo cual si ocurre una segunda vez, por lo que elijo
modificar el valor en la segunda vez que mueve el valor 00 a dicho lugar de destino, y lo cambiamos por
02 que es el bueno, ya que en el primer movimiento lo perderiamos machacado por el segundo.



Ya solo queda salvar los cambios en el ejecutable, y probar el resultado.
Saludos.

LSL.

baldito

Muy bien, lo voy a estudiar con detenimineto y empezar de cero para entenderlo mejor. Si hay algo que no entienda te lo haré saber.

Muchas gracias por tus aportes.

LSL

#15
de nada  :)
Saludos.

LSL.

LSL

#16
Seria interesante que mirases también dichos datos con la versión registrada, a ver que valores guarda en dichas direcciones y en la de [011377F8] que equivale a [EAX+388] que se me ha quedado la duda de para qué y cuando se utiliza posteriormente.

Saludos.
Saludos.

LSL.

baldito


baldito

#18
 ;-)

LSL

#19
CitarEn los programas en los que he conseguido hacerlos funcionar, lo que he hecho ha sido únicamente cambiar el salto condicional, en vez de entra en el call previo y cambiar el valor por "2" para que después la comparación sea la correcta. ¿Por qué tú has profundizado más para saber de dónde trae el valor?

a veces hay que profundizar en la raiz del valor para no tener que hacer o controlar muchas modificaciones, imaginate un programa en que para cada operación que va a realizar en otras partes del codigo compruebe este mismo valor y tome la decision de saltar o no, tendriamos que buscar y forzar muchos saltos, y si encontramos ese punto identico para todas las comprobaciones relacionada, nos ahorramos mucho trabajo.

Por ejemplo en tu programa cuando estas en el inicio del call donde se debe mover el valor 02 al registro EAX, en la ventana de información del desensamblado te informa que ese call se llama desde 2 lugares distintos, mira la imagen de abajo.



Entonces o cambias los 2 saltos que existiran despues de las 2 llamadas, o aqui fuerzas para que siempre mueva el valor correcto, y asi nos aseguramos que se llame desde donde se llame siempre va a dar el valor correcto, y con ellos nos aseguramos que las demas decisiones posteriores serán las correctas.
.............
En cuanto a la direccion de memoria de mi ordenador [011377F8] equivale en el tuyo a la de [00DE77F8], cuando pares con un breakpoint en 0062F3EA, en el Dump de la memoria tendras en 00DE77F9 el valor 02, y mira en ese momento que valor tienes en 00DE77F8, que tambien puede ser decisivo en otras partes del programa.



Saludos.

LSL.