--
ESTUDIO COLECTIVO DE DESPROTECCIONES
WKT Tutorialz Site
WKT
progrAmA  Cuentapasos  3.72 W95 
DEsCripCión  El programa cuentapasos es una utilidad  para controlar
el gasto telefonico, con los ultimos planes (los bononets) 
que telefonica a puesto.
tipo  Shareware
url  http://www.cuentapasos.com
protECCión  Nagscreen con el mensaje de Evaluacion de 30 dias... 
DiFiCultAD   2) Amateur
hErrAmiEntAs  SoftIce 3.22, Tasm 5.0, Process Patcher  v 2.4 (opcional). 
CrACkEr   esiel2
FEChA  2 de Mayo de 1999 
ComEntArio   Como comentario, no voy a hacerlo estilo Carrascal, sino decir 
que este crack funciona para el cuentapasos 3.72 con las siguientes
caracteristicas:

Fichero: cpasos32.exe
Tamaño: 531.611 bytes
Fecha: 30/3/99

  Digo esto, porque me han informado que el autor ha modificado
el ejecutable haciendolo mas pequeño, pero todavia no me lo he
bajado para comprobarlo.  ;)
 
 

Introducción
          Lo primero de todo, mandar unos saludetes a tod@s los colegas de la scene del
cracking hispano, ya que segun veo parece que estamos remontando el vuelo, a ver
si algun dia llegamos a hacer una pagina semejante a la de +fravia.

          Bueno, he escogido este programa porque es bastante popular al menos que yo
sepa en españa, y al parecer no habia un crack para el y decidi intentar remediarlo.

Al Atake

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


 
[ Entrada | Documentoz Genéricoz | WKT TEAM Main Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x orden Alfabético ]