Limite de tiempo

Iniciado por Amalthia_, 12 Junio 2009, 17:38 PM

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

Amalthia_

Hola a todos,

Tengo un programa de musica: Tap it 5.2, que ya desde el inicio debe activar
el SetTimer y a los dos minutos me presenta un mensaje del tipo "your time is up!
Es una demo y no pide ningún tipo de serial ni activación, ni nada por el estilo, estoy trabajando con el y simplemente se para al alcanzar el limite de tiempo.  He tratado de localizar el texto del mensaje, pero no lo encuentro por ningún sítio. El problema es que soy nuevo en esto del cracking y no se como abordar el tema. Quiero currarmelo pero no se como hacerlo. ¿Alguna idea de como puedo craquear este programa? Gracias por cualquier tipo de ayuda.

salu2 

Amalthia_

tena

¿Se para en el sentido de que te aparece el mensaje?

Proba poniendo un bp en MessageBoxA..

o sino cuando te sale el mensaje, te vas al oly y lo pauseas, despues presiona ALt+F9, te vas al mensaje y le das a OK, el oly se debe de parar justo despues de la llamada al mensaje.

slds

Amalthia_

Gracias Tena por tu respuesta,

El problema es que cuando me sale el primer mensaje para introducir la contraseña, (ya puse el bp al MessageBoxA) ya es demasiado tarde. Igual me da
introducir la contraseña y empezar a utilizar el programa, que no hacer nada. El
tiempo empieza a correr inexorablemente desde que hago click para iniciar el programa. A los 2 minutos recibo el mensaje "your time is up!". Lo que ocurre es
que mis conocimientos de cracking son limitados, (soy musico) y no se como se
tracea una rutina de SetTimer. Creo que sabiendolo hacer debe ser relativamente
sencillo. Está claro que al iniciar el programa lo primero que hace es guardar el
valor del reloj, (hora actual) después le añadira los 2 minutos y por fin comparara
los dos valores, enviandome el mensaje "your time is up! cuando se iguale o sobrepase el valor indexado. Consiguiendo cambiar el jmp que termina el programa por uno que vuelva siempre al test o cmp quedaria solucionado el tema.
Tengo clara la teoría pero no se como tracear una rutina de manipulacion del reloj del sistema. Gracias de nuevo por cualquier sugerencia.

salu2  :D

Amalthia_

tena

The SetTimer function creates a timer with the specified time-out value.

UINT SetTimer(

    HWND hWnd,   // handle of window for timer messages
    UINT nIDEvent,   // timer identifier
    UINT uElapse,   // time-out value
   TIMERPROC lpTimerFunc    // address of timer procedure <=== AQUI
   );

Para tracear el SetTimer debes ir a la direccion del procedimiento.

La verdad que no le entiendo nada a ese programita, parecen ejercicios pero baa,
la cosa es que vi que esta compilado con RealBasic...

Comparando con uno que vi hace poco este tambien crea una sección y me parece que la papusa esta ahi dentro.

Si queres caer cuando crea la ventana nomas ponele un bp en CreateWindowExA.

La primera vez que cae en el SetTimer si le cambias el tiempo a -1, despues al terminar una melodia se queda como tonto repitiendo un tono.

slds

tena

Bueno mirate por aqui, ponele unbp a ShowWindow y veras como cae en la primera ventana, luego en la que pones el pass, y luego en la nag que te sale y se cierra.

0040DAC5    |CMP BYTE PTR DS:[EBX+92],0  <=== LA PAPA
0040DACC    |JE SHORT Tap_It_D.0040DADA
0040DACE    |PUSH 5                                           ; /ShowState = SW_SHOW
0040DAD0    |MOV EAX,DWORD PTR DS:[EBX+58]                    ; |
0040DAD3    |PUSH EAX                                         ; |hWnd
0040DAD4    |CALL DWORD PTR DS:[<&USER32.ShowWindow>]         ; \chankui
0040DADA    |MOV EBX,DWORD PTR DS:[EBX+80]
0040DAE0    |TEST EBX,EBX
0040DAE2    \JNZ SHORT Tap_It_D.0040DAB0
0040DAE4    POP EBX
0040DAE5    RETN

el contenido de [ebx+92] debe ser 0, o cambias el JE por un JMp, pero bueno yo no entiendo este progui, porque se queda ahi tocando la misma nota aunque las figuras van cambiando, y es muy lento :D

suerte



Amalthia_

Hola tena,

