ahí tambien retornas a una zona comun de ejecución de eventos, y te costará un rato salir de bucles de programación.
Bueno lo siguiente, no es lo mas ortodoxo, pero es 100% efectivo con el componente timer, y es dejarlo sin el evento asociado Ontimer, lo que se puede hacer facilmente con un editor de recursos, en este caso he utilizado el eXeScope, ...abrimos el ejecutable a modificar, te desplazas a Resource -> RCData ->TFMMAIN -> pulsas Control+F para buscar el texto TimerTimer, pulsas OK y caes en el primer texto encontrado, seleccionas la linea "OnTimer = TimerTimer", click derecho y Delete, asi en los 4 objetos timer, te cambias de formulario o sales del eXeScope y te pregunta si quieres guardar los cambios, pulsas OK, y a tomar viento los eventos asociados a la función TimerTimer.
Otra forma mas profesional es poner el valor de intervalo=timeout = 0 cuando se le pasa los parametros a la Api SetTimer en tiempo de ejecución, con esto el evento ontimer asociado no se generará.
Cargamos el ejecutable en Ollydbg, parado en el EP, en la ventana de desensamblado pulsamos Control+N, (nos muestra la ventana de nombres en el corriente módulo, sobre el titulo de la ventana escribimos settimer, con lo que nos localiza y coloca encima de dicha función, pulsamos Intro, para que nos muestre todas las llamadas a dicha funcion importada, le colocamos a cada llamada un BP con F2.
Corremos el programa con F9 y cada vez que utilize un timer, parara en dicha call a settimer. Ojo no todos los settimer estaran asociaciodos al mensaje de registrar, hay algunos timer necesarios para que el programa realiza trabajos repetitivos necesarios para el buen funcionamiento, por lo que nos fijaremos en cuales son los que nos interesa deshabilitar y cuales no nos interesa por tener otra función encomendada. Por ejemplo hay un settimer que vamos a pasar por el cada vez que querramos ver un menú, a este le quitamos el BP de interrupción para que nos deje manejar el programa.
Si nos fijamos en la composición de los parametros que se le pasan a la función SetTimer que los podemos ver en el Stack cuando se va ajecutar el call a la Api, vemos que son 4 parametros.
Antes del call al SetTimer, tenemos 4 ordenes PUSH con distintos valores, y en el 2º push es en el que se le introduce el valor de milisegundos a procesar, asi que se le pone un BP con F2 en dicho segundo PUSH, para encontrar el ó los SetTimer que se utilizan para contar los 7 minutos aproximadamente, pues en ese 2º push, tenemos que cambiarle al valor 0 para que no se ejecute el OnTimer.
Para cambiarle el valor, si tienes lugar para un par de bytes, puedes ponerle directamente PUSH 0, pero si solo tienes un byte, por ejemplo un PUSH EAX, que utiliza solo un byte con el valor 50, tienes que subir hasta donde EAX coge el valor, para cambiarlo a valor 0, asi llegará al PUSH EAX = 0.
por ejemplo:
005BCBE3 |. 6A 00 PUSH 0 ; /Timerproc = NULL
005BCBE5 |. 8B45 FC MOV EAX,DWORD PTR [EBP-4]
005BCBE8 |. 0FB640 3E MOVZX EAX,BYTE PTR [EAX+3E]
005BCBEC |. 69C0 E8030000 IMUL EAX,EAX,3E8
005BCBF2 |. 50 PUSH EAX ; |Timeout
005BCBF3 |. 6A 03 PUSH 3 ; |TimerID = 3
005BCBF5 |. 8B45 FC MOV EAX,DWORD PTR [EBP-4]
005BCBF8 |. 8B40 58 MOV EAX,DWORD PTR [EAX+58]
005BCBFB |. 50 PUSH EAX ; |hWnd
005BCBFC |. E8 0707E5FF CALL <JMP.&user32.SetTimer> ; \SetTimer
como ves el 2º PUSH, introduce el valor Timeout =Intervalo en milisegundos
y solo utiliza un byte ( 50 = PUSH EAX )
ahí no podemos poner PUSH 0 ( que equivaldria a 6A 00 porque pisariamos el siguiente codigo con lo que daria error la función ),
entonces en la linea superior tenemos que EAX coge su valor al multiplicarse por 3E8 (1000 en decimal), ahí si podemos modificar para que el valor de EAX se multiple por 0, con lo que siempre tendremos en PUSH EAX, el intervalo 0.