ESTUDIO COLECTIVO DE DESPROTECCIONES
Última Actualizacion: 25/10/2001

Programa C-Dilla SafeDisk ( Gran Thief Auto) W95 / W98 / NT
Descripción Como Mandar Al Traste Este Sistema De Proteccion
Tipo Sistema de proteccion basado en la desencryptacion del ejecutable por medio de una autentificacion
Tipo de Tutorial [X]Original, []Adaptación, []Aplicación, []Traducción
Url  
Protección Encryptacion del programa
Dificultad 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas SoftIce v3.25, Proc Dump, UltraEdit v6.10a , Frog Ice , Adump
Objetivo Ejecutar un programa protegido sin el cd original
Cracker SkUaTeR
Fecha 1 de Febrero de 2000

INTRODUCCION
 Hola a todos bueno este articulo lo he adaptado para el ECD en el fusionado todos los ultimos "tips" para
 destripar a Safedisk los primeros tutoriales ke escribi sobre este tema los puedes encontrar en la pagina 
 de KARPOFF.
 Si necesitas mas informacion pudes buscarla en las paginas de BlackCheck y R!SC (en ingles sorry).

 Bueno explicare un poco como funciona este eskema de proteccion.
 Safedisc de C-dilla es un sistema de encryptacion de datos basado en una autentificacion(key)
 grabada en el CD de forma especial en la masterizacion.
 Si te fijas en el cd protegido veras ke tiene unos ficheros llamados 
 Clockspl.exe , Dplayerx.dll , clcd16.dll , clcd32.dll , un fichero .ICD
 estos ficheros son la proteccion el fichero .ICD es realmente el ejecutable del juego
 mientra ke el ejecutable ke vemos con el icono del juego solo ocupa unos 200kb y es
 el encargado de desencryptar los datos del fichero .ICD ke luego sera el ke realmente se ejecute.
 Esta proteccion tambien tiene sistemas de deteccion del debuger por lo ke tendremos ke 
 ocultarlo.
 O.K comenzamos...

1.- Herramientas Necesarias.
SoftIce v3.23 o 3.22
 -Frogsice
 -Procdump
 -Saca (descompone un fichero pe, esta utilidad es la traduccion de pe-splite de R!sc la puedes encontrar en su pagina
             o en la de Karpoff junto los respectivos tutoriales)
 -Heditor hexadecimal (HexWorkshop,Ultraedit...)
- Adump
 -Un juego protegido por safedisc ( en este tutorial utilizaremos Gran Tief Auto 2)
2.-Comenzamos
A  Utiliza el programa ProcDump para saber la informacion de la cabecera PE
  Pulsa en el boton Pe Editor y elige el fichero .ICD protegido en nuestro caso elegiremos 
  GTA2.ICD ahora prodras ver una ventana en la ke pone 

   Entry Point  :001E74D0 ; este es el punto de entrada al programa pero falta sumarle la base
   size of Image:00303000  ;estos datos no sirven de nada
   Image base   :00400000  :Esta es la base del programa habra ke sumarla luego...

   pulse en el boton Sections y aparecera:
     (solo voy a escribir los datos necesarios)

     Name           Vir.Size        Vir.Offset     Raw size     Raw offset     Characteristics
      .text               -                      1000          1F5000        -                      -
      .rdata             -                  1F6000             7C00        -                      -
      .data              -                  1FE000          22C00         -                      -
      .rsrc               -                  302000              A00         -                      -

A todos estos datos tendremos ke sumarles la base del programa 00400000 (todos menos a Raw size)
con lo ke tendremos:
Entry Point :001E74D0+00400000 = 5e74d0
          .text :00001000+00400000  =  401000 
        .rdata :001F6000+00400000  =  5f6000
         .data :001FE000+00400000  =  5fe000
          .rsrc :00302000+00400000  = 702000

 Bien apuntas estos datos y continuaremos...
 Ejecuta el programa FrogsIce con el cual esconderemos el debuger.