Ante todo muchas gracias por tu paciencia.

Este programita es el más sencillo de un lote de 33 dedicados a la Teoría de la Musica, (Armonia, claves, escalas, arpegios, inversiones, etc) aquí el alumno solo tiene que repetir los golpes que oye y aprender el ritmo. No son notas, es ritmo.
Como todos los programas tienen el mismo sistema de protección, pense que si aprendía a liberar uno, podría liberar los otros también. Me equivoque. Es más dificil de lo que pensaba.

Como me dijiste puse un bp, (Toggle breackpoint on import) a ShowWindow, pero cuando pulso F9 no me va directamente a la primera ventana (al menos yo no la veo) ¿Tengo que seguir pulsando F9 o F7/F8 o hay otra forma de tracear? Por otro lado necesitaría saber como se llega a 0040DAC5, (sin usar GO TO expresión) ya que al tener cada programa un tamaño diferente esta dirección seguramente cambiara. Por último, el cambio de JE a 0040DADA por un JMP no me sirvio de nada, tampoco el JMP a 0040DAE5. ¿Ayudaria algo el JMP a 0040DADA cambiando el MOV para que vuelva a poner EBX+80 en 0?

Tena, es muy fácil aprender contigo pero estoy empezando ahora y por lo tanto, comprendería perfectamente que no quieras perder tu tiempo conmigo.

Gracias de nuevo por todo lo que me has ayudado hasta ahora.

salu2 :-)


tena

Ademas del salto de 40DACC que debes cambiar por un JMP, me olvide de decirte que tambien debes de cambiar aqui

00497A8B    CMP [ARG.1],0
00497A8F    JE SHORT Tap_It_D.00497AC9 <==CAMBIALO POR JMP
00497A91    MOV EAX,[ARG.1]
00497A94    CMP DWORD PTR DS:[EAX+1C],0
00497A98    JE SHORT Tap_It_D.00497AC9
00497A9A    MOV EAX,[ARG.1]
00497A9D    MOV ECX,DWORD PTR DS:[EAX+1C]
00497AA0    CALL Tap_It_D.0040DE50
00497AA5    MOV EAX,[ARG.1]
00497AA8    MOV EDX,DWORD PTR DS:[EAX+1C]
00497AAB    MOV ECX,EDX
00497AAD    MOV ESI,DWORD PTR DS:[ECX]
00497AAF    MOV ECX,EDX
00497AB1    CALL DWORD PTR DS:[ESI+178]     ; al  ShowWindow

debes cambiar el JE por un jmp para evitar que te muestre el mensaje.

slds

biribau

Hola
He encontrado otra forma mas facil... es un programa realmente sencillo
Lo comentaré por pasos:
1. Primero ponemos un break en SetTimer al arrancar, continuamos con F9
2. Rompemos en SetTimer, vemos que el tiempo es de 90000 ms. o sea, el minuto y medio de trial, cambiamos ese param por uno pequeño, con CTRL+E 90 00 00 00
3. Ponemos un bp tambien en la rutina a la que llamará cuando cumpla el tiempo(TimerProc) o sea, en 4725c0 y le damos a F9
4. Caemos en la rutina a la que llama el timer, sin embargo no la podemos bypasear porque es llamada por otros timers del programa, como puede ser esto? el codigo luce tal que así:

004725C0     PUSH EBX
004725C1     PUSH ESI
004725C2     PUSH EDI
004725C3   . PUSH EBP
004725C4   . SUB ESP,8
004725C7   . MOV EBX,DWORD PTR SS:[ESP+24]
004725CB   . PUSH EBX                                 ; /TimerID
004725CC   . PUSH DWORD PTR SS:[ESP+20]               ; |hWnd
004725D0   . CALL DWORD PTR DS:[<&USER32.KillTimer>]  ; \KillTimer
004725D6   . MOV EAX,DWORD PTR DS:[4CC234]
004725DB   . PUSH EAX
004725DC   . PUSH EBX
004725DD   .CALL Tap_It_I.004457D0
004725E2   . POP ECX
004725E3   . POP ECX
004725E4   . MOV DWORD PTR SS:[ESP+4],EAX
004725E8   . CMP WORD PTR DS:[EBX+1C],2
004725ED   . JE SHORT Tap_It_I.00472610
004725EF   . C743 28 000000>MOV DWORD PTR DS:[EBX+28],0
004725F6   .>MOV WORD PTR DS:[EBX+1C],0
004725FC   . TEST EAX,EAX
004725FE   . JE Tap_It_I.004726D1
00472604   . PUSH EBX
00472605   . CALL DWORD PTR SS:[ESP+8] <------------------OJO depende del parametro
00472609   . POP ECX
0047260A    JMP Tap_It_I.004726D1

