1- Ese programa está compilado en Visual Basic, fíjate cómo llama a las funciones de Visual Basic (a la librería MSVBVM60.dll).
Ufffffff estoy verdisimo y la verdad es que no entiendo nada de lo que explicas ahi.
2- Fíjate una cosa muy importante. Ese salto que hace o no hace según, lo realiza o no tras comparar que en una zona de la memoria sea el valor = cero:
CMP DWORD PTR SS[EBP-58], 0
Ya te está dando un dato importante. Y ese valor de EBP-58 en la linea anterior te pone el valor de EAX.
En definitiva JGE salta si el valor es mayor o igual, es decir, si EAX es menor que 0 (FFFFFFFF) NO saltará.
Podrías intentar averiguar porqué EAX tiene ese valor poniendo BP.
Eso de poner directamente un salto a vba__End no está bien, porque VB va liberando de memoria variables que utiliza.. si no hubiese otra opción pues vale pero no en este caso.
Si dices que ya todo lo tienes arreglado pues ahí puedes poner un simple JMP sustituyendo al JGE y ya está arreglado.
Pero yo analizaría porqué EAX te da un valor menor que 0.
Pues no se exactamente que es lo que busca en esa comparacion, lo que si se es que si la obligo a saltar no pasa nada y si la nopeo tampoco. Ademas los saltos que hay mas arriba ninguno se dirige a un lugar que salte el mensaje y probe a saltar al vba_end y funciono. Creo que el autor ha hecho modificaciones para que no se pueda parchear simplemente con un jmp o un nop.
Si no funciona cambiando el tiempo el programa debe guardar algun valor en el registro o en algun archivo....intenta parchear las apis del registro para ver si lee alguna o si genera algun archivo...
Yo no se hacer eso, estoy empezando aun y no se que apis son esas ya que de visual basic he tocado muy poco. Me vendria muy bien un listado con sus respectivas descripciones y para que se usa cada una.