(te recomiendo ke uses la ultima version de frogs ice si usas la anterior a agosto del 99 tendras ke parchearla mira el 
  tuto  de blackcheck si es tu caso).
 En caso de ke tu version de Frogs Ice sea la ke te digo o superior dile ke no te muestre la pantalla de alerta.
 (leete la documentacion del programa)

 Ejecuta el juego protegido , y cundo te aparezca la ventana con la imagen de juego pulsa crtl+d
 para ir a winice, bien ahora pon un BPX en freelibrary
 :BPX FreeLibrary 
 necesitamos ver si los datos de juego se han desencryptado para ello visualizaremos 
 la direccion al Punto de entrada ke es 005e74d0
 :d 5e74d0
 si los datos no se an desencryprtado veremos muchos ?? si es asi pulsa 
 F5 
 asta ke aparezcan los datos desencryptados una vez aparezcan kita el BPX
 :bc *
 y pon un nuevo BPX en el punto de entrada al programa 005e74d0
 :bpx 5e74d0
 Pulsa F5 y el programa se dentendra en 5e74d0

 Ya tenemos los datos desencryptados (ha sido facil ¿¿no??)

 Llegados a este punto podemos optar por 2 opciones para bolcar estos datos al disco duro 

 Opcion 1: Uso del comando Pagein modificado:

 Aplica el parche Icedump.exe a winice.exe para obtener el comando pagein modificado
 donde su sintaxis es PAGEIN dire_memoria longitud_memoria fichero
 

 Pues nada bolkemos los datos al disco duro (recuerda ke para hacer esto es necesario ke parchees el  winice.exe 
 con el  parche ICedump )

 :bc *      <----con esto eliminamos los brackpoints po si acaso
 :pagein 401000 1f5000 c:\text.bin
 :pagein 5fe000  22c00 c:\data.bin
 :pagein 702000 a00 c:\rsrc.bin

 Seguramente la seccion .rsrc no este aun , pero nos da igual ya que esta seccion no esta encryptada y la 
 podemos coger directamente del fichero gta2.icd. Para esto usaremos el programa SACA.EXE
 elegimos el fichero gta2.icd y cogemos la seccion e.bin y se renombra a rsrc.bin
 (pagein A B C) 

 si te das cuenta los valores son 
      (A) Vir.Offset de text,data,rsrc +400000 
      (B) raw.sice   de text,data,rsrc
      (C) fichero en el cual grabar 

 Opcion 2: Uso del procdump

 Bueno hay otro metodo mas facil ke consta en lo siguiente:
 Cargas el Adump y obtienes el segmento de memoria para trabajar con el soft ice esto se hace con el comando R .
 eliminas los BPX  (bc *) y cambias el puntero de ejecucion EIP (r eip offset de adump) a la zona de memoria
 ke te dijo el Adump luego en esta ensamblas lo siguiente JMP EIP ( a eip,jmp eip) con esto creamo un bucle y asi 
 suspendemo la ejecucion del GTA.
 Ahora solo nos keda cargar el procdump y bolcar ese proceso.(para mas informacion consulta el tutorial de
 Descompresion manual con ProcDump de Mr.Orange)

