Hola!
La explicación de por qué el parche es el que proponía solidcls es el siguiente:
· Ejecutamos el programa en OllyDbg. Cuando sale el MessageBox, pausamos y ejecutamos hasta que se produzca la vuelta al código cliente (Alt+F9). Al pulsar sobre el botón de aceptar, paramos en 46091F. Subiendo un poco vemos que desde 460910 está la llamada a MessageBoxA, y si bajamos desde 46091F vemos que no hay ningún salto que permita "puentear" la llamada a la API, por lo que esa función entera es llamada en caso de no estar registrado.
· Entonces, pulsamos Ctrl+F9 y con F7, salimos a la función que llamó al procedimiento que mostraba el MessageBox (460834...460988). Caemos en una zona que el programa utiliza para restablecer EBX, ESI y EDI de manera genérica así que seguimos hasta el RET.
· Este RET nos lleva a 4B851A. Si nos fijamos, la línea siguiente en la que caemos es apuntada por un salto. Dicho salto está en 4B8500 y éste sí que permite evitar llamar al MessageBox:
004B84F9 |. E8 A6DDFFFF CALL jpgserve.004B62A4
004B84FE |. 84C0 TEST AL,AL
004B8500 |. 75 1A JNZ SHORT jpgserve.004B851C
004B8502 |. 6A 00 PUSH 0
004B8504 |. B9 58874B00 MOV ECX,jpgserve.004B8758 ; ASCII "Unregistered Version"
004B8509 |. BA 70874B00 MOV EDX,jpgserve.004B8770 ; ASCII "You are running an ..."
004B850E |. A1 B4214C00 MOV EAX,DWORD PTR DS:[4C21B4]
004B8513 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
004B8515 |. E8 1A83FAFF CALL jpgserve.00460834
004B851A |. EB 38 JMP SHORT jpgserve.004B8554
004B851C |> 8D55 84 LEA EDX,DWORD PTR SS:[EBP-7C]
· He copiado toda esa zona, para que observes que primero se llama a 4B62A4, y después se comprueba si devolvió diferente de cero, en cuyo caso salta el código que muestra el MessageBox. Nos introducimos entonces en la función 4B62A4, y tenemos:
004B62A4 /$ E8 FB010000 CALL jpgserve.004B64A4
004B62A9 \. C3 RETN
de manera que volvemos a introducirnos en 4B64A4, y estaremos en la rutina que comprueba si el programa está registrado. Ensamblamos lo comentado anteriormene, y todo irá de perlas...
Saludos, mikello