�El
problema con TimeLOCK 3+ es que rasga fuera
alg�n c�digo de la app, remend�ndolo en tiempo
de activaci�n si todas las luces son verdes!
Innecesario decir que esta majader�a encripta
los bytes perdidos, as� que no encontraremos
esto ' listo_para_parchear' en un dummy DLL o
as�... Marigold llego a la conclusi�n que los
recortes perdidos tuvieron que ser copiados (pero
no explic� c�mo) entonces remend�
directamente sobre el exe. As� que yo entend� '
copiado a mano'. Lo que en su caso era aceptable,
porque el recorte no era tan largo (' solo' 0x16E
bytes), est� aqu� imposible: como ver�s, una
mejora de TL31INJ.dll (entre otros?) es que el '
la Bolsa de bytes' (tontamente) va creciendo.
Para NetscanTools 3.1 alinea 0x716 (= 1814)
bytes. Mi objetivo es explicar c�mo permitir al
hinchado TimeLOCK hacer su trabajo sucio, y
entonces suavemente detenerlo para guardar el
c�digo a un archivo. As� que empecemos el
agrietamiento. Unas l�neas del archivo del
ejemplo NSTSTD.EXE desensamblado lo explicar�n
r�pidamente:
//******************** Punto de Entrada del programa ********
:004FA000 FF74240C push [esp+0C]
:004FA004 FF74240C push [esp+0C]
:004FA008 FF74240C push [esp+0C]
:004FA00C 68D879A084 push 84A079D8
:004FA011 68C1FED07D push 7DD0FEC1
:004FA016 68A29C5D1E push 1E5D9CA2
:004FA01B FF15D4A24F00 call dword ptr [004FA2D4] ---> Esta es la llamada infame
:004FA021 68FFFFFFFF push FFFFFFFF
:004FA026 FFD0 call eax ---> Al devolver eax contiene la direcci�n
correcta, qu� es el punto de la entrada
'real' del objetivo
:004FA028 C20C00 ret 000C ---> si, �eso es todo!
Como
uno puede experimentar f�cilmente, desviar
4FA01B no conduce a nada, incluso con el eax
correcto, porque esto precisamente es en donde
TimeLOCK remendar�. Yo no quise ahondar en el '
pesado ' encriptado de TimeLOCK, comprobando CRC
(verifica su integridad, como la del objetivo)
, todo material aburrido... Parece que tendr�a
que ser f�cil permitirlo hacer el trabajo: -)
1) tienes una versi�n de funcionamiento de
prueba, entonces salta las pr�ximas 50 l�neas
2) como yo, 'qu�malo' en el primer d�a de
prueba adelantando la fecha 1 mes, s�lo para ver
lo que pasa, al restaurar el reloj atr�s. (No,
caduca para bien :=)
As� que a trabajar con TL31INJ.DLL. Primero
tenemos que desviar la caja de di�logo con el el
bot�n de 'prueba' puesto gris para siempre. Con
SoftICE lo encontramos f�cilmente:
:100081FF 6A00 push 00000000
:10008201 A164A30310 mov eax, dword ptr [1003A364]
:10008206 6840830010 push 10008340
:1000820B 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"TL_DLG_MAIN"
|
:1000820D 687CF60310 push 1003F67C
:10008212 50 push eax
* Ref To: USER32.DialogBoxParamA, Ord:008Eh
--> cuando ret.,eax=1 si aprietas 'try first'
:10008213 FF1530960410 Call dword ptr [10049630]
:10008219 8BF8 mov edi, eax
As�
que bpx en 10008213 (cuidado con la
relocalizaci�n, en mi pc era 508213...)
Cuando SoftICE rompe, F10, aprieta cancel,
entonces r eax=1 para simular el apret�n de
'try_it'.
Un consejo practico
No intentes remendar en 10008213 para ganar
tiempo. Como puedes ver, �sta es una direcci�n
absoluta, el loader REMENDARA despu�s de ti, en
caso de relocalizaci�n (esto es muy probable),
causando una ca�da muy probable... Haciendo esto
correctamente tienes que parchear la tabla de
relocalizaci�n. M�s sobre esto al final.
Desgraciadamente, esto no es bastante, como
Marigold not� con la versi�n anterior. Ahora
nosotros estamos atrapados en un comienzo de
rutina en 1002B020:
* Referenced by a CALL at Addresses: (a hundred of these follow)
|
:1002B020 83EC20 sub esp, 00000020
:1002B023 B908000000 mov ecx, 00000008
:1002B028 56 push esi
:1002B029 57 push edi
:1002B02A BE28730310 mov esi, 10037328
:1002B02F 8D7C2408 lea edi, dword ptr [esp+08]
:1002B033 F3 repz
:1002B034 A5 movsd
:1002B035 8B44242C mov eax, dword ptr [esp+2C]
:1002B039 8B4C2430 mov ecx, dword ptr [esp+30]
:1002B03D 8D54241C lea edx, dword ptr [esp+1C]
:1002B041 89442420 mov dword ptr [esp+20], eax
:1002B045 8B442418 mov eax, dword ptr [esp+18]
:1002B049 52 push edx
:1002B04A 8B54240C mov edx, dword ptr [esp+0C]
:1002B04E 50 push eax
:1002B04F 894C242C mov dword ptr [esp+2C], ecx
:1002B053 8B4C2414 mov ecx, dword ptr [esp+14]
:1002B057 51 push ecx
:1002B058 52 push edx
* Reference To: KERNEL32.RaiseException, Ord:01C9h
:1002B059 FF15F4950410 Call dword ptr [100495F4]
--> Me temo que no retrocederemos de aqu� :-)
:1002B05F 5F pop edi
:1002B060 5E pop esi
:1002B061 83C420 add esp, 00000020
:1002B064 C20800 ret 0008
Para salir de esta trampa, simplemente bpx
1002B020, rein�cia todo entero y cuando salte
ensambla un:
ret 0008 (recuerda un parche ' fuerte'
no trabajar� correctamente en la
comprobaci�n del CRC...
causando una fallo de p�gina... �Qu� poderoso
son en Previewsoft)!
Ahora quienquiera que seas, expirado o no, el app
est� trabajando, (aunque d�bilmente
crackeado!).
Apretando F12 una o dos veces t� debe volver
atr�s en 4FA021 (mira anteriormente) justo antes
del condenado CALL EAX.
Como puede ver, EAX es ahora 43D680 y esta
situaci�n no contiene ning�n largo c�digo
ficticio...
Reiniciamos el proceso entero entonces con un bpm
43D680, s�lo para ver c�mo y donde el parche
grande es aplicado.
Aterrizamos aqu�:
* Reference To: KERNEL32.ReadProcessMemory, Ord:01D8h
|
:10015C23 FF158C940410 Call dword ptr [1004948C]
:10015C29 85C0 test eax, eax
:10015C2B 740B je 10015C38
..... ; alg�n c�digo aqu�
:10015C6A 50 push eax
:10015C6B 8D8D48FFFFFF lea ecx, dword ptr [ebp+FFFFFF48]
:10015C71 E84A140000 call 100170C0
* Referenced by a Jump at Address:10015C5C(C)
|
:15C76 8D45D8 lea eax, dword ptr [ebp-28]
:15C79 50 push eax
:15C7A 8B8548FFFFFF mov eax, dword ptr [ebp+FFFFFF48]
; Esta es la longitud = 0x716
:15C80 50 push eax
:15C81 8B854CFFFFFF mov eax, dword ptr [ebp+FFFFFF4C]
; d�nde busca el parche
:15C87 50 push eax
:15C88 8B4DD4 mov ecx, dword ptr [ebp-2C]
--> d�nde aplicarlo (=43D680)
:15C8B 51 push ecx
:15C8C 56 push esi
* Reference To: KERNEL32.WriteProcessMemory, Ord:0283h
|
:10015C8D FF1588940410 Call dword ptr [10049488]
--> �adelante, parch�alo!
:10015C93 85C0 test eax, eax
Ahora
nosotros tenemos todos los elementos para dar de
puntapi�s esta majader�a de aspirante a bueno
de TimeLOCK: aprieta F12 para llegar a 4FA021.
Realmente est� despejado: nosotros queremos
guardar 716h bytes desde 43D680 a un archivo.
�C�mo procedes? �Bien ensamblemos un peque�o
programa usando win32 API que lo har�n para
nosotros! Como parece, el c�digo sobre 4FA028 es
ficticio. As� que Nosotros trabajaremos aqu�.
\>A 4FA040
Entonces teclea las instrucciones siguientes (yo
conf�o en win32 help incluye
archivos para los "pushes" con
CreateFileA y WriteFile):
push 0 ; ficticio pero necesario
push dword ptr 80 ; atributos_archivo_normal (no te olvides de dword ptr o pondr� un
'signed' FFFFFF80 ... me pas� 2 horas en este bug!)
push 02 ; crear_siempre
push 0 ; nulo (campo de seguridad)
push 0 ; archivo no es compartido
push 40000000 ; el archivo es s�lo escritura
push 004FA200 ; la direcci�n del nombre del archivo
call KERNEL32!CreateFileA
push eax ; eax=manipulador. Lo ponemos para cerrar despu�s del manipulador
push 0 ; uno ficticio
push 004FA100 ; d�nde guardar el n�mero de bytes escritos
db 68 16 07 00 00 ; Esto es: push dword ptr 0716, no manej� un poner 'real dword'!
push 43D680 ; Guardamos desde aqu�
push eax ; el manipulador
call KERNEL32!WriteFile
call KERNEL32!CloseHandle
; El manipulador est� aun en la cima de la pila
push ff
jmp 43D680 �Adi�s!
Bien,
s�lo teclea
>EB 4FA200
Y entra la ruta completa del archivo donde los
datos se guardar�n, por ejemplo "C:\\bigpatch,0"
y ahora.... g=4FA040. Espero que tu HD no haya
sido formateado, los m�os est�n OK: -)
|