--

Whiskey Kon Tekila CrACking tEAm.
WKT Tutorialz Site
WKT
progrAmA PhotoLine 4.53 W95
DEsCripCión Graficos
tipo Shareware ($69)
url http://www.ciebv.com
protECCión 30 dias de evaluacion y Nag-Screen
DiFiCultAD 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
hErrAmiEntAs SoftIce 3.24, W32Dasm 8.93, Hex Workshop 2.54
CrACkEr Jumanji
FEChA Noviembre de 1998
ComEntArio Programa de retoque de graficos

Introducción
El objetivo sera que no caduque nunca el programa y evitar la Nag-Screen.

Al Atake

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 0042CCC0
bpx 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 esto
33 C0 40 90 8D 4D E8 <-- Cambiar por esto

66 8B 45 E6 8B 4D F4 8B <-- Buscar esto
66 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.