| ESTUDIO COLECTIVO DE DESPROTECCIONES Última Actualizacion: 25/10/2001 |
Programa | Cuentapasos 3.72 | W95 / W98 / NT
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
Tipo de Tutorial | [X]Original, []Adaptación, []Aplicación, []Traducción
Url | http://www.cuentapasos.com
Protección | Nagscreen con el mensaje de Evaluacion de 30 dias...
Dificultad | 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas | SoftIce 3.22, Tasm 5.0, Process Patcher v 2.4 (opcional).
Objetivo | Simular estar registrados.
Cracker | esiel2
Fecha | 2 de Mayo de 1999
INTRODUCCION
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 ATAQUE
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 | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers. Si necesitas contactar con nosotros , lee esto antes e infórmate de cómo puedes ayudarnos