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.
|