Bienvenidos a lo que pretende ser una guía general de cracking bajo Windows, esta guía trata de introducir a aquellas personas sin conocimientos sobre el tema en el apasionante mundo del hacking/cracking. Si usted ya es un experto, felicidades, no le hace falta leer esto, aunque siempre podrá aprender algo nuego. Un consejo para todos los interesados en este mundillo y en general el mundillo de la informática: aprende inglés, sabiendo inglés podras acceder a las fuentes de información más actuales, obteniendo así el mejor nivel sobre el tema.

Para poder entender lo aquí explicado es necesario un minimo conocimiento del lenguaje ensamblador y de Windows, si no se conoce el lenguaje ensamblador, mejor que busques algún tutorial en la web. En cuanto a Windows, no es necesario ser un experto programador de este sistema (sin operativo porque no lo és ).

Nota:La página a sido diseñada para ser vista a una de las siguientes resoluciones 800x600 o 1024x768, con una profundidad de color de 16bpp o más.

Se podría definir como un proceso manual o automático en el cual un sistema de seguridad que protege un software/hardware es  "burlado". El termino hacking se aplica cuando este proceso tiene lugar en un sistema remoto, es decir se asalta el sistema de un ordenador ajeno, pudiendo así acceder a información confidencial pudiendo llegar a destruirla, alterarla o copiarla. Existen los Hackers blancos, que en principio sus intenciones no son maleficas y tan sólo buscan fallos de seguridad en el sistema y los Hackers negros o crackers de redes, los cuales puden destruir los datos, copiarlos, alterarlos o hacen lo que les plazca cuando llegan a obtener todos los privilegios de acceso.

Alguín definió un escala bastante absurda en la que digamos se muestra la evolución de un hacker, muchos quedan estancados en alguna fase de la escala, y otros ni tan siquiera lográn pasar de la primera etapa.

Lamer -> Wannabe -> Newbie -> Hacker -> Gurú o Elite -> Wizard

Por supuesto llegar a hacker no es cuestión de dos días y llegar a Wizard es algo que casi nadie logra, entre la élite podemos encontrar a gente bastante joven, pero los Wizards suelen ser ya mayores y debido a su inmensa experiencia tanto en la vida misma como en la informática poseen un nivel que ni ellos mismos podrián concretar donde acaba. En mi opinión es difícil destinguir a la élite de los wizards, y creo que los Wizards necesitan tener un carácter especial como persona, por lo que no todo el mundo puede llegar aquí, alguien se se jacte de ser élite y bacile con ello, nunca llegará a Wizard, al contrario, descenderá rapidamente a niveles inferiores.

El termino cracking es aplicable cuando se burla el sistema de protección de algun software que normalmente esta protegido contra copia o otro tipo de protección similar (versiones limitadas por tiempo, por un número de série, mochilas, etc) pudiendo así obtener una copia funcional de un software protegido. Cabe diferenciar entre crackers de redes y crackers de sistemas de protección de software. Algunos "gurus" del cracking también lo definen como un estado diferente de la mente, otros como una manera de expresar su arte, incluso algunos la definen como una ciencia (y resulta cierto).

He aquí la pregunta del millón, pues para empezar es necesaria una minima base de ensamblador, por lo que si no tienes ni idea te recomiendo que consultes algún libro o busques algún tutorial en la web. Mira el apartado de links de mi página, allí encontrarás algo que podrá ayudarte. Estar bien equipado es la clave para obtener el éxito en combate, he aquí un listado con las herramientas que necesitaremos, a parte de claro está, paciencia:

SoftIce for Windows 9X/NT: Es un debugger para Windows, el mejor en su clase, esta es la base de nuestro ejercito, sin él no haremos nada ante un enemigo bien preparado. Se recomienda profundidar mucho con él y apredenserselo bien.
W32DAsm: Esta aplicación es un desensamblador/debugger para Windows, con él abriremos al enemigo en canal y examinaremos su estructura y código, es muy sencillo de usar.
IDA Pro:Otro desensamblador, en algunas casos el W32DAsm no funcionará correctamente, por lo que usaremos este otro que funciona mucho mejor aunque es más complicado. Necesario si no se usa W32DAsm.
Ultra-Edit 32: Editor hexadecimal de lujo, con el modificaremos el código del software que así lo precise. Puedes usar otro editor pero te recomiendo este por ser muy versátil.
Filemon: Este programita nos permitira monitorizar que archivos son abiertos por la aplicación/es que le digamos y así saber con que ficheros trabaja el enemigo, este arma sólo será necesaria en algunos casos ;)
Monitor del API de Windows: Programa que nos permitirá monitorizar todas las funciones del API de windows que estan siendo ejecutadas por determinada aplicación, no es imprescindible pero tampoco es inútil  ;)
RegEdit: Este programa nos permitirá monitorizar todos los accesos al registro de Windows, así sabremos donde guarda la información el enemigo ;). Opcional.
Win32 Programmer's Reference: Una guía que describe todas las funciones del API de Windows. Imprescindible si no se domina bien el API, cosa más que probable (por lo menos en mi caso).

Los que estan marcados en rojo, son casi imprescindibles, los verdes son muy utiles en determinadas ocasiones pero no son necesarios.Te recomiendo que te familiarizes con estas tools puesto que si no tiene un mínimo conocimiento del arma te puede salir el tiro por la culata ( pérdidas de datos etc. ;) ). Puedes buscar estas herramientas en www.astalavista.box.sko en mis links.

Obviamente no he listado todas las herramientas de las cuales podemos sacar partido, ya que sería una lista interminable, por eso, siempre deberemos visitar algunas de las siguientes páginas para obtener más "armamento", todo armamento que podamos conseguir nos puede ahorrar horas de trabajo, aunque no es bueno abusar de las armas, ya que hay veces que hay que luchar sin ellas y si no estamos acostumbrados, podremos fracasar.

