| Cuando arrancamos el programa, nos saldra la pantalla de la
          aplicacion e inmediatamente despues, sale la Nag-Screen que es la
          misma que sale cuando se pide el menu ? / About PhoLine...,
          diciendo que es una version de evaluacion y el dia en el que nos
          encontramos de un total de 30.Ademas de esto, hace una pausa de
          10 segundos en modo Modal.
 Si adelantamos el reloj del ordenador mas de 30 dias y ejecutamos el
          programa, vemos que sigue funcionando pero, si os fijais, el periodo
          que llevamos usando el programa, sale con letras rojas.Esto
          supongo que es un aviso de que te has pasado del tiempo, pero el
          programa sigue funcionando.
 Visto esto, se puede llegar a la conclusion de que en algun momento
          del programa, tiene que comprobar el numero de dias que llevamos
          usando el programa con el valor 1E que es 30 en
          hexadecimal.Esta comprobacion la realizan el 95% (si no es mas)
          de los programas que son de XX dias de evaluacion.
 Empezaremos por desensamblar una copia del fichero PhotoLine.exe
          y salvar el codigo resultante.En este punto, cojeremos la opcion
          de Find Text y buscaremos el texto 0000001E pero solo
          en los casos de que sea una comparacion, CMP, de algo con este
          valor.
 Vemos que nos aparecen 7 ocurrencias en las lineas : :0042CCC0 83F81E cmp eax, 0000001E:0044F107
          83F81E cmp eax, 0000001E
 :00471BB8 83FE1E cmp esi, 0000001E
 :00478185
          83F81E cmp eax, 0000001E
 :004E75F5 83F81E cmp eax, 0000001E
 :004E761A
          83F81E cmp eax, 0000001E
 :00583137 83FB1E cmp ebx, 0000001E
 Ahora lo que haremos, sera poner un BreakPoint en el SoftIce en cada
          una de las lineas para ver cual es la comparacion que hace cuando se
          arranca el programa para saber si llevamos mas de 30 dias. Cargar el Symbol Loader y seleccionar la opcion File /
          Open Module y buscar el fichero PhotoLine.exe, que es el que
          arranca el programa y seleccionar la opcion Module / Load.Seguidamente,
          saltaremos a la pantalla del SoftIce para que pongamos los BreakPoints
          que queramos.
 Poner un BreakPoint para cada una de las lineas que teniamos con la
          comparacion de 0000001E de la siguiente manera: bpx 0042CCC0bpx 0044F107
 bpx 00471BB8
 bpx 00478185
 bpx
          004E75F5
 bpx 004E761A
 bpx 00583137
 Seguidamente, pulsaremos la tecla F5 para volver al Symbol
          Loader y que se ejecute el programa. Automaticamente, saltaremos al SoftIce, en la linea :00471BB8,
          que es uno de los BreakPoints que pusimos. Pulsaremos F5 para
          que continue la ejecucion del programa y veremos que vuelve a aparecer
          el SoftIce en la misma linea :00471BB8.Si en este punto
          pulsamos la tecla F4, veremos que hasta este punto, en el
          monitor, tenemos la pantalla de trabajo del PhotoLine.
 Volver a
          pulsar la tecla F4 para volver al SoftIce.
 Pulsar F5
          para que continue la ejecucion y nos saldra la Nag-Screen
          informandonos del numero de dias que llevamos usando el programa,
          etc... y una para de 10 segundos.
 Bien, ahora ya sabemos en que linea hace la comprobacion de los 30
          dias.Volvamos al W32Dasm y vayamos a la parte de codigo
          perteneciente a esa linea:
 * Possible StringData Ref from Data Obj ->"4.53"
          |
 :00471B7A 68C87F5E00 push 005E7FC8
 :00471B7F 8D4DE0
          lea ecx, dword ptr [ebp-20]
 :00471B82 E8B95A0600 call 004D7640
 :00471B87 8D45E0 lea eax, dword ptr [ebp-20]
 :00471B8A
          8D4DEC lea ecx, dword ptr [ebp-14]
 :00471B8D 50 push eax
 :00471B8E
          51 push ecx
 :00471B8F E8BC3B0100 call 00485750
 :00471B94
          83C408 add esp, 00000008
 :00471B97 E8E48DFDFF call 0044A980
 :00471B9C
          6685C0 test ax, ax
 :00471B9F 0F859C010000 jne 00471D41 <--
          Que es esto ????
 :00471BA5 E8E6650000 call 00478190
 :00471BAA
          8BF0 mov esi, eax
 :00471BAC 8D4D80 lea ecx, dword ptr [ebp-80]
 :00471BAF E84C100F00 call 00562C00
 :00471BB4 C645FC08 mov
          [ebp-04], 08
 :00471BB8 83FE1E cmp esi, 0000001E <--
          Comprueba si llevamos 30 dias
 :00471BBB 7E07 jle 00471BC4 <--
          Salto si son 30 o menos dias
 :00471BBD 68C0776200 push
          006277C0
 :00471BC2 EB05 jmp 00471BC9
 Como se puede observar, la forma de parchear el programa, seria que
          siempre hiciera el salto de la linea :00471BBB pero lo unico
          que conseguiriamos, seria que el programa no caducara nunca pero nos
          seguiria saliendo la Nag-Screen y la pausa de 10 segundos.Esta no
          es la solucion mas idonea.
 Si miramos unas lineas hacia arriba, podemos observar que en la
          linea :00471B9F hay un salto condicional que viene dado por el
          valor devuelto en AX en la llamada a 0044A980.Vayamos
          pues a la parte de codigo de esta llamada:
 * Referenced by a CALL at Addresses: |:00471B97
          , :004F2C5E
 |
 :0044A980 E87BF8FFFF call 0044A200 <--
          Viene desde :00471B97
 :0044A985 8BC8 mov ecx, eax
 :0044A987
          E9E4D50200 jmp 00477F70 <-- Salto incondicional
 Como vemos, ademas de la referencia que nos a traido hasta aqui, hay
          otra referencia mas.Esto quiere decir que desde algun otro punto
          del programa, se mira tambien si esta registrado o no, con lo cual, la
          primera solucion queda claro que no es la correcta.
 Sigamos el programa y vayamos al salto incondicional que hay en la
          linea :0044A987 y que hace referencia a 00477F70.Veamos
          esta parte de codigo:
 * Referenced by a CALL at Addresses: |:00477E1D
          , :00478170 , :00478447 , :004E49D9
 |
 
 * Referenced by a
          (U)nconditional or (C)onditional Jump at Address:
 |:0044A987(U)
 |
 :00477F70 64A100000000 mov eax, dword ptr fs:[00000000]
 :00477F76 55 push ebp
 :00477F77 8BEC mov ebp, esp
 :00477F79
          6AFF push FFFFFFFF
 :00477F7B 68C7804700 push 004780C7
 :00477F80
          50 push eax
 :00477F81 64892500000000 mov dword ptr fs:[00000000],
          esp
 :00477F88 83EC3C sub esp, 0000003C
 :00477F8B 8D4DC4 lea
          ecx, dword ptr [ebp-3C]
 :00477F8E E87DF10500 call 004D7110
 :00477F93
          C745FC00000000 mov [ebp-04], 00000000
 :00477F9A 8D4DE8 lea ecx,
          dword ptr [ebp-18]
 :00477F9D E86EF10500 call 004D7110
 :00477FA2
          6A01 push 00000001
 :00477FA4 8D4DD0 lea ecx, dword ptr [ebp-30]
 :00477FA7 C645FC01 mov [ebp-04], 01
 
 * Possible
          StringData Ref from Data Obj ->"SerialNumber400"
 |
 :00477FAB 6864815E00 push 005E8164
 :00477FB0 E87BF10500 call
          004D7130
 :00477FB5 50 push eax
 :00477FB6 8D4DB8 lea ecx,
          dword ptr [ebp-48]
 :00477FB9 C645FC02 mov [ebp-04], 02
 :00477FBD
          6A00 push 00000000
 :00477FBF E8CCF10500 call 004D7190
 :00477FC4
          C645FC03 mov [ebp-04], 03
 :00477FC8 50 push eax
 :00477FC9
          8D45DC lea eax, dword ptr [ebp-24]
 :00477FCC 50 push eax
 :00477FCD
          E81E26FDFF call 0044A5F0
 :00477FD2 83C40C add esp, 0000000C
 :00477FD5
          8D4DC4 lea ecx, dword ptr [ebp-3C]
 :00477FD8 C645FC04 mov
          [ebp-04], 04
 :00477FDC 50 push eax
 :00477FDD E86EF40500 call
          004D7450
 :00477FE2 50 push eax
 :00477FE3 8D4DE8 lea ecx,
          dword ptr [ebp-18]
 :00477FE6 E865F40500 call 004D7450
 :00477FEB
          C645FC03 mov [ebp-04], 03
 :00477FEF E8C3000000 call 004780B7
 :00477FF4 C645FC02 mov [ebp-04], 02
 :00477FF8 E8AA000000
          call 004780A7
 :00477FFD C645FC01 mov [ebp-04], 01
 :00478001
          E8A9000000 call 004780AF
 :00478006 8D4DE8 lea ecx, dword ptr
          [ebp-18]
 :00478009 E802F80500 call 004D7810
 :0047800E 85C0
          test eax, eax
 :00478010 747B je 0047808D <-- Evitar este
          salto
 :00478012 8D4DE8 lea ecx, dword ptr [ebp-18]
 :00478015
          E826F50500 call 004D7540
 :0047801A 6A01 push 00000001
 :0047801C
          8D4DE8 lea ecx, dword ptr [ebp-18]
 :0047801F 6A20 push 00000020
 :00478021 8945D8 mov dword ptr [ebp-28], eax
 :00478024
          8D45DC lea eax, dword ptr [ebp-24]
 :00478027 50 push eax
 :00478028
          E8F3FA0500 call 004D7B20
 :0047802D 50 push eax
 :0047802E
          8D4DE8 lea ecx, dword ptr [ebp-18]
 :00478031 C645FC05 mov
          [ebp-04], 05
 :00478035 E816F40500 call 004D7450
 :0047803A
          C645FC01 mov [ebp-04], 01
 :0047803E E842000000 call 00478085
 :00478043 8D4DE8 lea ecx, dword ptr [ebp-18]
 :00478046
          E8F5F40500 call 004D7540
 :0047804B 8945D4 mov dword ptr [ebp-2C],
          eax
 :0047804E 8D45D4 lea eax, dword ptr [ebp-2C]
 :00478051
          50 push eax
 :00478052 E889000000 call 004780E0
 :00478057
          668945E6 mov word ptr [ebp-1A], ax
 :0047805B 83C404 add esp,
          00000004
 :0047805E C645FC00 mov [ebp-04], 00
 :00478062
          E858000000 call 004780BF
 :00478067 C745FCFFFFFFFF mov [ebp-04],
          FFFFFFFF
 :0047806E E85E000000 call 004780D1
 :00478073
          668B45E6 mov ax, word ptr [ebp-1A] <-- Forzar un 1 en AX
 
 *
          Referenced by a (U)nconditional or (C)onditional Jump at Address:
 |:004780A5(U)
 |
 :00478077 8B4DF4 mov ecx, dword ptr
          [ebp-0C]
 :0047807A 8BE5 mov esp, ebp
 :0047807C
          64890D00000000 mov dword ptr fs:[00000000], ecx
 :00478083 5D pop
          ebp
 :00478084 C3 ret
 Si seguimos esta parte de codigo, vemos que en la linea :00478010
          hay un salto condicional dado por la comparacion de la linea anterior
          a que el registro EAX sea igual a 0.En este caso,
          salta a la linea 0047808D que contiene el codigo:
 * Referenced by a (U)nconditional or
          (C)onditional Jump at Address: |:00478010(C)
 |
 :0047808D
          C645FC00 mov [ebp-04], 00
 :00478091 E829000000 call 004780BF
 :00478096 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
 :0047809D
          E82F000000 call 004780D1
 :004780A2 6633C0 xor ax, ax
 :004780A5
          EBD0 jmp 00478077
 Este codigo, como podemos ver, es error ya que hace un XOR AX,
          AX con lo que se pone dicho registro a 0 y si recordamos,
          se espera un valor distinto de 0 en AX para que el
          registro sea correcto.Visto esto, volvamos al codigo anterior a
          la linea :00478012 y sigamos mirandolo.
 Llegaremos a la linea :00478073 que mueve algo a AX.
          Sea lo que sea lo que mueve, a nosotros nos interesa que este valor
          sea distinto de 0. Con todo esto, llegamos a la siguiente conclusion: En la linea :00478010 no se tiene que hacer el salto ya que
          dicho salto es error.En la linea :00478073 hay que poner
          un 1 en AX.
 Para realizar esto, ejecutaremos el Hex Workshop, abriremos el
          fichero PhotoLine.exe y buscaremos las siguientes cadenas y las
          sustituiremos:  85 C0 74 7B 8D 4D E8 <-- Buscar
          esto33 C0
          40 90 8D 4D E8 <-- Cambiar por esto
 66 8B 45 E6 8B 4D F4 8B <--
          Buscar esto66 B8 01 00 8B 4D F4
          8B <-- Cambiar por esto
 Salvar las modificaciones y ahora ya podemos desactivar el
          BreakPoint que teniamos, pulsando CTRL+D para entrar en el
          SoftIce y escribir: bd 00 Pulsar F5 para volver a Windows. Ahora el programa no caducara nunca y tampoco saldra la Nag-Screen. |