ESTUDIO COLECTIVO DE DESPROTECCIONES
WKT Tutorialz Site
WKT
Programa Ulead Media Studio Pro v5.01 W95 / W98 / NT
Descripción Se trata de una interesante suite de creaci≤n multimedia:
audio, dibujo, video...
Tipo Trial de 30 dias
Url http://www.ulead.com
Protección Nag Screen. Time Limit 30 Dias
Dificultad 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas SoftIce v3.25, Referencia API32
Objetivo Conseguir que no caduque el programa y Eliminar una horrible X
Cracker Estado+Porcino
Fecha Septiembre de 1999

INTRODUCCION Y AGRADECIMIENTOS DE Mr.WhiTe [WkT!]
Hace ya algún tiempo cayó en mis manos este interesantisimo programa de Ulead, al cual obviamente no me pude resistir. Resultó un adversario bastante digno, quizá demasiado para mi estilo de cracking. Poco tiempo libre y alguna que otra neurona ausente por vacaciones. Así que tras docenas (no exagero, lo juro) de e-mails pidiendo como llorones que publicase un fix de mi crack evitando las dichosas X, me vi obligado a endosarle el muerto a otro. ¿Para qué estan los amigos? :o)

Por lo tanto agradecimiento DOBLE para:
Estado+Porcino y tambien para Mr.PinK [WkT!] que ha colaborado en este artículo.
Que lo disfruteis.

CAPITULO VII. Desclavando cruces con Jose de Arimatea.

DISCULPAS Y FELICITACIONES
Saludos Familia.
Cuanto tiempo, otra vez.

EL escaso tiempo y la falta de protecciones realmente interesantes que caen en mis manazas ralentizan los nuevos capφtulos.

Primero mis felicitaciones al nuevo y excelente panorama crack espa±ol. Grupos como [WkT!], webs tan interesantes como las de ECD (Estudio Colectivo de Proteccciones) y foros de comunicaci≤n (http://disc.server.com/discussion.cgi?id=23018) ponen en contacto a los excelentes crackers que existen en Espa±a.
Felicitaciones a la Gorda por aguantarme tanto tiempo sin tararse :-)

UN PRIMER VISTAZO
Echemos un vistazo a nuestro "ni±o"

La proteccion tiene 2 niveles claramente identificados:

1.- Proteccion Cinderella de 30 dφas.
2.- Unas X rojas censoras en el editor de dibujo y en el editor de video.

Ademas existen 2 nags de entrada que nos recuerdan lo mφsero de la existencia no registrada.

X CENSORAS EN EL EDITOR DE DIBUJO
Bien, saltemos las nags por ahora y abramos el editor de dibujo vpaint.

Pinchemos en File/New/OK y tendremos un bonito lienzo pa dibujar. Un par de brochazos cutres y pulsemos intro para ver la animaci≤n. Sale una horrenda y roja X censora que tapa nuestros est·pidos brochazos. Empezemos a pensar un poco.Como se podra dibujar una X en pantalla. Pos, inicialmente no se me ocurre nada. Bueno sφ color crack, pero si lo utilizamos aparecemos en un nido de llamadas del API de Video, asi que lo dejamos. Veamos que herramientas utiliza aplicando la lista muerta. Lo primero que encontramos en la lista de funciones importadas es:

Import Module 001: MSVFW32.dll

Addr:00086998 hint(0002) Name: DrawDibClose
Addr:000869A8 hint(0003) Name: DrawDibDraw
Addr:000869B6 hint(0007) Name: DrawDibOpen
Esto se parece mucho a MocoSoft Video For Window 32 bits. Recordemos que estamos montando una animaci≤n, asφ que es l≤gico que usemos esta librerφa. Conozcamos algo acerca del formato DIB gentileza de la ayuda de M$ VC++

DrawDib Functions An application uses DrawDib functions to create and manage a DrawDib DC, display and update images on-screen, manipulate palettes, and to close the DrawDib DC when itÆs no longer needed. The DrawDib functions also include a timing function and a test function to determine display characteristics.

Veamos un poco mas acerca de la funcion drawdib que es la que tiene mas pinta de ayudarnos:

The DrawDibDraw function draws a DIB to the screen.
BOOL DrawDibDraw( HDRAWDIB hdd, HDC hdc, int xDst, int yDst, int dxDst, int dyDst, LPBITMAPINFOHEADER lpbi,   
                  LPVOID lpBits, int xSrc, int ySrc, int dxSrc, int dySrc, UINT wFlags ); 

Asi pues con esto pinta en pantalla, pero ┐quΘ tenemos que buscar?

Lancemos nuestro querido Sice cargando previamente el Load Expoorts la libreria MSVFW32.dll Abramos el vpaint y antes de darle al intro pongamos un "bpx drawdibdraw". Y boom, aparecemos en MSVFW32!drawdibdraw con f12 regresamos al vpaint. A esta hora ya ha aparecido la jodida X censora pintada por drawdibdraw, como suponiamos. Aparecemos en:

* Reference To: MSVFW32.DrawDibDraw, Ord:0003h
                                  |
:0046512E E879760000              Call 0046C7AC   // Aqui se pinta la X censora */
:00465133 56                      push esi

* Reference To: MSVFW32.DrawDibClose, Ord:0002h
                                  |
:00465134 E86D760000              Call 0046C7A6   // Cerramos el dib
:00465139 C745FCFFFFFFFF          mov [ebp-04], FFFFFFFF
:00465140 E874000000              call 004651B9
:00465145 B801000000              mov eax, 00000001
:0046514A EB77                    jmp 004651C3


Bien, ya sabemos donde se pinta la X, ahora existen 2 opciones:

  • Que la X se introduzca de forma incondicional ya que estamos en una version Trial del programa.
  • Que se introduzca de forma condicional
La opci≤n B es la mßs sencilla de rastrear, asφ que adelante con ella:

Si rastreamos quien llama a estas sentencias observamos :
:00465A84 E857F7FFFF              call 004651E0  // Si eax==0 no pintamos la X censora.
:00465A89 85C0                    test eax, eax
:00465A8B 741A                    je 00465AA7   //Salto Condicional
:00465A8D 8B442410                mov eax, dword ptr [esp+10]
:00465A91 8B4E04                  mov ecx, dword ptr [esi+04]
:00465A94 50                      push eax
:00465A95 E8C6F5FFFF              call 00465060    //Pinta la X


Rastreando :004651E0 vemos:

:004651E0 56                      push esi
:004651E1 57                      push edi
:004651E2 8BF9                    mov edi, ecx
:004651E4 85FF                    test edi, edi
:004651E6 7427                    je 0046520F
:004651E8 837F2000                cmp dword ptr [edi+20], 00000000  //Flag de control de X
:004651EC 7421                    je 0046520F   //Saltamos si no hay que pintar la X
:004651EE 8B742410                mov esi, dword ptr [esp+10]
:004651F2 56                      push esi
:004651F3 E848FDFFFF              call 00464F40
:004651F8 8B476C                  mov eax, dword ptr [edi+6C]
:004651FB 8B4C240C                mov ecx, dword ptr [esp+0C]
:004651FF 50                      push eax
:00465200 56                      push esi
:00465201 51                      push ecx
:00465202 8B4F78                  mov ecx, dword ptr [edi+78]
:00465205 E8E6020000              call 004654F0
:0046520A 5F                      pop edi
:0046520B 5E                      pop esi
:0046520C C20800                  ret 0008



* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004651E6(C), :004651EC(C)
|
:0046520F 33C0                    xor eax, eax  //Flag activado para evitar las X
:00465211 5F                      pop edi
:00465212 5E                      pop esi
:00465213 C20800                  ret 0008


Si cambiamos :004651E6 7427                    je 0046520F
por          :004651E6 EB27                    jmp 0046520F 

No aparece la X pero tampoco nuestros garabatos, asi que
sigamos subiendo para ver que encontramos:

:004392A3 E888F10100              call 00458430  //Asigna el flag.
:004392A8 85C0                    test eax, eax
:004392AA 740C                    je 004392B8     //Saltamos el 32clpbd.dib_MarkVideo?????
:004392AC 8B07                    mov eax, dword ptr [edi]
:004392AE 50                      push eax

* Reference To: u32clpbd.dib_MarkVideo, Ord:0001h
                                  |
:004392AF FF15DC684800            Call dword ptr [004868DC]   //?????
:004392B5 83C404                  add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004392AA(C)
|
:004392B8 8B75EC                  mov esi, dword ptr [ebp-14]
:004392BB 8B07                    mov eax, dword ptr [edi]
:004392BD 83C608                  add esi, 00000008
:004392C0 50                      push eax
:004392C1 8B5508                  mov edx, dword ptr [ebp+08]
:004392C4 8B0E                    mov ecx, dword ptr [esi]
:004392C6 51                      push ecx
:004392C7 52                      push edx
:004392C8 B908344800              mov ecx, 00483408
:004392CD E89EC70200              call 00465A70  //Lamada para pintar la DIB


Esto se parece mucho a lo que buscabamos, un salto condicional
sobre una funci≤n que trabaja con DIB y con video.

Miremos por 00458430

:00458430 8B81CC010000            mov eax, dword ptr [ecx+000001CC]  //Flag de control de X
:00458436 85C0                    test eax, eax
:00458438 7403                    jmp  0045843d 
:0045843A 33C0                    xor eax, eax    //Buen chico sin cruces en las espaldas
:0045843C C3                      ret


:0045843D 8B8064010000            mov eax, dword ptr [eax+00000164]
:00458443 2D15050000              sub eax, 00000515
:00458448 83F801                  cmp eax, 00000001
:0045844B 1BC0                    sbb eax, eax      //Asigna flag para pintar la X
:0045844D F7D8                    neg eax
:0045844F C3                      ret

Si cambiamos 

            :00458438 7403                    jmp  0045843d  