http://www.suddendischarge.com
http://www.hackersclub.com
http://crknotez.cjb.net
http://fravia.org
http://protools.cjb.net

A continuación enumero los principales sistemas de protección que podremos encontrar bajo cualquier sistema operativo, no sólo Windows.

Sistemas de protección por tiempo.
Sistemas de protección, CD Checks (comprobación del CD original).
Sistemas de protección anti-copia (usado en discos y CD's).
Sistemas de protección por número de série/registro.
Sistemas de protección mediante hardware externo (mochilas).
Sistemas de protección/defensa mediante encriptación y/o compresión de los datos y/o modificación interna del código.
Sistemas de protección/defensa anti-debugging, consulta mis tutoriales específicos
Lección 0 y Lección 1.
Sistemas de protección/defensa mediante comprobación de la integridad de los datos (CRC).
Sistemas de protección mediante banners/nags.
Sistemas de protección mediante desactivación de funciones.

Es crucial que antes de comenzar el combate, conozcamos a qué nos enfrentamos, por ello antes de empezar una sesión de cracking, deberemos realizar una exploración preliminar del enemigo (utilizar nuestros satélites espia ;) ). Las principales caracteristicas que deberemos conocer dependeran del tipo de protección que este siendo usado, pudiendo ser un sistema de protección combinado (+ de un tipo de protección) lo cual puede llegar a complicar el asunto. Una vez detectado el sistema de protección comprobaremos las posibles defensas del enemigo, he aquí las defensas que deberemos tener más en cuenta:

Anti-Debugging: El software usa técnicas para detectar nuestra presencia y evitar así poder ser trazado. Normalmente intentará detectar la presencia de un debugger y si es así parar la ejecución del software mientras este este presente.
Encriptación/Compresion de datos: El software usa técnicas que "ocultan" el verdadero código del programa de nuestra vista, hasta que este esté en ejecución, inutilizando así cualquier intento de desensamblado del código.

Antes de entrar en combate deberemos conocer al enemigo, una vez conocido, deberemos seleccionar el armanento adecuado y estaremos listos. Este paso es importante, ya que nos evitará muchos quebraderos de cabeza si lo realizamos.

 

Cuando estamos trazando un determinado software, podemos utilizar varias técnicas para llegar antes a la parte de código en la cual sospechamos que puede haber parte del sistema de protección. Aquí describiré algunos de los metodos más usado.

A lo retro: Este método se basa en trazar el programa hacia atras, es decir, dejar que el sistema de protección se active y parar la ejecución justo después, (cuando el software nos avise con un mensaje de error)  apartir de ese instante trazaremos hacia atras  (esto lo haremos examinando el código) , buscando un salto que nos aleje o nos aproxime de la función que muestra el mensaje: tipicamente esta función suele ser una de las siguientes :

MessageBoxA, MessageBox, DialogBoxParam,DialogBoxParamA

Por Predicción: Este metodo se utiliza cuando se sospecha que una determinada función del API de Windows esta siendo usada para el funcionamiento del sistema de protección.

Implementación: Se pone un breakpoint (BPX) en el SoftIce a la función que se sospecha esta siendo usada y se carga/continua con la ejecución del software. A partir de ahí se continua trazando normalmente hasta llegar al punto clave. Muy usada cuando se quiere buscar la función que pinta un banner molesto o una pantalla nag de inicio, o cuando se conoce el sistema de protección que esta usando el enemigo ;).

Por referencia a una cadena conocida: Este método se usa cuando el sistema de protección muestra un mensaje de error, o un mensaje dentro de un cuadro de diálogo.

Implementación: Se copia el mensaje de error, se desensambla el archivo con el W32DAsm, se busca dicha cadena en la lista de referencias a cadenas  y se hace doble click en esta, se apuntan las direcciones donde hay una posible referencia y se examina el código que hay alrededor buscando un salto que nos aleje de la referencia a dicha cadena. (similar al trazado a lo retro). Se comprueba que sucede si se invierte el salto o preferiblemente se examinan las llamadas previas al salto si las hay, ya que estas pueden ser las llamadas que comprueban si todo está en orden (fecha/mochila/numero de série etc.).

Por busqueda de cadenas: Se utiliza cuando se sospecha que una determinada cadena de caracteres está siendo utilizada/o y no se encuentra donde debería estar por el método de referencias. Esto es debido a que el software puede almacenar ciertas cadenas en partes reservadas al código del programa, para evitar que estas sean directamente visibles en el desensamblador.

Implementación: Se busca con un editor hexadecimal en el archivo que se sospecha contiene la cadena, o se busca la cadena en memoria con el SoftIce una vez ejecutado el programa y antes de que se ejecute el sistema de protección.Si se encuentra en memoria se pone un BPM sobre esta para interrunpir al programa antes de realizar cualquier cálculo con ella ;).

Por busqueba de una secuencia de codigos de operación: Se utiliza cuando se sospecha que una determinada secuencia de ordenes en assembler está siendo usada por el sistema de protección/defensa.

Implementación: Conocida la cadena secuencia de códigos/bytes a buscar se realiza su busqueda con editor hexadecimal y se opera según sea el caso. Muy usada para la detección de trucos anti-debugging.


Los sistemas de protección por tiempo puden operar de distintas formas:

El software comprueba si han transcurrido X días desde la instalación de si mismo, y si es así el software procede a su salida inmediata o en el peor de los casos a su desinstalación automática. Durante la salida/desinstalación del software este puede mostrar algun mensaje informando al usuario del hecho en cuestión. Puede que el software vuelva a funcionar durante X días si se vuelve a instalar. Ej: The evaluation period has expired...bla bla. Trans:Periodo de evaluación a terminado....bla bla.

