Introducción
===============
En esta segunda parte (primera parte aquí: viewtopic.php?f=59&t=6865), hablaré sobre protecciones anticopia de disquetes. Me centraré sólo en PC-MSDos, por ser la máquina que más me interesa, y porque para otras máquinas (sobre todo Amiga, C64 y Atari ST) hay muchísimo material (y muy organizado) ya escrito.
Tampoco pretendo que sea un guía exhaustiva sobre el tema (que sin duda quiero hacer un día de estos), sino más bien para que la gente interesada sepa de qué va el asunto.
Para comprender las distintas protecciones contra copia que se implementaron en PC es necesario conocer la disquetera, su controlador de hardware y el formato a bajo nivel de los discos.
Este es un esquema base del hardware asociado una disquetera.
(Fuente Wikipedia)
Vemos a la izquierda la CPU, la memoria RAM y la DMA. El chip de DMA (Direct Memory Access) forma parte del chipset de las placas bases, básicamente es un controlador que permite a los dispositivos mover información hacia la memoria sin pasar por la CPU, liberando así la CPU del trabajo de tener que mover esos datos. Un programa puede por ejemplo usar el DMA y decirle “mueve 500KB de datos de este dispositivo a esta posición de RAM”, y seguir ejecutando el programa, cuando finaliza de mover los datos el DMA avisa a la CPU con una interrupción para que sepa que ha terminado el proceso. Esto es importante porque usualmente se usa el DMA siempre para manejar la disquetera.
A la derecha está la disquetera, primero la controladora que es la que “habla” con la CPU y después la disquetera en sí. Todo vemos que está comunicado por el bus de datos del sistema.
La controladora (FDC) inicialmente estaba basada en el chip NEC µPD765 (PC) y posteriormente en los Intel 82072/82072A (AT) o 82077A (PS/2), en la actualidad todos son compatibles con estos, aunque ahora están integrados en los chipsets de las placas base.
Ya vimos anteriormente la función de la controladora: manejo del hardware de la disquetera, lectura de pistas, sectores, formateo, y lo más importante, conversión de la información magnética a MFM y posteriormente a datos binarios (que es lo que recibe la CPU).
Descripción detallada de una pista
=========================
Mucha de la información a continuación procede de la referencia [1], ampliando los datos de [2].
Aunque lo nombré por encima en el hilo anterior (viewtopic.php?f=59&t=6865), explicaré un poco más el formato a bajo nivel de las pistas (cilindros) del disco. He mirado otras guías que explican mejor este formato y he visto que la primera estructura que puse en el hilo anterior no era todo lo extensa que en realidad es.
GAP, es un “hueco”, que no contiene información útil, se usa para sincronizar entre campos y para darle tiempo a la mecánica y la electrónica de la disquetera de procesar la información. Lo siguiente es válido para discos formateados con MFM (los primeros con formato FM tienen un formato parecido pero no igual)
- Physical index mark PIM: el “agujero” de los floppys 5 ¼ , marca el inicio de la pista.
- Preindex gap (GAP 4A): 80 bytes con el valor 4Eh
- SYNC: 12 bytes a 0 (96bits)
- Index address mark (IAM): es una marca especial MFM, 3 bytes con valor C2h + un byte FCh
- Post index gap (GAP 1): 50 bytes con el valor 4Eh
Para cada sector
- SYNC: 12 bytes a 0 (96bits)
- IAM: 3 bytes de valor A1h + 1 byte FEh
- Sector ID: identifica cada sector por separado, 4 bytes, C, H, R, N (cilindro, cabezal, número de sector y tamaño de sector), dónde n=0 si el tamaño es 128bytes, 1 si es 256bytes, 2 si es 512bytes, etc… S CHRN contiene los valores todo a FFh, el sector está dañado o es inválido
- CRC: 2 bytes de CRC, desde el IAM al final del Sector ID, para comprobar que la información del Sector ID es correcta.
- Post ID gap (GAP 2): 22 bytes a 4Eh
- SYNC: 12 bytes a 0 (96bits)
- Data address mark (DAM): 3 bytes A1h + 2 byte FBh -> ver [6]
- Sector data: los datos en sí, 512 bytes por defecto, pero puede ser 128, 256, 512, 1024, 2048 o 4096 bytes
- CRC: 2 bytes de CRC (incluyen desde el DAM al final de los datos)
- Post data gap (GAP 3): bytes con valor 4Eh de tamaño definible, entre 54 y 116
… se repite para todos los sectores y finalmente
- Final gap (GAP 4B): de 100 a 400 bytes con valor 4Eh
Más gráficamente, de [5].
El algoritmo CRC de 16bits que se usa es el típico con el polinomio x^16 + x^12 + x^5 + 1, con el primer valor a FFh.
Antes de seguir es conveniente tener esta tabla a mano (resumida de 1):
Código: Seleccionar todo
+-----------------------------------------+-------------------+------------------+-------------------+------------------+
| FORMATOS DE DISCO ESTÁNDAR | 5¼ Doble Densidad | 5¼ Alta Densidad | 3½ Doble Densidad | 3½ Alta Densidad |
+-----------------------------------------+-------------------+------------------+-------------------+------------------+
| Velocidad de rotación (R.P.M.) | 300/360(*) | 360 | 300 | 300 |
| Velocidad de transferencia (kbits/seg.) | 250/300(**) | 500 | 250 | 500 |
| Bytes brutos por pista | 6.250 | 10.416 | 6.250 | 12.500 |
| Tamaño de sector en bytes [1] | 512 | 512 | 512 | 512 |
| GAP 3 al formatear con FORMAT [2] | 80 | 84 | 80 | 108 |
| Bytes que usa el 765 entre sectores [3] | 62 | 62 | 62 | 62 |
| Bytes ocupados por sector ([1]+[2]+[3]) | 654 | 658 | 654 | 682 |
| Sectores por pista | 9 | 15 | 9 | 18 |
| Bytes que usa el NEC 765 al inicio pista| 146 | 146 | 146 | 146 |
| Bytes aproximados que restan en GAP 4B | 218 | 400 | 218 | 78 |
| Cilindros | 40 | 80 | 80 | 80 |
| Caras o cabezales | 2 | 2 | 2 | 2 |
| Sectores en el disco | 720 | 2400 | 1440 | 2880 |
| Kbytes por disco | 360 | 1200 | 720 | 1440 |
+-----------------------------------------+-------------------+------------------+-------------------+------------------+
(*) 300 en unidades de doble densidad y 360 en las de alta densidad
(**) 250.000 en unidades de doble densidad y 300.000 en las de alta densidad
De esta tabla nos quedamos con que según el tipo de disquetera, el disco giraba a una velocidad u otra, y que la velocidad transferencia (entre la disquetera y el controlador) también varía. Veremos que esto es importante después.
Una nota final, si revisamos detalladamente el formato de una pista vemos que tanto los IAM como el DAM, son una secuencia de 3 bytes seguidas de un byte específico:
Código: Seleccionar todo
ID byte Clock Field description
FC D7 Index address mark
FE C7 Sector ID address mark
FB C7 Sector data
F8 C7 Deleted data
FE C7 IBM bad track ID
Tenemos que tener en cuenta lo siguiente. Ya sabemos que la información binaria en disco no se guarda exactamente como nosotros la recibimos, sino que se guarda codificada en formato MFM. MFM es una codificación que permite mezclar datos con la información del reloj. Además está hecha para que la información sea más “resistente” al ser pasada a un medio físico magnético y que un cabezal de bobina pueda leerla correctamente. Por tanto si nosotros en un sector grabamos un byte con valor 43h, en el disco no está tal cual sino codificado MFM.
Pues bien, dada la naturaleza del formato MFM, ningún byte (entre 0 y 255, obviamente) se codifica a estos valores previos puestos (FC,FE,FB,F8,FE).
De estas maneras cuando la controladora detecta un byte con alguno de esos valores, sabe que están en un campo especial y que a continuación vienen datos importantes. Tiene sentido esta idea xD. Cito esto aquí por es importante más adelante.
Igualmente importante es el concepto del interlineado de los sectores (interleave).
Podemos pensar que los sectores en una pista están grabados por orden, primero el 1, luego el 2, etc… Pero nada impide cambiar ese orden porque la propia cabecera del sector (Sector ID) contiene el número del sector. Alguien en su momento descubrió que aunque los sectores se grabaran en orden, no eran leídos así. Es lógico porque cuando la controladora termina de leer el sector 1, y el programa lo procesa, la cabeza lectora ya está a medio camino en el sector 2, por lo que se precisa dar una vuelta completa para encontrar de nuevo el sector 2. Entonces lo ideal es grabar los sectores fuera de orden, digamos 1,5,2,6,3,7,4,8,9 … así se podría leer toda la pista con solo una revolución del disco. Hablo de manera resumida claro, esto es más complejo dependiendo del formato del disco, la velocidad del ordenador, el DMA, etc…
Pero sí que se usó mucho esta técnica para incrementar la velocidad de lectura de un disco. Por ejemplo el famoso programa 2M lo usa muy extensivamente [4].
Protecciones anticopia
==================
Mucho del contenido de esta sección viene de [2], en forma resumida.
Teniendo en cuenta lo visto, entendemos que un programa que intente copiar todo tipo de disco deberá hacerlo al más bajo nivel posible, “hablando” directamente a la controladora y teniendo en cuenta todos los campos vistos. Como ya veremos hay algunos tipos de protecciones imposibles de duplicar en un hardware estándar de PC (disquetera, controladora NEC o Intel), esto es debido a que sí se puede leer y procesar la protección, pero el hardware hace imposible escribirla.
¿Cómo fueron estos discos creados entonces? En general se duplicaban en negocios exteriores, plantas especializadas en la duplicación, creación de manuales, caja y empaquetamiento de los programas/juegos. Estas plantas usaban máquinas especiales con unas controladoras complejas (llamadas TRACER [3]) que mediante un lenguaje descriptivo (un script), se le decía a las disqueteras genéricas a qué velocidad, qué densidad de bits, la estructura interna de cada pista, incluso el contenido de los campos GAP.
Como siempre, creadas las protecciones… aparecieron los programas específicos para copiarlas.
Aquí debemos distinguir entre copiar un disquete a desprotegerlo. Copiar significa que el disco se copiaba bit por bit, lo más parecido posible al original, de manera que la copia directamente como tal funcionara. Desproteger significa que el disco se copiaba todo lo que se pudiera, pero luego el programa en el disco, era modificado para que a la hora de comprobar si la protección estaba bien o mal, siempre dijera que si. Por tanto el disco destino no es igual al original, está “craqueado”.
Copiar un disco 100% exactamente es imposible en un PC. Porque por muy avanzado que fuera el programa o sensible la disquetera, siempre hay pequeñas variaciones en cuanto cómo se lee la pista, o la precisión de giro del motor, variaciones magnéticas de las cabezas, etc. Para ser 100% exacto se requeriría una máquina Tracer, y usar el script que se usó en su día para tal copia (esto viene especificado muchas veces en el foro Kryoflux)
Programas copiadores hubieron muchos. En mi repositorio tengo muchas versiones de los más conocidos, el Copy II Pc de Central Point (los del famoso PcTools), el Copywrite de Quaid Software (para mi el mejor, que también sacó otros programas muy buenos como el Disk Explorer, un “crackeador” muy potente llamado Rescue y un debugger llamado Quaid Analizer), y otros más modernos como Teledisk, Anadisk, CopyQm, etc…
Como referencia decir que tengo 25 versiones de Copywrite (la más antigua de agosto de 1984 y la última de enero de 1992), de Copy II PC 30 versiones (desde la 1.00 de 1982 a la 6.00 de 1990), de Teledisk 21 versiones (desde la 1.05 a la 2.23), etc… Podemos imaginar que cada versión que salía permitía copiar nuevas protecciones y traían mejoras. Pero decir que hay un “mito” (probablemente sea cierto), que las ultimas versiones de Teledisk y de Copy II PC había ciertas protecciones que no copiaban, por presiones de las compañías y probablemente acuerdos bajo la mesa. Así que nunca venía mal usar una versión más antigua si la moderna no copiaba ese disquete… xD
Estos programas no venían solos como un copiador sino también venían acompañados de un conjunto de utilidades. Estas servían para desproteger los discos que el mismo copiador no podía copiar, simular sectores defectuosos mediante un TSR en ram. etc… Usaré el nombre en inglés en los casos que sea mejor hacerlo así por ser protecciones muy típicas y usuales.
- Protecciones independientes del tiempo: basadas en los bytes de marcas (IAM,DAM,etc). Funcionan en todas las disqueteras compatibles.
- * Sectores de más o menos: como vimos, cada sector tiene una cabecera que indica el número de sector dentro de la pista, el cilindro, su tamaño, etc. También vimos que los espacios GAP son amplios, es por tanto posible meter más o menos o incluso cambiar los tamaños de los sectores. Crear una pista con 10 sectores de 512bytes, o meter 20 de 256, o grabar 1 sector de 4096, por ejemplo. Estos disquetes no son compatibles con MSDOS y por tanto requieren un programa especial que entienda los formatos.
* Weak data bits: estos sectores básicamente devuelve información distinta cada vez que se leen. La protección lo que hace es leer el mismo sectores varias veces, si las lecturas son distintas, es que la protección está ok. Cómo fueron grabados? La duplicadora graba la información en el sector de una manera que la graba por así decirlo, “fuera de tiempo”, adelantada o atrasada, o simplemente graba un grupo de datos MFM todo a 0 (ya vimos que esto no es posible dentro del estándar MFM). Después a la hora de leerlo, la disquetera pierde la sincronía de lectura, y lee “ruido”, dicho de manera sencilla. Se podría decir que las protecciones basadas en sectores defectuosos, la famosa protección láser y parecidas, es un subconjunto de este tipo.
* Datos en zona GAP: como su nombre indica, se graban datos en la zona GAP 3, ya vimos que caben entre 54 y 166 bytes (por defecto en discos con formato estándar). Hay hueco por tanto para grabar ahí información. Un copiador de discos “normal”, sólo lee y duplica sectores, no lee ni reproduce los campos GAP, de sincronía y demás ya vistos. Copywrite lo soporta.
* Sectores sin campo DAM: generan un error a nivel de controladora. MS-Dos a nivel de sector ni se inmuta, es fácilmente chequeable después a nivel de controladora y por tanto una protección puede verificar esto.
* Sectores sin campo IAM: igual que el anterior.
* Sectores con un campo IAM incorrecto: vimos en los campos que el primer CRC cubre el IAM y el Sector ID, si uno de estos tiene información corrompida (hecho a posta claro), el CRC no será el correcto y la controladora genera un error específico. Copywrite lo soporta.
* Campo de datos sobre la Physical index mark: qué pasaría si extendemos el campo de datos y los campos posteriores más de la cuenta al ser grabados?, el disco sigue girando así que sobrescribiría los datos a continuación, en este caso pasaría sobre el inicio de la pista “el agujero”, y seguiría por el primer sector… Hay poca información sobre esta protección… aparentemente solo se usaba en la USSR (según [2])
* Sectores grabados con distinta tasa de datos: dentro de la misma pista es posible grabar sectores a por ejemplo 500KBPS y otros a 300KBPS, obviamente imposible porque una disquetera normal grabaría siempre a la misma velocidad.
* Data access over gap: entiendo que es como una versión extendida de la grabación de datos sobre la PIM, pero llevado ya a casos donde hay corrupción efectiva de otros campos dentro de la pista. Pero no me queda claro. Sectores solapados estarían en este tipo.
- * Orden de los sectores: vimos en el interlineado de sectores como se podía mejorar el orden de lectura de los mismos. Esta protección consiste en medir tiempos exactos de cuanto se tardan en leer los sectores. Tan solo un copiador muy exacto que duplicara exactamente el contenido de una pista podría igualar estos tiempos de lecturas. Aparentemente no fue muy usado.
* Medidas de los tiempos de transferencia de datos. Si tenemos en cuenta que un disco es circular y que todas las pistas tienen el mismo número de sectores y de bytes, es lógico pensar que los cilindros interiores tenían una densidad de bits superior a los exteriores (al haber menos espacio circular). Estas protecciones se basan en esas diferencias entre las variaciones de velocidad de lectura de las pistas.
- * Formatos MFM no estándares: la controladora en sí no tiene capacidad por software de modificar los tamaños de los GAPS, igualmente que los contenidos. Así que pistas con tamaños de GAPs extraños, son leídos correctamente. Pero… la controladora si puede medir el tamaño de los GAPS. Por lo que es posible implementar una protección con esto.
Vamos terminando… Como siempre, decir que hay variaciones sobre todas estas, y ademas otras no comentadas, y normalmente las buenas protecciones usan varias a la vez.
Protecciones conocidas en algunos juegos
==================================
Para terminar en esta parte vemos algunos juegos y que protecciones usaron. Ver al final del listado la descripción de las protecciones.
Toda esta información viene de múltiples fuentes, foros y demás. Sobre todo de los foros de Kryoflux, Supercard Pro, Vintage-Computer, etc. Así como gente que he conocido interesada en la preservación de juegos de PC y con los que he compartido “dumpeos” Kryoflux de originales estos últimos años.
Nombre | Proteccion |
3-D Helicopter Simulator | SG203 |
Adventure in Serenia | NSSS |
After Burner | weak1 |
Airborne Ranger | MP2 |
Ajax | HLS |
Amnesia | |
Archon: The Light and the Dark | Interlok |
Arkanoid | SG2x3x |
Arkanoid II: Revenge of DOH | SG2x3x |
B.C.'s Quest for Tires (regular version) | Copylock |
Bad Dudes | HLS |
BC's Quest for Tires (Tandy version) | SectID |
Black Cauldron, The (AGI version 2) (version 1.1J, 1.1K, 1.1M, 2.00, not 2.10) | SG203 |
Block Buster (Original release) | weak1 |
Blockbuster (Second release) | Copylock |
Blood Money | weak2 |
Boot Camp | HLS |
Bop'N' Wresting | weak1 |
Boulder Dash II | weak1 |
Bubble Bobble | SG2x3x |
California Games | HLS |
Crossfire (IBM PCjr floppy disk version) | Copylock |
Dr.Doom's Revenge | MP2 |
F-15 Strike Eagle II | MP2 |
F-19 Stealth Fighter | MP2 |
Frogger | OSP1 |
Gato | |
Gato (Versions 1.0-1.3) | Copylock |
Gauntlet (Early version) | weak1 |
Gauntlet (later version) | HLS |
Grand Prix Circuit (early version only) | HLS |
Gunship (certain versions) | MP1 |
Hard Hat Mack | Interlok |
Hardball (Disk 2/EGA Disk, early version only) | Copylock |
Harrier Combat | weak1 |
Horror Zombines From The Crypt | weak2 |
King's Quest (IBM PC-CGA version 128K) | Copylock |
King's Quest (IBM PCjr. version) | NSSS |
King's Quest (Tandy version) | SectID |
King's Quest I: Quest for the Crown (AGI version 2) | SG203 |
King's Quest II: Romancing the Throne (AGI version 2) | SG203 |
King's Quest III: To Heir is Human | SG203 |
Leisure Suit Larry in the Land of the Lounge Lizards (AGI version) | SG203 |
Lemmings | weak2 |
Lemmings 2: The Tribes (used HD media) | weak1 |
M1 Tank Platoon | MP2 |
Marble Madness | Interlok |
Mixed-Up Mother Goose (AGI version) | SG203 |
Murder on the Zinderneuf | Interlok |
Oh No! More Lemmings (comes in disk-based and document-based versions) | weak1 |
One-on-One | Interlok |
Operation Wolf | SG2x3x |
Outrun | weak1 |
Paperboy (Original release) | weak1 |
Paperboy (Second release) | Copylock |
Pinball Construction Set | Interlok |
Pinball Wizard | Copylock |
Pinball Wizard | |
Pipe Dream (European version, U.S. version by LucasFilm Games used a Codewheel) | Minder3 |
Puzznic | SG2x3x |
QIX | SG2x3x |
Rambo III | SG2x3x |
Rastan | SG2x3x |
Red Storm Rising | MP2 |
Renegade | SG2x3x |
Rick Dangerous | MP2 |
Rick Dangerous II | weak2 |
Rush 'n' Attack | HLS |
Sargon III | |
Savage | MP2 |
Seven Cities of Gold, The | Interlok |
Shadow Gate | weak1 |
Shinobi | weak1 |
Sid Meier's Pirates | MP1 |
Sierra Championship Boxing (1984 version) | Copylock |
Sky Shark | SG2x3x |
Solitaire Royale | |
Space Quest II: Vohaul's Revenge | SG203 |
Space Quest: The Sarien Encounter (AGI version) | SG203 |
Stunt Track Racer | MP2 |
Super Boulder Dash | Interlok |
Sword of the Samurai | MP2 |
Test Drive | HLS |
Test Drive II | HLS |
Thexder | SG203 |
Timothy Leary's Mind Mirror | Interlok |
Top Gun | Copylock |
Troll's Tale | Copylock |
Ultima I: The First Age of Darkness | OSI1 |
Ultima II (1983, 1984 versions) | Copylock |
Ultima II (1985 version) | SG2x3x |
Ultima II: Revenge of the Enchantress (Ultima Trilogy version) | OSI1 |
Ultima III (1984, 1985 versions) | Copylock |
Ultima III (Ultima Trilogy version) | xelock |
Ultima IV: Quest of the Avatar | OSI1 |
Ultima V: Warriors of Destiny | OSI1 |
Ulysses and the Golden Fleece | OSP1 |
Will Harvey's Music Construction Set | Interlok |
Wizard and the Princess, The (IBM PCjr version) | Copylock |
Wizbal l | |
X-Men | MP2 |
Protecciones:
Electronic Arts IBM Interlock | Usado por Electronic Arts en los juegos "boot", autoarrancables, llevan 96 sectores interlineados, en la pista 15 cara 0 usualmente. Tambien usan discos de 200KB y 400KB con 10 sectores por pista. |
Formaster Copylock | Contienen sectores con errors, usualmente en la pista 20, pista 0, sector 5. El Sector ID esta marcado como de tamaño 256, pero en realidad es de 512bytes, se uso mucho en juegos de Sierra. |
H.L.S. Duplication | Usado por Epyx y Accolade. Tiene un campo adicional de Sector ID en uno de los sectores. |
Sector ID Duplication | Usado por Sierra en sus versiones para Tandy antes de 1985. Hay multiples sectores con igual Sector ID. |
Microprose Protection 1 | Usa sectores que se solapan, en pista 4, cara 0. (1987-1988) |
Microprose Protection 2 | Usa sectores que se solapan, pistas 38-39, cara 0. (1988-1989) |
On-Line Systems Protection #1 | |
Origin Systems OSI-1 | Usado por Origin Systems en sus juegos |
Softguard 2.x/3.x with original loader | Usado por Taito, la proteccion es igual que la de Sierra. |
Softguard 2.0.3 with Sierra's Loader | Usado por Sierra. Lleva una pista con tamaño de sectores no estandar, sectores solapados, errores de CRC en al campo de datos. |
Weak Bits | Ya mencionado. |
XELOK/XEMAG | Usado principalmente por Broderbund. Tiene 16 sectores en lugar de 8 en la pista 9, cara 0. |
Minder03 | Usado por Prism Software. |
Non-standard Sector Sizes | Muy usado por varias compañias. |
Próximamente, Kryoflux, SuperCardpro, Transcopy, y como preservar nuestros preciados originales (y lo más interesante… duplicarlos xD)
-- FIN --
Referencias:
1 : http://galia.fc.uaslp.mx/~cantocar/ARQU ... /1206.html
2: Documento en el copiador CM de Serge Pachkovsky (Novosibirsk)
3: http://www.awp1.com/st.html
4: https://es.wikipedia.org/wiki/2M
5: http://info-coach.fr/atari/documents/_m ... ection.pdf
6: No me queda muy claro si este campo termina con un FBh y el siguiente empieza de nuevo con FBh, o sólo hay un byte FBh