Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: Amalthia_ en 12 Junio 2009, 17:38 pm



Título: Limite de tiempo
Publicado por: Amalthia_ en 12 Junio 2009, 17:38 pm
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_


Título: Re: Limite de tiempo
Publicado por: tena en 12 Junio 2009, 21:21 pm
¿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


Título: Re: Limite de tiempo
Publicado por: Amalthia_ en 13 Junio 2009, 13:18 pm
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_


Título: Re: Limite de tiempo
Publicado por: tena en 13 Junio 2009, 16:46 pm
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


Título: Re: Limite de tiempo
Publicado por: tena en 13 Junio 2009, 17:15 pm
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




Título: Re: Limite de tiempo
Publicado por: Amalthia_ en 14 Junio 2009, 17:33 pm
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 :-)



Título: Re: Limite de tiempo
Publicado por: tena en 14 Junio 2009, 22:13 pm
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


Título: Re: Limite de tiempo
Publicado por: biribau en 15 Junio 2009, 02:27 am
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


Título: Re: Limite de tiempo
Publicado por: Amalthia_ en 16 Junio 2009, 17:27 pm
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 :-)


Título: Re: Limite de tiempo
Publicado por: biribau en 16 Junio 2009, 19:01 pm
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:

(http://img134.imageshack.us/img134/5097/tapitii.jpg)

Saludos.


Título: Re: Limite de tiempo
Publicado por: tena en 17 Junio 2009, 00:10 am
Okey, acabo de probar cambiando los saltos y a mi por lo menos me anda, me voy a Final Quiz, termina la cancion y me dice "see your score" y me da el puntaje, pero bueno..

En cuanto a lo del retn en la funcion del timer, tambien si que funciona, lo que podes hacer es un loader que cargue al exe y una vez que llegue a ese call[esp+8] ya tenes esa sección cargada en memoria, asi que le pones el retn en la funcion del trial.

O tambien con oly podes hacer un injerto, ya que al llegar al call[esp+8]

00472604     .  5>PUSH EBX
00472605     .  F>CALL DWORD PTR SS:[ESP+8]
00472609     .  5>POP ECX
0047260A     .  E>JMP Tap_It_D.004726D1

en eax tenemos la direccion a donde va a saltar, podes ensamblar aqui un salto a una zona vacia, por jemplo en 004BB540 y poner aqui tu injerto...

slds


Título: Re: Limite de tiempo
Publicado por: Amalthia_ en 17 Junio 2009, 09:31 am
¡Ya está! Teníais razón los dos. Me funciona de las dos maneras, lo que ocurría es que el fichero estaba corrupto por tanto cambio que le hice. Volví a instalar el programa de
nuevo y funciona perfectamente. Tu solución tena es la más sencilla, es la que he utilizado al final porque al tratarse de dos JMPs y en parte de código existente, se deja
parchear más fácilmente.

Ahora me he encontrado con otro “problemita” que no conozco. Al tratar de cargar otro de los programas del lote de teoría de la música,  el olly me dice: “hrmprgdm.exe is probably not a 32-bit Portable Executable. Try to load it anyway?” le digo que si y me inicia el programa, (veo el menú del trial) pero en el olly no aparece ningún código. He intentado descifrar, descomprimir, etc. Pero todos lo programas que uso me dicen lo mismo: “Not a valid PE file” ¿Alguna idea de cómo puedo conseguir cargarlo?
El programa en concreto podéis descargarlo aquí: http://www.ecsmedia.com/indivprods/musharmprog.shtml

Gracias por vuestra ayuda.

Salu2  :D


Título: Re: Limite de tiempo
Publicado por: biribau en 17 Junio 2009, 14:25 pm
Buf, he mirado un poco y no es sencilla la cosa.

No es un ejecutable de win32, es de win16(windows 3.1 etc), un new executable(NE), el olly al parecer no te sirve...  :o

Deberias probar con windbg, o el debugger de una version antigua de visual c que funcione para 16 bits, pero no lo he probado. Intente con el debug que trae windows y dice que no puede arrancar windows asi que nada. El IDA lo desensambla pero no me deja depurarlo.. ademas saca cosas extrañas que no encuentro con el editor hexadecimal...(lo mire poco)
Quizás tb pudieras usar un debugger de ring0, i.e. un system debugger que capte las llamadas hechas por todo el sistema, aun asi parece complicado aterrizar en su codigo

La verdad podria ser buena idea para un crackme, un NE comprimido pero no creo que tenga mucho interes, si como reto pero practico ninguno

Otra posibilidad, instalarte un MV con windows 3.1 y todo el aparataje necesario para debuggear, aunque no se nada de esto

Como ultima opcion pydbg y las apis de windows, yo me estoy iniciando en el y es interesantisimo es un debugger "programatico", GPL y con un codigo python que se lee muy bien, sin duda merece la pena, solo que tendrias que programarte de 0 casi todo pues esta preparadop para win32

Si tanto te interesa creo que estas son las opciones

Suerte y a por ellos, espero tus avances


Título: Re: Limite de tiempo
Publicado por: Amalthia_ en 19 Junio 2009, 23:00 pm
biribau, no es que ya no me interese el tema, me interesa muchísimo, lo que ocurre
es que todavía no he encontrado el debugger apropiado y no puedo cargar el programa. En cuanto lo encuentre me gustaría, (si no te importa) retomar este hilo y ver si conseguimos llegar a buen puerto.
salu2 