El software comprueba si ha llegado a una fecha limite, si es así procede de la misma manera que en el caso anterior. La diferencia está en que el software dejará de funcionar a partir de una fecha determinada y no funcionará si se vuelve a instalar.

Para burlar estos sistemas de protección deberemos tener en cuenta los siguientes datos:

El software sabe cuando se instaló por primera vez, por lo que deberá guardar esta información en algún lugar, probablemente en algun archivo propio (usaremos Filemon)  o en el registro de Windows  (usaremos RegMon).

El software debe comprobar la fecha actual, es decir la fecha en el momento en el que el programa está siendo ejecutado, y hacer los correpondientes cálculos para comprobar los días que han pasado o si es la fecha límite. Para esto dispone de las funciones de fecha/tiempo del API de Windows siguientes:

VOID GetSystemTime(LPSYSTEMTIME lpSystemTime );
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime );

Estas dos funciones pasan un puntero a una estructura de tipo SYSTEMTIME con la siguiente definición:

typedef struct SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME;

La función GetTickCount retorna el número de ticks transcurridos desde el arranque del ordenador, puede ser usada para controlar el tiempo de ejecución de una rutina, con esto podrian saber si hay alguien trazando el código :)

DWORD GetTickCount(VOID)

Algunos programas que usan las MFC (Microsoft Foundation Classes) utilizan la siguiente función para calcular fechas:

double difftime( time_t timer1, time_t timer0 );    // Devuelve la diferencia entre dos tiempos en segundos.

El PaintShop Pro 5 por ejemplo usa esta función.Para más información sobre estas funciones ver la guia de referencia del API de Windows.

Con esto en mente ya podemos deducir cual será el metodo a seguir para burlar el sistema: poner breakpoints (BPX) en cada una de estas funciones y trazar paso a paso a partir de donde se ejecutó la función que provocó el BPX. También podemos usar el metodo de las referencias a cadenas. Existen casos en los que estos metodos no nos serviran de mucho ayuda o simplemente no nos facilitarán la tarea, estos casos se dan cuando el software está protegido con algún sistema de protección comercial por tiempo como el TimeLock o VBox. Este tipos de sistemas se basan en DLL's externas, por lo que será más práctico el desensamblado y trazado de estas.En algunos casos simplemente bastará parchear alguna función de la DLL para haber terminado con el sistema de protección, con la ventaja de que todos los programas basados en esa protección estarán automáticamente desprotegidos (habremos crackeado cientos de aplicaciones que ni siquiera conocemos :-) ).

Para más detalles puedes leer mis tuoriales sobre cracking números 1,5 y 6.

Estos sistemas no son propiamente un sistema de protección, más bien son sistemas para molestar al usuario del software y recordarle que adquiera el programa original, los "banners" se utilizan mucho en programas de visualización o de retoque de fotografias, se trata de textos o imagenes que tapan parcialmente el trabajo que estamos viendo/haciendo, impidiendonos su "correcta" visualización. Los "nags" son pantallas/cuadros de diálogo que aparecen al inicio o al final de la aplicación y están activos hasta que el usuario pulsa un determinado botón o hasta que se completa una cuenta atrás. Por lo tanto para que exista un banner o un nag, este debe ser mostrado de alguna manera, ahora sólo nos queda saber como se muestran los nags, y como lo hacen los banners.

Técnicas para hacer frente a los nags:

Lo primero sería identificar el tipo de "nag", es un cuadro de dialogo ? es un cuadro de mensaje ? O es otro tipo?. Esto lo podremos averiguar con facilidad si hechamos una mirada al estilo del "nag". Si hay 2 o menos botones, es probable que sea un cuadro de mensaje, si no hay botones o hay más de dos, probablemente será un cuadro de diálogo. Otra pista es mirar las opciones que hay escritas en los botones, si dicen "Continuar", "Aceptar", "Cancelar", "OK", es probable que sea un cuadro de mensaje, Otra posibilidad es fijarnos en los iconos del cuadro, si vemos un signo de admiración, de información o una cruz en un circulo rojo, seguramente se trate de un cuadro de mensaje.

Anticipandonos a la creación del cuadro de diálogo/mensaje:

Implementación: Poniendo BPX en las siguientes funciones

CreateDialogIndirectParamA / CreateDialogIndirectParam
CreateDialogParamA / CreateDialogParamW
DialogBox
DialogBoxIndirect
DialogBoxParam / DialogBoxParamA / DialogBoxParamW
EndDialog
MessageBeep
MessageBoxA / MessageBoxW
MessageBoxExA / MessageBoxExW
MessageBoxIndirect / MessageBoxIndirectA / MessageBoxIndirectW

Estas funciones son las que Windows puede utilizar para crear un cuadro de diálogo/mensaje, las cinco primeras son las más utilizadas, las cuatro últimas son sólo para cuadros de mensaje.Para más información sobre estas funciones ver la guia de referencia del API de Windows.
 

Por referencia a una cadena conocida.

Una vez localizada la llamada al cuadro de diálogo/mensaje, procederemos a su eliminación, para ello lo más habitual será eliminar la llamada al cuadro de diálogo/mensaje mediante NOP o instrucciones similares (INC EAX, DEC EAX etc.). Es posible que después de la llamada al cuadro de diálogo, este retorne un valor el cual la aplicación deberá procesar para así continuar su ejecución, por eso deberemos tener en cuenta este valor (el valor correcto para que la aplicación continue) y hacer que el registro/memória que contenia dicho valor, siga valiendo igual al eliminar la llamada al cuadro de diálogo. Esto lo podremos lograr aprovechando el espacio que nos quede al eliminar la llamada, o simplemente cambiando el salto que compruebe este valor.