3.-¿Seguimos? Recopilemos informacion ...
 Ya tenemos la mitad.
 Nos falta reconstruir la seccion rdata la cual es modificada en tiempo de ejecucion por
 SafeDisc.
 En .rdata se guardan la llamada a las API de windows y estan todas bien meno Kernel32 y User32
 Veamos como funciona

 Nos situamos otra vez en el punto de entrada al programa
 :u
 006854E3  55                            PUSH    EBP  <-- Punto de entrada
 006854E4  8BEC                       MOV     EBP,ESP
 006854E6  6AFF                       PUSH    FF
 006854E8  68D87D6A00          PUSH    006A7DD8
 006854ED  68084F6800            PUSH    00684F08
 006854F2  64A100000000        MOV     EAX,FS:[00000000]
 006854F8  50                             PUSH    EAX
 006854F9  64892500000000     MOV     FS:[00000000],ESP
 00685500  83EC58                    SUB     ESP,58
 00685503  53                             PUSH    EBX
 00685504  56                             PUSH    ESI
 00685505  57                             PUSH    EDI
 00685506  8965E8                     MOV     [EBP-18],ESP
 00685509  FF1554826900         CALL    [00698254] <-- Primera llamada a la api,Traceala F8
 0068550F  33D2                        XOR     EDX,EDX
 00685511  8AD4                       MOV     DL,AH

 (este fragmento de codigo es del tiberian sun pero casi no varia en otros juegos)

  Pulsa F8 o t para trazar paso a paso y entra en la llamada veras lo siguiente

 00AD4143  60                          PUSHAD
 00AD4144  6867000000          PUSH    00000067     <-- api buscada
 00AD4149  6800000000          PUSH    00000000 
 00AD414E  FF156441AD00    ALL    [00AD4164]   <--llamada a la rutina [c-dilla]
 00AD4154  83C408                 ADD     ESP,08
 00AD4157  61                          POPAD
 00AD4158  FF255E41AD00    JMP     [00AD415E]   <--despues de hacer la llamada este jmp
 00AD415E  0000                     ADD     [EAX],AL        cambiara a jmp [KERNEL32!GetVersion]
 00AD4160  0000                     ADD     [EAX],AL

 si ejecutas  CALL [00AD4164] con F10, veras como cambia el jmp de abajo,
 a jmp [KERNEL32!GetVersion].

 Todo lo explicado arriba se puede aplicar a las ultimas versiones de safedisc asta el momento(la fecha de este tutorial 
   es de octubre del 99 seguramente no tardaran en sacar una version actualizada).

 En versiones muy antiguas como por ejemplo en worms armagedon esto es distinto y este turorial no seria efectivo :-(
 (pero trankilos siempre se puede usar el nuebo programa de Fuerza Bruta ke ha creado BlackCheck lo encontraras en 
   su pagina www.blackcheck.cjb.net)

 Ya sabemos como funciona muy por encima sigamos

4.-Fijando La Seccion .Rdata
 La nueva version de safedisc  viene con las cadenas sciiz de la importaciones
 kernel32 y user32 encryptadas por lo ke el viejo fijador de la seccion .rdata
 ya no nos sirve..

 Para comenzar habra ke copiar la seccion .rdata a una zona de memoria limpia
 usaremos la zona de la seccion .data

        Direc       |  Longitud
 -------------------------
  .text   401000  | 1F5000
  .rdata 5F6000  | 7C00
  .data  5FE000  | 22C00
  .rsrc  no importa esta sin encryptar

 -m 5F6000 L 7C00 5FE000

 Ahora necesitamos saber un par de direcciones mas:

 Esta direcciones son donde se llama a la primera api de windows(kernel32) y la segunda(user32)
 para encontrarlas deberemos examinar la seccion .rdata desencryptada y mirar desde el principio
. Para ilustrarte mejor hecha un ojo a la seccion .rdata desencryptada mira en la posicion 40 y en la
 posicion 188 estas son las respectivas entradas.
 (recuerda ke estos valores son para GTA en otro juego pueden variar) 

 fijate ke gracias a las word(0000)  podras encontrarlas y diferenciarlas.
  (para sacar la seccion .rdata usa el comando pagein 5F6000 7C00 c:\rdatasinfix.bin )

 Sabiendo los desplazamientos anteriores solo nos keda sumar .rdata+des

   .rdata=5F6000            .rdata=5F6000
 +                                 +
   des   =        40            des   =       188
   ------------------     -- -------------------
 rva1    =5F6040           va2    =5F6188

 rva1 es la direccion a kernel32
 rva2 es la direccion a user32

 y recordando ke la seccion .rdata fue copiada a la seccion .data adaptamos los valores
 (acemos la suma anterior pero con .data=5FE000)
 con lo ke tenemos

 rva1=5FE040
 rva2=5FE188

 Bueno pos aki tenesi la rutina ke hara el trabajo sucio por nosotros debemos agradecerselo a R!sc ke como ya
 dije ha creado el Cudilla con el cual esta proteccion es eliminada con un slolo click www.csir.cjb.net   jeje ;-) 
 

 start:
 400300 mov edi, 5fe040     ; es la direccion de rva1(kernel32)
 400305 xor ecx,ecx            ; se pone a 0 ya ke nos indicara cuando terminamos con un 2
 perpare:
 400307 mov eax, [edi]
 fixit:
 400309 mov byte ptr [eax],90h               ; se pone un nop donde habia un pushad en el codigo de c-dilla
 40030c mov byte ptr [eax+14h],0c3h     ; se pone un ret donde habia un popad en el codigo de c-dilla
 400310 pushad
 400311 call eax                                       ; se ejecuta la llamada a c-dilla parcheado en la linea de arriba
 400313 popad
 400414 mov ebx, dword ptr [eax+1bh]    ; se coge la direccion real de la api ke nos da c-dilla
 400317 mov [edi], ebx                            ; y se pone en nuestra seccion .rdata
 400319 add edi,4
 40031c mov eax, [edi]                             ; se coge el siguiente rva
 40031e test eax,eax                                 ; se comprueba ke no sea nulo(0000)
 400320 jne fixit
 400322 mov edi, 5fe188                          ; es la direccion de rva2(user32)
 400327 inc ecx
 400328 cmp ecx, 2                                  ; aki se comprueba si se ha terminado de fijar y sigue(0,1) o sale(2)
 40032b jne prepare
 40032c int 03
 ; fin del codigo

 eta rutina tendremos ke ensamblarla en el soft ice (a 400300) luego cambiamos EIP a esa direccion (r eip 400300),
 ponemos in bpint 3 y ejecutamos si todo va bien pararemos 40032c y solo nos keda copiarla a un fichero 
 (pagein 5fe000 7c00 c:\rdata.fix)
 y juntarlo con las otras secciones. (este procedimiento a sido probado con el juego GTA2 y
 ha funcionado perfectamente)

 Esto se puede realizar tambien con el Adump reservando una zona de memoria y ensamblandolo en ella.
 (en los tutoriales de la pagina de blackcheck tienes ejemplos de este metodo)

