Flash 32 v 1.27 Time Expiration removal and banner removal by Black Fenix

Bueno nuestro quinto tutorial sobre cracking, en esta entraga vamos a variar un poco dejando los keygenerators de lado y vamos a examinar un programa llamado Flash 32 v 1.27. Este programa sirve para capturar pantallas o secuencias de estas, acepta multitud de formatos incluso AVI y FLI y tambien puede capturar pantallas de programas en MS-DOS.

El programa es de evaluación y expira a los treinta dias , ademas en todas las pantallas que capturemos aparecerá el texto 'Flash - Evaluation' tapando con ello parte de la imagen. Nuestro proposito es eliminar el limite de tiempo (30 dias) el texto que imprime al salvar las capturas y el NAG que muestra al salir del programa. Como puedes ver este crack promete ser divertido y variado :)

El programa no permite introducir ningún numero de registro por lo que en este caso nuestra busqueda empezará de otra
manera y tendremos que modificar directamente el ejecutable.

necesita.gif (15203 bytes)

marcador.gif (1024 bytes) W32Dasm
marcador.gif (1024 bytes) SoftIce 4.0
marcador.gif (1024 bytes) Un editor hexadecimal ( a tu gusto )

El Flash 32 v1.27 lo encontre en el número 4 del CD-ROM de la revista CD-MAX.

Puedes conseguirlo en internet en: http://perso.infonie.fr/chass/indexe.htm

comenza.gif (16493 bytes)