Técnicas avanzadas de eliminación de nags: En ciertas ocasiones, no podremos eliminar la llamada al cuadro de diálogo/mensaje debido a que esta llamada está codificada como un llamada indirecta (pej: call [ESI+EBX]) o cuando la aplicación usa la misma llamada para que se procese más de un cuadro de diálogo. Es de imaginar que si eliminamos esta llamada, también estaremos eliminando otras posibles llamadas a otros cuadros de diálogo que no sean el molesto "nag", como un cuadro de dialogo de configuración etc. La solución no es muy compleja: todos los cuadros de diálogo que la aplicación pueda generar deben estar identificados por un número ID, o cadena que los identifica inequivocamente, sabemos que todas las funciones de generación de cuadros de diálogos necesitan que este ID o cadena sea pasado/a como un argumento a la función que no podemos eliminar, por lo que podremos averiguar el ID del cuadro de diálogo que nos molesta mirando los push previos a la llamada. Una vez tengamos dicho ID podremos desensamblar la aplicación con el W32DAsm y hacer click en el botón , buscaremos el ID en la lista y haremos doble click sobre este para el W32DAsm nos lleve a las posibles referencias a este ID, con esto podremos intentar eliminar/sustituir el cuadro de diálogo. Para más información puedes ver mi tutorial número 8 en el se trata un caso práctico.

Técnicas para hacer frente a los banners:

Por el tipo de banner: Si es un simple banner de texto podremos poner un BPX en las siguientes funciones.Tenemos que ir con mucho cuidado con estas funciones ya que son usadas por el GDI de windows para pintar los textos de los controles (botones, listas, etc)

DrawText
DrawTextEx
ExtTextOut
TextOut

Si el banner es una imagen:

BitBlt
MaskBlt
PatBlt

Para más información sobre estas funciones ver la guia de referencia del API de Windows.

Para más información puedes ver mis tutoriales número 8 y 5 en ellos se tratan dos casos prácticos.

Estos sistemas de protección comprueban que el CD del software se encuentra en la unidad de CD-ROM cada vez que el software se ejecuta. Se utilizan para evitar lo que se llaman CD-Rips (versiones recortadas de la versión original del CD, sin intros, sin audio etc) usados por los piratas para introducir más de un juego en un sólo CD. Estos sistemas no evitan que el CD-ROM pueda ser duplicado, lo que significa que si introducimos una copia, el software funcionará correctamente.Yo casi ni los considero un sistema de protección, más bien son un sistema de fastidiar al usuario obligandole a introducir el CD, aunque el software no necesite ningún dato del CD para funcionar.

Personalmente me he encontrado con con dos sistemas de este tipo, en el primer sistema, el software identifica el CD-ROM mediante la etiqueta que este posee, si el CD tiene la etiqueta esperada, el software continua su ejecución. El segundo metodo, se basa en comprobar si existe un determinado archivo dentro del CD-ROM, si el archivo existe, se continua con la ejecución. La dificultad de estos sistemas de protección se ve aumentada cuando el software si que verdaderamente necesita los datos que hay en el CD para poder continuar (intros, pistas de audio etc.). Para llegar al núcleo de la protección podemos utilizar los sistemas que describo en ese apartado ( Cómo llegar al núcleo de la protección ), el más útil es el método de predicción.

Técnicas utilizadas para hacer frente a los CD checks:

Anticipandonos a la detección de la unidad de CD

Implementación: Poniendo BPX en las siguientes funciones

AUINT GetDriveType(
    LPCTSTR lpRootPathName
// dirección del cámino raíz
);

Esta función es usada por windows para detectar el tipo de unidad pasada como cadena en lpRootPathName, si retorna 5, la unidad es un CD-ROM, apartir de aquí iremos trazando poco a poco hasta llegar a la comprobación del CD Recuerda que el BPX será BPX GetDriveTypeA, ya que es una función de 32 bits.

Anticipandonos a la detección de la etiqueta de la unidad de CD

Implementación: Poniendo un BPX en las siguientes funciones

BOOL GetVolumeInformationA(

    LPCTSTR lpRootPathName,  
// dirección del directorio raíz del sistema de archivos system
    LPTSTR lpVolumeNameBuffer,  
// dirección del nombre del volumen
    DWORD nVolumeNameSize,   
// longitud del buffer lpVolumeNameBuffer
    LPDWORD lpVolumeSerialNumber,   
// dirección del numero de serie del volumen
    LPDWORD lpMaximumComponentLength,   
// dirección de la máxima longitud del nombre del archivo del sistema
    LPDWORD lpFileSystemFlags,   
// dirección de los flags del sistema de archivos
    LPTSTR lpFileSystemNameBuffer,   
// dirección del nombre del archivo del sistema
    DWORD nFileSystemNameSize    
// longitud del buffer
);   

GetVolumeInformationW

Estas funciones obtiene un puntero a una cadena conteniendo la etiqueta del volumen de la unidad especificada, a partir de aquí es fácil buscar donde se compara con la etiqueta válida. La función GetVolumeInformationW obtiene la cadena en formato wide-char (o eso creo).

Para más detalle sobre este tipo de protecciones puedes hechar un vistazo a mi tutorial número 6 te aconsejo que te mires tambien la guía de referencia del API de Windows.

Sistemas de protección anti-copia para discos magnéticos.
Sistemas de proteccíon para CD-ROMs.