5.-Reconstruyendo El Fichero .ICD
Bueno para reconstruir el fichero lo puedes hacer de estas maneras dependiendo del tipo de volcado ke hiciste:

 Opcion 1:(si usaste el comando Pagein modificado)

 Ahora crearemos la cabecera del fichero para eso edita el gta2.icd con un edeitor hexadecimal y copia los
 primeros 400h bytes a un  fichero ej:header.bin .
  -Abre una ventana MS-Dos
  -Entra en el directorio de trabajo
  y escribe esto:
   c:\>copy /b header.bin + text.bin + rdata.fix + data.bin + rsrc.bin CRACK.exe
   y alehop ya esta el fichero CRACK.exe es completamente funcional...

 Opcion 2:(si usaste el ProcDump)
 Si lo hiciste con procdump solo queda ke elimines la seccion rdata e introduzcas la seccion fijada.

 Y bueno problema resuelto.

6.-Recomendaciones
Para tener un final feliz te recomiendo ke leeas los tutoriales ke te he mencionado:

  BlackChek  - www.blackcheck.cjb.net
  R!sc            - www.csir.cjb.net
  SkUaTeR    - no tengo pagina pero mis tutos estan en la pagina de KARPOFF 

 Te ruego ke los leas ya ke si no puedes llevarte algunas sorpresitas ;-)

7.-Jodete Safedisk
Jodete SAfedisc C-Dilla.
Jaja jaja jajaj   Y Mocosoft la ha comprado por millones de dolares jajajajajajajjajaj¡
(ni decir tiene ke esta proteccion esta cambiando constantemente ya ke dice ser una de las mas fiables y este Jodete estara jodido en poco tiempo pero bueno ai estaremos nosotros para volver a joderlo juasjuasjuasjuas)

skuater@hotmail.com
Punk
Not
DeaD

[ 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