bien pues parece que está escrito en un lenguaje OO de estos que tiene virtual table donde se almacenan las direcciones de los métodos (como dijo tena anteriormente esta posiblemente escrito en RealBasic el cual es orientado a objetos), por eso la primera llamada que salta a la vista es un call ss:[esp+8] en 472605, de hecho es la única que puiede ser dinámica, he rastreado la anterior y no parece que se use el valor del identificador del timer que podía ser otra posibilidad no?

Si no tocamos nada en el programa...(y poniendo 90 de tiempo al SetTimer no nos dara tiempo), el primer timer que saltara sera el del trial...

5. Nos metemos con F7 dentro de la llamada sospechosa esa, y ponemos un hardware break al principio(por alguna razon olly me desactiva el bp software quizas por estar fuera de la sección de codigo). Ahora si ejecutamos desde el comienzo el programa vemos que esa zona no se ejecuta cuando salta el timer por otras razones que no sean las del trial. Por tanto podemos deducir que esa es el corazon estatico culpable de la ventanita de trial y por ello vamos a eliminarla.

6. Si has reiniciado olly sigue de nuevo los pasos 1-4, y cuando entres en esa funcion, ensamblamos un retn (en 1843ed), y parece que funciona...

NOTA: no he podido probar el programa bien porque no me funciona el sonido en la máquina virtual, supongo que suena  :D

Saludos, es mi primer post, espero no haber metido mucho la gamba jejejee

Amalthia_

Hola tena y biribau,

Parece que al final no es tan sencillo.

Tu solución de los JMPs tena, no cambia nada: el "YOUR TIME IS UP! sigue saliendo religiosamente.

He seguido los pasos que tu explicas biribau, pero al menos a mi, cuando me sale el primer trial, al introducir la contraseña y dar al enter el programa se cuelga. Veo que el olly indica que está running pero queda todo bloqueado. Por otro lado, y esto, como principiante, es para mi fascinante, he comprobado que al intentar parchear el programa con el WinHex, cuando busco la dirección 1843eD, (su equivalente) me dice que no existe. Efectivamente al volver a ejecutar el olly y sin cambiar nada puse un Go to Expression 001843eD y me responde que no existe.
Es necesario iniciar la rutina del SetTimer para que se genere esa dirección, así es que mi pregunta es la siguiente: ¿Como consigo meter en un Editor Hex el retn al que tú te refieres si no encuentra el código donde ponerlo?

Aprendo mucho con vosotros, me hacéis pensar y os estoy muy agradecido. Me encantaría que pudieseis seguir ayudándome.

salu2 :-)

biribau

Vale, a mi me funciona con lo que te dije, = es que no explique bien los pasos, donde tienes que poner el ret no es el lugar del "call ss:[esp+8]" sino en la funcion donde se mete, o sea, le das a F7 y luego espacio y retn. La funcion esa ha de ser la del trial, para llegar a ella tienes que esperar que pase el tiempo o hacer el hack al SetTimer, para que sea la primera en la que entra, si te intentas loguear romperas otra vez en ese call ss:[esp+8] peeero no debes parchear la funcion más veces, ya que esta cambia con el tiempo segun quien llame al procedimiento(no me refiero a que cambie el codigo, cambia solo la direccion a la que salta, recuerda que es un call [esp]).

He probado en otro ordenador y tienes razon, no encuentra esa direccion, me he dado cuenta de que es dinamica, ademas si la intentas buscar al principio de la ejecución no la encuentra tampoco, ¿horror? no tanto...

Despues de trazar un poco el programa me doy cuenta de que esa parte de codigo la carga en runtime, y para ello utiliza las funciones GlobalAlloc(para reservar el bloque de memoria donde va a escribir el codigo) y _lread, _lopen, _lseek para cargar el codigo....

No lo mire más pero parchearlo no deberia ser mas dificil que coger un numero suficientemente grande de bytes seguidos de la funcion a parchear y buscarlos en el fichero, asegurate de que no hay mas de una ocurrencia o tendras problemas.

Si quieres seguir la via honesta, descifra los parametros de _lseek y varios _lread y pista.

El lugar donde los encuentras es aqui:



Saludos.