Los sistemas de protección anti-copia para discos son bastante antiguos, utilizados desde comienzos de la decada de los 80 hasta hoy en día. Aunque ya casi no se utilizan siempre es útil conocerlos, ya que algunas compañias de software siguen utilizando el sistema del disco llave sin el cual la aplicación no puede ejecutarse. Esto resulta peligroso ya que los discos suelen estropearse físicamente o infectarse por algún virus con lo que el usuario debe solicitar otra copia a la compañia, y mientras esta le llega, no podrá trabajar, este es uno de los motivos por los que este sistema está en desuso.

Los sistemas más antiguos protegian los discos de 5 1/4 y 3 1/2 mediante un formateo anómalo de los sectores (sectores formateados a un tamaño diferente de los que debería tener el disco ), asignando un número de sector no válido a determinados sectores o incluso no formateando determinadas pistas. Para poder determinar alguna de estas situaciones, deberemos conocer la tabla de parámetros de la unidad FDPB (Floppy Drive Parameter Block), esta tabla tiene la siguiente estructura:

OFFSET FUNCIÓN EJEMPLO
0 frequencia de paso y descarga del cabezal:
los cuatro bytes de la izquierda (left nibble) de este valor es la frequencia de paso del cabezal de la unidad de disco. Los 4 bytes derechos es el tiempo de descarga del cabezal de la unidad
.
DF
1 tiempo de carga del cabezal:
el nibble izquierdo es el tiempo de carga del cabezal y el derecho es el modo dma seleccionado.
02
2 retardo de puesta en marcha del motor:
tiempo de espera hasta que el motor se apaga.
25
3 número de bytes x sector
0 = 128 bytes
1 = 256 bytes
2 = 512 bytes
3 = 1024 bytes
Modificando este valor podemos cambiar el tamaño del sector.
02
4 último número de sector
se usa para formatear e indica el número de sectores que hay en una pista.
12
5 longitud de gap:
este valor es el que debemos modificar si obtenemos errores de CRC al intentar leer un sector con tamaño no estandar
1B
6 longitud de datos de pista:
contiene el número de bytes en un sector cuando el valor del byte 4 no contiene 0, 1, 2, o 3.
FF
7 longitud del formato del gap:
número de bytes en el gap entre sectores: sólo se usa cuando se formatean pistas especiales.
54
8 Byte de relleno de formato:
cuando se formatee una pista este será el valor de inicialización de los sectores
F6
9 tiempo de parada del cabezal 0F
A tiempo de inicio del motor 02

Las líneas marcadas en rojo son la que nos serán útiles para detectar si el disco está protegido de alguna de las maneras anteriores. Para ver los parámetros actuales ejecutaremos el debug y teclearemos:

-d 0:78 l 4

Obtendremos como respuesta: 0000:0070 22 05 00 00, que es la dirección de la FDPB en ordenamiento Intel, para ver los valores teclearemos

-d 0:522 l a

Obtendremos los siguiente 10 valores :

0000:0520 DF 02 25 02 3F 1B-FF 54 F6 0F

Para comprobar los sectores del disco, la protección puede utilizar los siguientes métodos:

Usar la interrupción de BIOS número 13 para el manejo de discos, pudiendo utilizar las siguientes subfunciones de esta:

INT 13,18 - Set Media Type for Format (Establecer tipo de medio para formatear)

AH = 18h
CH = 8 bits bajos del número de pistas (0-1023 dec., ver más abajo)
CL = sectores por pista (1-17 dec., ver más abajo)
DL = númeri de unidad (0=A:, 1=2nd floppy, 80h=unidad 0, 81h=unidad 1)

Retorna:

ES:DI = puntero a una tabla de 11 bytes Disk Base Table (DBT)
AH = 00h si la combinación solicitada es soportada
= 01h si la función no está disponible
= 0Ch si no está soportada o la unidad es desconocida
= 80h si no hay un disco en la unidad
CF = 0 si hay exito 1 si hubo algún error

- válida sólo para BIOS XT/AT fechadas despues del 11/15/1986, XT 286 y toda la línea PS/2.
- solo se comprueba la validez del número de disco.
- el número de pista es un valor de 10 bits cogido de los 2 bits superiores de CL y los 8 bits de CH (bits bajos de la pista) (ver figura).

 

 

INT 13,2 - Read Disk Sectors (Leer sectores del disco)

AH = 02
AL = número de sectores a leer (1-128 dec.)
CH = número de pista/cilindro (0-1023 dec., ver más abajo)
CL = número de sector (1-17 dec.)
DH = número de cabeza (0-15 dec.)
DL = número de unidad (0=A:, 1=2nd floppy, 80h=unidad 0, 81h=unidad 1)
ES:BX = puntero a un buffer donde copiar los datos leidos

Retorna:

AH = código de error

Uno de los posibles errores que podemos obtener es el error 9 (DMA Boundary error) indica que una rango ilegal fue cruzado cuando la información se escribió en la memoria. Si un offset de memoria acabado en tres ceros (ES:1000,ES:2000) cae en el medio de un area cubierta por un sector , este error ocurrirá. Esto puede indicar algún tipo de protección anti-copia.

AL = número de sectores a leidos
CF = 0 si hubo éxito = 1 si hubo algún error

- las lecturas de disco por BIOS deben ser ejecutadas por lo menos tres veces y la controladora debe ser reseteada si hubo algún error.
- asegurarse que ES:BX no cruza el límite de un segmento de 64K o ocurrirá un error de DMA.
- solo se comprueba la validez del número de unidad.
- el número de pista es un valor de 10 bits cogido de los 2 bits superiores de CL y los 8 bits de CH (bits bajos de la pista) (ver figura).

 

 

Int 13,4 - Verify Disk Sectors (Verificar sectores del disco)