marcador.gif (1024 bytes) Instalar el programa, ejecutarlo y este funcionará normalmente, ahora salimos del programa (este queda instalado en la barra de tareas por lo que haremos click sobre su icono con el botón izquierdo y seleccionaremos 'Close Flash'. Nos aparecera una pantalla en la que se nos invita a registrarnos (aunque pulsemos register lo unico que saldrá es una ventana con un fichero de texto donde deberemos rellenar unos datos y enviarlos al autor para que nos envie la versión registrada) pulsaremos Ok y saldremos del programa.

marcador.gif (1024 bytes) Ahora cambiamos la fecha del sistema y la avanzamos en más de treinta dias de la actual. Ejecutamos de nuevo el programa y nos aparece una ventana que dice: 'The evaluation period is finished bla bla bla...' bien, recordarla, Ahora hacemos una copia del ejecutable y lo renombramos a Flash32.exx abrimos el W32Dasm y desensamblamos dicha copia para no trabajar con el original.

marcador.gif (1024 bytes) Una vez desensamblado, pulsamos sobre el icono 'Strn Ref' y buscamos la cadena 'The evaluation bla bla ...' una vez encontrada hacemos doble click sobre esta y el W32Dasm nos llevará a la unica parte del programa donde se hace referencia a esta cadena, veras algo así:

* Possible StringData Ref from Data Obj //"The evaluation period is finished."
:004077746858CF4300push 0043CF58 // ESTA ES LA REFERENCIA A LA CADENA
* Possible StringData Ref from Data Obj //"%s"
:0040777968A4C84300push 0043C8A4
:0040777E68409C4500push 00459C40
* Reference To: USER32.wsprintfA, Ord:02ACh
:00407783FF156C554300Call dword ptr [0043556C]
:0040778983C40Cadd esp, 0000000C
:0040778C6A10push 00000010
* Possible StringData Ref from Data Obj //"Flash"
:0040778E68F4CE4300push 0043CEF4 // Titulo de la ventana
:0040779368409C4500push 00459C40
:004077986A00push 00000000
* Reference To: USER32.MessageBoxA, Ord:01BEh
:0040779AFF15E8544300Call dword ptr [004354E8] // Muestra el cuadro de dialogo
:004077A05Epop esi
:004077A133C0xor eax, eax
:004077A35Bpop ebx
:004077A4C21000ret 0010

Como puedes comprobar este código prepara el cuadro de dialogo y lo muestra con MessageBox, esto quiere decir
que alguien tuvo que enviarnos aquí de alguna manera por lo que mirando los posibles saltos vemos que el primero
viene de 40775Ah

* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0040775A(C) * Possible StringData Ref from Data Obj //"The evaluation period is finished."
:004077746858CF4300push 0043CF58 // ESTA ES LA REFERENCIA A LA CADENA

Esta dirección está justo por encima, si miramos el código superior encontraremos un salto en la dirección 407755A.

:00407732C7053098450000010000mov dword ptr [00459830], 00000100
:0040773C8915A4954500mov dword ptr [004595A4], edx
:00407742A32C984500mov dword ptr [0045982C], eax
:004077478915A4984500mov dword ptr [004598A4], edx
:0040774DE81EC70100call 00423E70
:0040775283C430add esp, 00000030
:0040775548dec eax
:004077565Fpop edi
:00407757744Eje 004077A7
:0040775948dec eax
:0040775A7418je 00407774 // ESTE ES EL SALTO QUE NOS ENVIA AL CUADRO DE DIALOGO
:0040775C6A00push 00000000
:0040775E6820614000push 00406120
:004077636A00push 00000000
* Possible Reference to Dialog: DialogID_009C
:00407765689C000000push 0000009C
:0040776A56push esi
:0040776BFFD3call ebx
:0040776D5Epop esi
:0040776E33C0xor eax, eax
:004077705Bpop ebx
:00407771C21000ret 0010

Examinando este código podriamos suponer que EAX contiene algun tipo de flag que nos indica si el programa está o no registrado ya que si seguimos el flujo normal del programa vemos que este no llamaria a ningún cuadro de dialogo y volveria al proceso que lo llamo con un ret. Si suponemos lo anteriormente dicho, estamos en lo cierto (no es que sea adivino si no que lo he comprobado) ya que la función que es llamada en 4077D4 se encarga de leer la fecha de instalación del programa desde
el registro de windows y comprobar la diferencia de tiempo con la función GetSystemTimeAsFileTime, puedes comprobarlo tu mismo si miras el codigo a partir de la dirección 423E70 (No lo he incluido por ser muy extenso).

marcador.gif (1024 bytes) Bueno pues ya sabemos que si cambiamos el salto por un par de NOPs (código 90h cada NOP) probablemente el programa funcionará aunque pasemos el límite de tiempo de 30 días. Para realizar esta modificación nos colocamos sobre la linea :0040775A asegurandomos que la linea azul del W32Dasm este sobre esta y ahora apuntamos el offset que nos marca en la barra de estado (este offset es la posición física del primer byte de la instrucción dentro del ejecutable) este valor debe ser 775Ah. Ahora nos vamos a nuestro editor hexadecimal favorito y abrimos el ejecutable original (Flash32.exe) nos vamos al offset 775Ah con las bunciones de busqueda de este (debe tenerlas) y cambiamos los bytes 74 18 por 90 90 salvamos los cambios y ejecutamos el programa. Sorpresa, funciona y han transcurrido más de 30 días
desde la fecha de instalación.

marcador.gif (1024 bytes) Ahora vamos a capturar una porción del escritorio, click con el botón izquierdo sobre el icono de la barra de tareas Captures/Region, pulsamos OK y designamos un area rectangular de la pantalla con el mouse. El programa cogerá dicha porción y nos la presentará junto con una serie de menus. Vamos al menu Capture/Save as, le damos un nombre, seleccionamos los bpp de la imagen y la guardamos donde queramos, mientras se salva vemos que aparece la cadena 'Flash - Evaluation' sobreimpresa en la imagen y luego desaparece. si miramos la imagen que acabamos de salvar veremos que esta cadena a aparecido en ella, tapando con ello parte de nuestra captura, y esto no nos interesa.

Bien sabemos que mensaje muestra por lo que podriamos intentar el mismo metodo que usamos con la cadena anterior, pero no sirve ya que la cadena 'Flash - Evaluation' no aparece en la lista de cadenas del W32Dasm, por lo que debemos pensar en otra solución. Pensemos, el programa imprime una cadena, por lo tanto necesitará llamar a alguna función del GDI de windows para imprimirla en pantalla. ¿ Que funciones de dibujo de texto nos proporciona el GDI de windows ? Unas cuantas pero las siguientes son las más usadas.

TextOut,TextOutA
DrawText,DrawTextA
DrawTextEx,DrawTextExA

Nota: La A final indica que es de 32bits.

De estas tres funciones la más simple es la primera TextOut, podriamos suponer que el programador que hizo el Flash no quiso complicarse la vida y usó esta función para imprimir el texto. Recuerda, prueba primero lo más sencillo, suele funcionar el 90% de los casos. Pongamos el SoftIce en marcha.

Probemos, vayamos hasta el cuadro de dialogo que nos permite introducir el nombre, pongamos uno y activemos el SoftIce (Ctrl+D) ahora ponemos un bpx textouta y un bpx textout (el programa es de 32 bits) y pulsamos g para continuar con la ejecución normal. Pulsamos el boton de OK para salvar y Ops!! estamos de nuevo en SoftIce. La función TextOut tiene un inconveniente, y es que es muy usada por el propio windows para escribir los nombres de los botones y de los menus, por lo que ahora deberemos ir pulsando g unas cuantas veces hasta que desaparezca por completo el cuadro de dialogo, cuando este desaparezca, continuaremos pulsando g y veremos que los nombres de los menus se van escribiendo, cuando se escriba el último 'Help' pulsamos g de nuevo y la proxima vez que entremos en SoftIce será para imprimir la cadena 'Flash - Evaluation' ahora ulsamos F12 hasta que llegemos al codigo fuente de FLASH32.EXE veremos algo así:

 

* Reference To: GDI32.TextOutA, Ord:0205h
:0041626EFF1540524300Call dword ptr [00435240] // Llama a TextOutA
:004162748B1518884500mov edx, dword ptr [00458818] // Estamos aquí
:0041627A8B442418mov eax, dword ptr [esp+18]
:0041627E8B4C2414mov ecx, dword ptr [esp+14]
:0041628250push eax
:0041628351push ecx
:0041628452push edx
:0041628556push esi

Aquí está la llamada que imprime la cadena 'Flash - Evaluation', podriamos simplemente eliminarla con NOPs, pero esto no
funcionaria y recibiriamos un (Protection Fault ya que habria que nopear los pushes previos a la llamada) despues de
salvar la imagen (lo he comprobado).
Cual es la manera más sencilla de hacer que no se imprima la cadena ? Antes de nada miremos el funcionamiento de la función TextOut segun el API de Windows.

BOOL TextOut(
    HDC hdc, // handle del dispositivo de contexto
    int nXStart, // coordenada X del texto
    int nYStart, // coordenada Y del texto
    LPCTSTR lpString, // puntero a la cadena a imprimir
    int cbString // numero de caracteres a imprimir
);

Pues hay varias:

Una opción seria modificar las coordenadas del texto para que estuvieran fuera de la imagen, pero esto implica bastantes modificaciones en el código.

La siguiente más sencilla y rápida de ejecución es cambiar el numero de caracteres a imprimir y decirle que imprima 0 caracteres o sea ninguno, esta es la solución.

marcador.gif (1024 bytes) Habiendo optado por la segunda opción debemos localizar donde se pasa (empuja) la longitud de la cadena como parametro para la función TextOut, como es una pila LIFO (último en entrar primo en salir) el numero de caracteres debera ser el primer PUSH de todos los que hay por encima de la función TextOut.
Ahora apuntamos a dirección 0041626E que es donde se llama a TextOut y salimos del SoftIce. Nos vamos al W32Dasm y desensamblamos la copia del archivo original (es el Flash32.exx) , vamos al menu Goto/Code Location e introducimos el offset que nos apuntamos anteriormente (41626E) pulsamos OK y veremos algo asi:.

:0041623C8B442418mov eax, dword ptr [esp+18]
:004162406A12push 00000012 // Empuja longitud de la cadena para TextOut
:0041624299cdq
:004162432BC2sub eax, edx
:004162458B1518884500mov edx, dword ptr [00458818]
:0041624BD1F8sar eax, 1
:0041624D3BC2cmp eax, edx
:0041624F7D0Bjge 0041625C
:004162518D8424B0010000lea eax, dword ptr [esp+000001B0] // copia en eax puntero a 'Flash - Evaluation'
:0041625850push eax // empuja puntero a la cadena
:0041625952push edx // empuja coordenada X
:0041625AEB09jmp 00416265
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0041624F(C)
:0041625C8D9424B0010000lea edx, dword ptr [esp+000001B0] // copia en eax puntero a 'Flash - Evaluation'
:0041626352push edx // empuja puntero a la cadena
:0041626450push eax // empuja coordenada X
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0041625A(U)
:0041626551push ecx // empuja coordenada Y
:0041626656push esi // este es para la función GetDC
* Reference To: USER32.GetDC, Ord:00FDh
:00416267FF159C544300Call dword ptr [0043549C]
:0041626D50push eax // Pasa el handle
:0041626EFF1540524300Call dword ptr [00435240] // ESTAMOS AQUI !!!!! llama a TextOut
:004162748B1518884500mov edx, dword ptr [00458818]
:0041627A8B442418mov eax, dword ptr [esp+18]
:0041627E8B4C2414mov ecx, dword ptr [esp+14]

Ahora buscaremos todos los los push que hay antes de la llamada al TextOut, sabemos que deben ser un máximo de cinco. En 41626E encontramos el primero.

   :0041626D 50 push eax -> Pasa el handle

el segundo en :


  :00416265 51 push ecx -> coordenada X

el tercero y el cuarto en:


    :00416258 50 push eax -> Puntero a 'Flash - Evaluation'
    :00416259 52 push edx -> coordenada Y

y el quinto que es el nuestro en:

   :00416240 6A12 push 00000012 -> 12h = 18 -> longitud de 'Flash - Evaluation'

Si no te aclaras examina de nuevo el código detalladamente y comprenderas su funcionamiento.

marcador.gif (1024 bytes) Bueno ya esta claro lo que hay que hacer o no ? . Claro, reemplazar el push 12 por un push 0. Actuaremos igual que hicimos para modificar el salto anterior, apuntar el offset y sustituir el 6A12 por un 6A0 dentro del ejecutable.Vamos intentalo sólo, es fácil. Una vez hechas las modificaciones, no volveras a ver ningun texto sobre tus capturas.

marcador.gif (1024 bytes) Como tarea adicional podriamos eliminar el cuadro de dialogo que aparece al salir del programa ya que es molesto y no sirve para nada. Para ello podriamos utilizar la técnica de buscar una referencia a las cadenas que este cuadro muestra, pero no encontrariamos ninguna. Bueno no te preocupes lo intentaremos de otro manera. Examina el cuadro de dialogo por un momento; no es un MessageBox convencional, por lo tanto debe ser un DialogBox, ademas este dialog box no retorna el control a la aplicación hasta que se sale de este. Piensa. Las funciones para la creación de cuadros de dialogos son las siguientes:

CreateDialog
CreateDialogIndirect
CreateDialogIndirectParam
CreateDialogParam
DialogBox
DialogBoxIndirect
DialogBoxIndirectParam
DialogBoxParam

Pero como hemos dicho que el cuadro de dialogo no pasa el control a la aplicación hasta su finalización por parte del usuario, las 4 primeras quedan anuladas. Sólo nos quedan las siguientes.

DialogBox
DialogBoxIndirect
DialogBoxIndirectParam
DialogBoxParam

Pues a que esperas, ejecuta el programa, activa el SoftIce y pon un bpx DialogBox, bpx DialogBoxIndirect, bpx GialogBoxIndirectParam, bpx DialogBoxParam, pulsa g y ahora sal del Flash32. Boom! el bpx DialogBoxIndirectParam ha surtido efecto, pulsamos F12 una vez y estaremos justo debajo de la llamada a este, veras algo así en el SoftIce:

:00406A3FA124A24500mov eax, dword ptr [0045A224]
:00406A446A00push 00000000
:00406A466830214200push 00422130
:00406A4B56push esi
:00406A4C6805010000push 00000105
:00406A5150push eax
* Reference To: USER32.DialogBoxParamA, Ord:0093h
:00406A52FF15A8544300Call dword ptr [004354A8] // Muestra el cuadro de dialogo
:00406A5885C0test eax, eax // ESTAMOS AQUÍ
:00406A5A0F8498080000je 004072F8 // Si no se pulso OK (EAX=0) no saldrá del
:00406A6056push esi // programa
:00406A61E88A360200call 0042A0F0
:00406A66A1FC904500mov eax, dword ptr [004590FC]
:00406A6B83C404add esp, 00000004
:00406A6E85C0test eax, eax
:00406A707413je 00406A85
:00406A7256push esi

Examina el código y veras que este es nuestro hombre, se empujan cinco argumentos a la pila se llama a la funcion que muestra el cuadro de dialogo y se comprueba el valor de EAX, si EAX=1 se pulsó el botón OK y se sale de la aplicación, si se pulsa el botón cancelar, EAX=0 y no se saldrá de la aplicación. Los cinco argumentos que se empujan a la pila son para la función DialogBoxParamA ,fijate que esta función usa la función DialogBoxIndirectParam para crear dicho cuadro. Aquí tienes una descripción del funcionamiento de la función DialogBoxParamA

int DialogBoxParam(
    HINSTANCE hInstance, // handle a la instancia de la aplicación
    LPCTSTR lpTemplateName, // identifica el cuadro de dialogo
    HWND hWndParent, // handle a la ventana propietaria
    DLGPROC lpDialogFunc, // puntero a una función que controla el cuadro de dialogo
    LPARAM dwInitParam // valor de inicialización
);

marcador.gif (1024 bytes) Pues ahora se trata de eliminar el cuadro de dialogo pero, ¿ como ?, fácil primero hay que eliminar los 5 push previos ha la llamada a DialogBoxParamA , luego eliminar la llamada y hacer que EAX siempre valga 1. Aquí puedes ver el código modificado.

 

:00406A3FA124A24500mov eax, dword ptr [0045A224]
:00406A4490nop
:00406A4590nop
:00406A4690nop
:00406A4790nop
:00406A4890nop
:00406A4990nop
:00406A4A90nop
:00406A4B90nop
:00406A4C90nop
:00406A4D90nop
:00406A4E90nop
:00406A4F90nop
:00406A5090nop
:00406A5190nop
:00406A52B801000000mov eax, 00000001 // Aquí estaba el Call
:00406A5790nop
:00406A5885C0test eax, eax // Fin de las modificaciones
:00406A5A0F8498080000je 004072F8
:00406A6056push esi
:00406A61E88A360200call 0042A0F0
:00406A66A1FC904500mov eax, dword ptr [004590FC]
:00406A6B83C404add esp, 00000004
:00406A6E85C0test eax, eax
:00406A707413je 00406A85
:00406A7256push esi

marcador.gif (1024 bytes) Bueno esto es todo, las modificaciones las dejo a tu cargo para que practiques, recuerda, buscar el offset del primer byte de la instrucción, apuntar las modificaciones desde esta posición y con el editor hexadecimal que prefieras realizar las modificaciones.

Que te ha parecido el tutorial ? Es cierto que podriamos haber atacado por otros puntos pero yo le he hecho de la manera que me ha sido más facil. Recuerda un programa puede hacerse de varias maneras, un crack tambien pero siempre es mejor usar la manera más corta y la que implique menos modificaciones.


You are inside Reversed Minds pages.

por Mr. Silver / WKT!
La información aquí vertida es exclusivamente para uso educacional, no puedo hacerme responsable del uso que se haga de esta, por lo que atiendo a la honradez de cada uno :), recuerda que debes comprar el software que utilices :)