Por         :00458438 33C0                    xor eax.eax (Offset 0x57838 en Vpaint.exe)

Solucionado el tema, probΘmoslo y funciona a las mil maravillas.

X CENSORAS EN EL EDITOR DE VIDEO
Conociendo el precio del pescao, miremos si existe u32clpbd.dib_MarkVideo dentro de las funciones importadas por el veditor.exe. No hay suerte, asφ que pintan la X de forma diferente, pensemos, por que aquφ es donde reside la diversi≤n.

┐C≤mo narices pinta la X?

Recordemos la funci≤n que se utiliza para pintar en pantalla MSVFW32.DrawDibDraw.
Abramos el editor e insertemos un AVI al final de la secuencia poniendo un bpx drawdibdraw.
La funcion se activa 2 veces antes de dibujar la jodida X en :00488C0E. Si subimos y buscamos saltos condicionales, no encontramos nada aprovechable, asφ que un poco de ZEN.

La funci≤n DrawDibDraw usa un bitmap que es el que pinta en pantalla. este bitmap lo encontrmos como 7║ parßmetro de la funci≤n: LPVOID lpBits,
TRAMPA PARA OSOS
Insertemos un trozo de video al final de la secuencia para dejar varios segundos en blanco s≤lo para la X censora.

En :00488C00 55  push ebp  //Encontramos el puntero a los bytes del bitmap.

Si ponemos un bpx 00488C00 y guarreamos el las bytes del bitmap vemos
que guarremos la X que dibujamos, asφ que estamos en el buen camino.
Como la secuencia de video estß al final, s≤lo hay secuencias en blanco con la X antes del verdadero video.
El aspecto del bitmap es todo FF FF FF FF excepto cuando hay que pintar la X que cambia a 00 00 00
La trampa esta servida pogamos un bpm XXXX W en algunos de los ceros y vemos quien escribe

:0048B2DC C6430100   mov [ebx+01], 00

Estamos en plena rutina de creaci≤n de la X censora.
Esta rutina empieza en :0048B18D y es llamada condicionalmete por

:0048B17B 837E1000                cmp dword ptr [esi+10], 00000000  //Test flag.
:0048B17F 740C                    je 0048B18D  //Salta y p∞nta la X

Si ponemos un bpx en 0048B17B y seguimos indagando, vemos que el flag es realmente [590ff0]

Poniendo un bpm 590ff0 w aparecemos en:

:00527130 A1E8235700              mov eax, dword ptr [005723E8]
:00527135 8B8064010000            mov eax, dword ptr [eax+00000164]
:0052713B 3D14050000              cmp eax, 00000514  //Si el flag maestro es 514 entra de forma normal
:00527140 752B                    jne 0052716D
:00527142 8B44240C                mov eax, dword ptr [esp+0C]
:00527146 8B4C2408                mov ecx, dword ptr [esp+08]
:0052714A 8B542404                mov edx, dword ptr [esp+04]

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:0052714E C70001000000            mov dword ptr [eax], 00000001
:00527154 8B442410                mov eax, dword ptr [esp+10]

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:00527158 C70101000000            mov dword ptr [ecx], 00000001

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:0052715E C70201000000            mov dword ptr [edx], 00000001
:00527164 C70000000000            mov dword ptr [eax], 00000000
:0052716A C21000                  ret 0010



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00527140(C)
|
:0052716D 3D15050000              cmp eax, 00000515  //Flag maestro para entrar en forma trial.
:00527172 752B                    jne 0052719F
:00527174 8B44240C                mov eax, dword ptr [esp+0C]
:00527178 8B4C2408                mov ecx, dword ptr [esp+08]
:0052717C 8B542404                mov edx, dword ptr [esp+04]

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:00527180 C70001000000            mov dword ptr [eax], 00000001
:00527186 8B442410                mov eax, dword ptr [esp+10]

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:0052718A C70101000000            mov dword ptr [ecx], 00000001

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:00527190 C70201000000            mov dword ptr [edx], 00000001

* Possible Reference to String Resource ID=00001: "VE"
                                  |
:00527196 C70001000000            mov dword ptr [eax], 00000001  //Actualiza el flag [590ff0]
:0052719C C21000                  ret 0010


Asi pues, existe un flag maestro, si es 0x514 entramos de forma normal y registrada,
y 0x515 de forma trial. El cambio es claro

:00527140 752B jne 0052716D por :00527140 EB00 jmp 00527142
(0x126540 offset en veditor.exe)

Listo, una cruz menos en nuestra conciencia.
NAGS Y OTRAS ESTUPIDECES
El trabajo duro estß hecho, no queda mas que eliminar un par de nags.
La pista esta en nombres luminosos como u32cfg:ulcCheckLegality
Basta cambiar en el ofsset 0x404 del fichero u32cfg: 6A 00 por EB 13

Bueno, eso es todo, pero recuerda.
Busca la fuente, busca a +ORC en la Red
Hasta la pr≤xima.
estadoporcino@hotmail.com


[ 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 ]