AH = 04
AL = número de sectores a verificar (1-128 dec.)
CH = número de pista/cilindro (0-1023 dec., see below)
CL = número de sector (1-17 dec.)
DH = número de cabeza (0-15 dec.)
DL = número de unidad (0=A:, 1=2nd floppy, 80h=unidad 0, 81h=unidad 1)
ES:BX = puntero a un buffer (si la BIOS es inferior al 11/15/1985)

Retorna:

AH = código de error
AL = número de sectores verificados
CF = 0 si hubo exito = 1 si hubo error

- las verificaciones de disco por BIOS disk deben ser ejecutadas por lo menos tres veces y la controladora debe ser reseteada si hubo algún error
- Esta función hace que la controladora calcule el CRC de los datos del disco y los compare con los que hay almacenados en la cabezera del sector, retornando un error si estos valores no coinciden, esto es usado tambien por algunos sistemas de protección que alteran el CRC original.
- BIOS anteriores al 11/15/1985 requieren que ES:BX apunte a un buffer válido
- solo se comprueba la validez del número de unidad.
- el número de pista es un valor de 10 bits cogido de los 2 bits superiores de CL y los 8 bits de CH (bits bajos de la pista) (ver figura).

 

 

Ya sabemos que se usa la interrupción 13 para el sistema de protección, pero ¿ Cómo procederemos para burlar el sistema ?, lo normal será buscar todas las ocurrencias de la cadena CD13 (código de operación de esta instrucción) en el ejecutable y ver que tipo de acción realizan para así modificar lo que haga falta.Pero hay casos en los que se llama a la interrupción sin usar la instrucción INT 13, esto se hace obteniendo un puntero a la INT 13 y luego saltando a esta dirección.

El siguiente código es equivalente a realizar una INT 13 para leer un sector de la unidad A, cara 0, pista 29h, sector FFh, y luego comprobar si el código de error es 10H, pertenece a uno de los magnificos tutoriales de +ORC:

cs:1000 mov ah,2 // operación de lectura
cs:1002 mov al,1 // sector a leer
cs:1004 mov ch,29 // pista 29h
cs:1006 mov cl,ff // sector ffh
cs:1008 xor dx,dx // cara 0
cs:100B xor bx,bx // unidad A
cs:100D mov ds,bx // copia a DS
cs:100F pushf   // empuja flags a la pila
cs:1010 push cs // y CS
cs:1011 call 1100 // empuja la dirección de la siguiente instrucción y salta a cs:1100
cs:1014 cmp ah,10 // mira si hubo algún error de CRC
cs:1017 ........... .......... // resto del código de verificación
cs:1100 pushf   // empuja flags
cs:1101 mov bx,004c // puntero al vector de la INT 13 en la BIOS
cs:1104 push [bx+2] // empuja el punto de entrada de la INT 13 a la pila
cs:1107 push [bx] //
cs:1109 iret   // saca cs,ip y flags, provocando un salto a la INT 13 y el posterior retorno a cs:1014

Este método se basa en leer el vector de la int 13 desde la tabla que tiene almacenada la BIOS en la dirección 0000:0000 ( 4 bytes * 13h = 4Ch) , esta tabla es un array de 256 entradas que apuntan a cada una de las 256 interrupciones posibles que posee un PC. Una vez obtenido el vector, la rutina lo empuja a la pila y ejecuta una instrucciín IRET que provoca la ejecución de la INT 13, esta al volver retorna a cs:1014 ya que previamente se hizo una llamada desde cs:1011. Si la protección usa este método, no podremos detectarlo de la forma anterior.

Otra técnica se basa en sustituir la INT 13 por otra como la INT 10, y una vez estemos ejecutando el programa, cambiar el código de la operación al vuelo, es decir tendriamos un código automodificable, pero prevendria de que se pudiera encontrar la INT 13 con un simple desensamblado.

También se puede obtener un vector a una interrupción usando un servicio del dos, concretamente la:

INT 21,35 - Get Interrupt Vector

AH = 35h
AL = número de interrupción a obtener

Retorna:

ES:BX = puntero al controlador de la interrupción.

- este es el método estandar para obtener vectores de interrupción.

Pues ya sabes, a buscar las posibles INT 21,35 que aparezcan en el código y mirar que vector piden. Un breakpoint para detectar si se intenta obtener el vector de interrupción 13, sería :

> bpx if (ax==3513)

Por último se podría crear una rutina que fuera una copia del código original de la INT 13 e incluirla en nuestro programa, pero eso ya es más dificil de encontrar en un sistema de protección, aunque este seria el sistema más dificil de "crackear".

Accediendo directamente a la controladora de discos via puertos:

PORT 01F0-01F7 - HDC 1 (1st Fixed Disk Controller) (ISA, EISA)
PORT 0170-0177 - HDC 2 (2nd Fixed Disk Controller) (ISA, EISA)

01F0 RW registro de datos
01F1 R- registro de errores

Descripción de los Bits:

--- errores de diagnostico---
7 unidad que falló (0 = master, 1 = slave)
6-3 reservado
2-0 código de error
001 no hubo errores
010 error formato de dispositivo
011 error del sector del buffer
100 error de la circuiteria ECC
101 error del microprocesor de la controladora

--- errores de operación---
7 bloque erroneo detectado
6 error incorregible de ECC
5 reservado
4 ID encontrado
3 reservado
2 comando abortado prematuramente
1 pista 0 no encontrada
0 DAM no encontrado (siempre 0 para CP-3022)

01F1 -W WPC/4 (Cilindro de precompensación de escritura dividido entre 4)
01F2 RW número de sectores
01F3 RW número de sector (modo CHS mode) dirección del bloque lógico, bits 0-7 (modo LBA)
01F4 RW cilindro bajo (modo CHS) dirección del bloque lógico, bits 15-8 (modo LBA)
01F5 RW cilindro alto (modo CHS) dirección del bloque lógico, bits 23-16 (modo LBA)
01F6 RW unidad/cabeza

