Veamos, despues de instalar el programa, al ejecutarlo vemos
que nos sale una nagscreen avisandonos que no estamos registrados
y que tenemos un periodo tipico de prueba de 30 dias.
Al ser un programa hecho en Visual Basic, nos aseguramos
que en el fichero winice.dat del softice este la linea:
EXP=C:\WINDOWS\SYSTEM\MSVBVM50.DLL
Hechas ya las presentaciones, vamos a intentar abordarlo
con los siguientes
breakpoints que a mi entender son bastantes utiles a la
hora de crackear programas
hechos en Visual Basic, que son lo siguientes:
rtcDoEvents
rtcMsgBox
__vbaNew
__vbaNew2
rtcInputBox
rtcGetTimer
rtcUpperCaseVar
rtcUpperCaseBstr
Pues bien, el primer paso que tenemos que dar es buscar
donde el programa toma la eleccion de seguir cuando
nosotros pulsamos aceptar o salir cuando pulsamos el boton
correspondiente; de esta lista probamos en esta ocasion
con rtcDoEvents, asi que nos vamos
al softice ponemos bpx rtcdoevents, y pulsamos
Ctrl-D con lo que volvemos a la nagscreen y pulsamos aceptar;
inmediatamente despues volvemos al softice y pulsamos una
vez F12 con lo que nos situamos en las siguientes lineas:
Pulsamos F10
0137:00474963 call [MSVBVM50!rtcDoEvents]
0137:00474969 mov dword ptr [ebp-04],00000051
0137:00474970 lea ecx,[ebp-64]
0137:00474973 push ecx
0137:00474974 call [MSVBVM50!rtcGetPresentDate]
0137:0047497A lea edx,[ebp-64]
...
...
...
Vamos pulsando F10
...
...
...
0137:004749B2 push edx
0137:004749B3 push 02
0137:004749B5 call [MSVBVM50!rtc__vbaFreeVarList]
0137:004749BB add esp,0C
0137:004749BE movsx eax, word ptr [ebp-00D4]
0137:004749C5 test eax,eax
---> si eax=0 sale, no sigue y termina el programa.
0137:004749C7 jz 004761B3
---> si eax=-1 entonces sigue
0137:004749CD mov dword ptr [ebp-04],00000052
0137:004749D4 cmp dword ptr [0054F200],00
0137:004749DB jnz 4749F9
---> Si eres un chico bueno sigue para adelante
en caso contrario si eres un chico malo
se acabo tu andadura.
Bueno, bueno, bueno, segun parece hemos encontrado el lugar
donde despues de pulsar sobre uno de los dos botones de
la nagscreen el programa hace una cosa u otra dependiendo
de si aceptas o deseas salir. Luego ya tenemos la direccion
donde despues de multiples calculos de conversiones de tipos
de datos tipicos del Visual Basic, esquema de proteccion
del autor (de la cual se podria hablar en otro tutorial),
etc, etc, etc, se dirige el programa. Luego recapitulemos,
ya sabemos donde tiene que saltar para proseguir el programa,
ahora nos hace falta saber desde donde lo podemos llamar.
¿Que se os ocurre?
a mi personalmente despues de ver lo bien que ha funcionado
el breakpoint del rtcDoEvents,
voto por volverlo a usar pero ahora antes de que salga la
nagscreen.
Empezamos otra vez, ponemos el breakpoint del rtcDoEvents,
y vamos pulsando Ctrl-D hasta uno antes de que salga la
famosa nagsreen (tenemos que pulsar 4 veces Ctrl-D)
con lo que nos encontramos con lo siguiente:
* Vamos pulsando F10 *
0137:00477D06 call [MSVBVM50!rtcDoEvents]
0137:00477D0C wait
0137:00477D0D push 00477D66
0137:00477D12 jmp 00477D5C
...
...
0137:00477D5C lea ecx,[ebp-24]
0137:00477D5F call [MSVBVM50!__vbaFreeStr]
0137:00477D65 ret
0137:00477D66 mov ecx,[ebp-20]
0137:00477D69 mov fs:[00000000],ecx
0137:00477D70 pop edi
0137:00477D71 pop esi
0137:00477D72 pop ebx
0137:00477D73 mov esp,ebp
0137:00477D75 pop ebp
0137:00477D76 ret 0004
...
...
0137:004741D6 call 00476F50
---> Todo el meollo de la proteccion
0137:004741 mov
dword ptr [ebp-04],0000003F ---> regresa aqui despues
del anterior ret 0004
0137:004741E2 cmp dword ptr [0054B7AC],00
0137:004741E9 jnz 00474207
....
....
Pues
bien, a partir del JNZ 00474207 empieza a decir que no estamos
registrados, que si es un version de evaluacion, .... Luego
si en vez de que ese CALL 00476F50 llame todas las comprobraciones
que lleva a cabo ponemos la direccion que obtuvimos antes
donde proseguia el programa, VOILA ;).
Cambiamos el call 00476F50 por call 004749F9. Pero Houston,
Houston, tenemos un problema, el parche no podemos aplicarlo
con un editor hexadecimal (bendito Visual Basic), pues bien
aqui tenemos dos opciones:
- Usar el Proccess Patcher v2.4 de thewd
- Usar el Tasm 5.0
Si usas el Tasm 5.0:
; Basado en el loader.exe original de Hayras [tNO '98]
; Tienes que usar Tasm 5.0 & import32.lib para compilarlo
; tasm32 /ml crack.asm
; tlink32 /Tpe /aa /ccrack,, <path to> import32.lib
; reemplaza <path to> donde este la libreria import32.lib
.386P
Locals
jumps
.Model Flat ,StdCall
;Definimos las funciones externas y constantes que necesitamos.
Extrn MessageBoxA:PROC
Extrn WaitForInputIdle:PROC
Extrn WriteProcessMemory:PROC
Extrn ReadProcessMemory:PROC
Extrn CreateProcessA:PROC
Extrn CloseHandle:PROC
Extrn ExitProcess:PROC
.Data
CSiR_Tag
db 'Lector PE & CRACKER Por esiel2 -1999-
',0
CSiR_Error
db 'Error!!!',0
CSiR_Error1
db 'Algo se jodio...',0
OpenERR_txt
db 'Error con el CreateProcess :(',0
ReadERR_txt
db 'Error con el ReadProcessMemory :(',0
WriteERR_txt db
'Error con el WriteProcessMemory :P',0
VersionERR_txt db 'No es la
version 3.72 del cuentapasos :(',0
CSiR_ProcessInfo dd 4 dup (0)
CSiR_StartupInfo db 48h dup (0)
CSiR_RPBuffer db 10h
dup (0)
CSiR_AppName db 'cpasos32.EXE',0
fuck
dd 004741d6h
sizeof dd 5
checkbytes db 0e8h,075h,02dh,0,0
patch_data_1 db 0e8h,01eh,08h,0,0
patch_size_1 dd 5
patch_addr_1 dd 004741d6h
.Code
Main:
push offset CSiR_Tag
mov dword ptr
[CSiR_StartupInfo],44h
push offset CSiR_ProcessInfo
push offset CSiR_StartupInfo
push 0
push 0
push 20h
push 0
push 0
push 0
push 0
push offset CSiR_AppName
call CreateProcessA
test eax,eax
jz OpenERR
Wait4Depack:
push LARGE-1
push dword ptr [CSiR_ProcessInfo]
call WaitForInputIdle
Check_Data:
push 0
push dword ptr [sizeof]
push offset CSiR_RPBuffer
push dword ptr [fuck]
push dword ptr [CSiR_ProcessInfo]
call ReadProcessMemory
test eax,eax
jz ReadERR
;...
;int 03 ;-)
cld
lea esi, CSiR_RPBuffer
lea edi, checkbytes
mov ecx, 5
rep cmpsb
jnz VersionERR
;...
Patch_the_mother:
push 0
push dword ptr [patch_size_1]
push offset patch_data_1
push dword ptr [patch_addr_1]
push dword ptr [CSiR_ProcessInfo]
call WriteProcessMemory
test eax,eax
jz WriteERR
Close_This_app:
push dword ptr [CSiR_ProcessInfo]
call CloseHandle
push dword ptr [CSiR_ProcessInfo+4]
call CloseHandle
Exit_Proc:
Push LARGE-1
Call ExitProcess
VersionERR:
lea eax, VersionERR_txt
jmp abort
ReadERR:
lea eax, ReadERR_txt
jmp abort
OpenERR:
lea eax, OpenERR_txt
jmp abort
WriteERR:
lea eax, WriteERR_txt
abort:
push 0
push offset CSiR_Error
push eax
push 0
call MessageBoxA
jmp Close_This_app
End Main
Se acabo por esta vez, espero que me haya explicado bien,
hasta otra....
|