Descripción de los Bits:

7 =1
6 modo LBA activado, en vez del modo CHS
5 =1
4 selector de unidad (0 = drive 0, 1 = drive 1)
3-0 bits de selección de la cabeza (modo CHS mode) dirección del bloque lógico, bits 27-24 (modo LBA)

01F7 R- registro de estado

Descripción de los Bits:

7 la controladora esá ejecutando un comando
6 unidad lista
5 fallo de escritura
4 posicionado completo
3 sector buffer requires servicing
2 lectura de datos del disco se corrigio con éxito
1 indice - puesto a 1 cada revolución del disco
0 el comando previo termino en un error

01F7 -W registro de comando

00h opt nondata NOP
1xh opt nondata recalibrate 1
20h req PIOin read sectors with retry 1
21h req PIOin read sectors without retry 1
22h req PIOin read long with retry 1
23h req PIOin read long without retry 1
30h req PIOout write sectors with retry 2
31h req PIOout write sectors without retry 2
32h req PIOout write long with retry 2
33h req PIOout write long without retry 2
3Ch IDE opt PIOout write verify 3
40h req nondata read verify sectors with retry 1
41h req nondata read verify sectors without retry 1
50h req vend format track 2
7xh req nondata seek 1
8xh IDE vendor vend vendor unique 3
90h req nondata execute drive diagnostics 1
91h req nondata initialize drive parameters 1
92h opt PIOout download microcode
94h E0h IDE opt nondata standby immediate 1
95h E1h IDE opt nondata idle immediate 1
96h E2h IDE opt nondata standby 1
97h E3h IDE opt nondata idle 1
98h E5h IDE opt nondata check power mode 1
99h E6h IDE opt nondata set sleep mode 1
9Ah IDE vendor vend vendor unique 1
A1h ATAPI opt PIOin ATAPI Identify (see #P089)
B0h SMART opt Self Mon., Analysis, Rept. Tech. (see #P280)
C0h-C3h IDE vendor vend vendor unique 2
C4h IDE opt PIOin read multiple 1
C5h IDE opt PIOout write multiple 3
C6h IDE opt nondata set multiple mode 1
C8h IDE opt DMA read DMA with retry 1
C9h IDE opt DMA read DMA without retry 1
CAh IDE opt DMA write DMA with retry 3
CBh IDE opt DMA write DMA w/out retry 3
DBh ATA-2 opt vend acknowledge media chng [Removable]
DCh ATA-2 opt vend Boot / Post-Boot [Removable]
DDh ATA-2 opt vend Boot / Pre-Boot (ATA-2) [Removable]
DEh ATA-2 opt vend door lock [Removable]
DFh ATA-2 opt vend door unlock [Removable]
E0h-E3h (second half of commands 94h-96h)
E4h IDE opt PIOin read buffer 1
E5h-E6h (second half of commands 98h-99h)
E8h IDE opt PIOout write buffer 2
E9h IDE opt PIOout write same 3
EAh ATA-3 opt Secure Disable [Security Mode]
EAh ATA-3 opt Secure Lock [Security Mode]
EAh ATA-3 opt Secure State [Security Mode]
EAh ATA-3 opt Secure Enable WriteProt [Security Mode]
EBh ATA-3 opt Secure Enable [Security Mode]
EBh ATA-3 opt Secure Unlock [Security Mode]
ECh IDE req PIOin identify drive 1 (see #P087)
EDh ATA-2 opt nondata media eject [Removable]
EEh ATA-3 opt identify device DMA (see #P087)
EFh IDE opt nondata set features 1 (see #P281)
F0h-F4h IDE vend EATA standard
F1h Security Set Password
F2h Security Unlock
F3h Security Erase Prepare
F4h Security Erase Unit
F5h-FFh IDE vendor vend vendor unique 4
F5h Security Freeze Lock
F6h Security Disable Password

PORT 3510-3513 - ESDI primary harddisk controller

3510w R- status word
3510w -W command word
3512 R- basic status
3512 -W basic control
3513 R- interrupt status
3513 -W attention

PORT 3518-351B - ESDI secondary harddisk controller

3518w R- status word
3518w -W command word
351A R- basis status
351A -W basic control
351B R- interrupt status
351B -W attention

De todo lo que hay aquí, lo más interesante son los posibles accesos a los puertos 01F1 (registro de errores ) y al 01F7 (registro de estado)ambos registros son de sólo lectura, por lo que ya sabemos que las dos únicas maneras de comprobar el disco seran o por la INT 13 o por puertos. Todos estos accesos a los puertos y a la INT 13 podremos controlarlos con breaklpoints en el SoftIce (BPIO para los puertos y BPINT para las interrupciones), te aconsejo que uses breakpoints condicionales ya que si no podrias estar trazando toda la vida hasta llegar a lo que buscas. Aquí tienes unos ejemplos:

> BPINT 13 if (ah==4)
->BPINT 13 if (ah==2)
->BPINT 13 if (ah==18)

Los sistemas de protección anti-copia para CD, son relativamente nuevos. Son posteriores a la puesta en el mercado de las unidades de CD, ya que un un principio estas no provocaron un boom debido a su escasa velocidad de lectura, con la aparición de las unidades de 4x, los freakers (piratas) comenzaron a copiar masivamente el software a este tipo de soporte, sabiendo donde buscar, una persona podía adquirir uno de estos CDs con más de 100 programas por un precio infinitamente inferior al precio de todo el software que contenia. Posteriormente con la aparición de las consolas; PSX y Saturn basicamente, la pirateria se multiplicó. Las grandes casas de software decidieron entrar en combate y como no, una vez más idearon diversos sistemas de protección para su preciado software. Existen varios tipos de protección de CDs:

Protecciones usando huellas digitales o marcas láser:

SecuROM: SecuROM es un sistema patentado por Sony que identifica al verdadero CD-ROM con un sistema de autentificación especial. Durante el proceso de masterización del DADC una huella digital electrónica es aplicada en la capa de plástico que asigna un numero a cada CD-ROM.

Identificación: Uno de estos ficheros debe estar en el directorio de instalación o en el directorio raíz del original.

CMS16.DLL
CMS_95.DLL
CMS_NT.DLL

Nota: En las últimas versiones de esta protección, estos ficheros no estan en ningún directorio, sino que se encuentran almacenados en una de las secciones del ejecutable.

El CD deberá contener este logotipo en el aro interior .

Eliminación: Existen varios parches genéricos creados por Pedro del grupo Laxity, que funcionan con algunas versiones de esta protección. Para la eliminación manual consulta el tutorial sobre la protección SecuROM.

SafeDisc C-Dilla: Es un sistema de protección basado en software que no requiere cambios en los sistemas hardware. Consiste en la combinación de una firma digital incrustada en el disco y una encriptación multicapa del ejecutable que asegura el contenido del CD. La firma digital que no es posible copiar con una CD-R es introducida mediante el láser durante la masterización del CD. Esta protección a sido creada por la compañia C-dilla, propiedad de Macrovision Corporation.

Identificación: Los siguientes ficheros existen el el CD original:

00000001.TMP
CLCD16.DLL
CLCD32.DLL
CLOKSPL.EXE

El icono del archivo clockspl.exe es un CD tachado con dos barras. Actualmente se conocen varias versiones de esta protección y en las últimas los ficheros mencionados anteriormente ya no existen.

Eliminación: Existe tambíen un programa creado por BlackChecks y otro creado por R!sc que usando fuerza bruta, consiguen obtener una copia funcional del ejecutable original, partiendo incluso de la copia. Para la eliminación manual de este protección, consulta los tutoriales sobre la protección C-Dilla.

LaserLock: Protección que usa una combinación de encriptación de software y marca láser en la superficie del CD creada durante un proceso de  masterización especial. Cada aplicación tienen un parámetro de encriptación diferente.

Identificación: El CD original contiene un directorio oculto llamado LASERLOCK. En este directorio hay archivos con errores de lecturas. En las últimas versiones este directorio ya no existe.

Eliminación: Para la eliminación manual de este protección, consulta el tutorial sobre la protección LaserLock.

Protect-CD : Protección creada por VOB, para más info consulta el tutorial sobre la protección Protect-CD.

CD-Cops: Protección creada por Link Data Security y Spinner Software, es una protección añadida al ejecutable principal del CD. Las diferencias de tiempo son medidas para establecer una huella digital y para asegurar que no se pueda copiar.La huella habitualmente es expresada como un código de 8 dígitos o como un número clave.

Eliminación: Para la eliminación manual de este protección, consulta el tutorial sobre la protección CD-Cops.

DiscGuard: Protección creada por TTR Technologies Inc. Este sistema realiza dos cambios básicos en el software:

Los ejecutables principales están encriptados.
Una marca digital especial está inscrita en el disco esta marca contiene una llave de desencriptación de software. La marca digital no es reproducible mediante copia.

Cuando un disco original es utilizado, la firma está presente, la desencriptacion se produce y la aplicacion funciona. Cuando es una copia, la firma no está presente, no existe desencriptación y la aplicación no funciona, en su lugar un mensaje, una pequeña demo, un link a una web comercial o una presentación aparecen, transformando cada copia ilegal en una herramienta de marketing.

Protecciones mediante la alteración de la estructura del CD o de los datos de este:

Oversize: Algunos programas ocupan mas de 660 Mb y estos no pueden ser copiados por la mayoría de CDR's que no están preparadas para copiar mas de 659 Mb en un CD de 74 minutos. Con la aparición de los CD's de 80 minutos esta protección ya no es efectiva.

Illegal TOC: Esta protección se reconoce mirando las pistas del CD. Normalmente aparece una segunda pista de datos (después de algunas de audio). Las normas estándar CD ISO no permiten eso, de ahí el nombre Tabla de contenidos ilegal. Actualmente, todos los programas de duplicación de CD incluyen una opción para ignorar esta alteración, por lo que ya no es efectiva.

Dummy Files: Esta protección crea archivos falsos que señalan aleatoriamente a una parte del CD usada por otros archivos. Cuando se copia el contenido del CD al disco duro la imagen es mucho mas grande que el tamaño de las pistas originales (normalmente las pistas parecen tener 2 Gb). Esta protección suele aparecer en combinación con la de Oversize. Para saltarse esta protección, si el original tiene menos de 659 Mb, hacer una copia directa (DAO/TAO) y recreara los archivos en el CD copiado.Cuando el CD tenga mas de 659 Mb hacer lo mismo mediante overburning o usar un CD de 80 minutos.

Sectores Ilegibles: Este sistema es facilmente reconocible por aparecer un aro en el CD. Este aro es una seccion del CD "estropeada" dentro hay unos ficheros que no se usan en el juego, pero que el programa testea que estén y que no son posibles copiar. Las posibles maneras de saltarse esta protección son dos, usar el LeeTodo/BlindRead o volcar el contenido del CD y crear los ficheros con cualquier editor de texto con la extension del fichero corrupto.

Nota: La información sobre estos sistemas de protección a sido extraida de http://come.to/copiasdeseguridad y Game Copy World y se ha actualizado en los casos necesarios. Los dos sistemas anti-copia más utilizados son el SecuROM de Sony y el SafeDisc de Macrovision.


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 :)