Техника защиты компакт-дисков от копирования

Трек с нестандартным номером


Внедрение в TOC фиктивных треков с нестандартными номерами обеспечивает создание стойкой, элегантной и в высшей степени неконфликтной защиты. Но обо всем по порядку. По стандарту номера нормальных треков могут принимать значаения в диапазоне от 1 до 99 (4Bh) включительно. Трек номер 0 принадлежит вводной области диска и никогда явным образом не присутствует в TOC (см. разд. "Диск с нулевым треком" этой главы). Трек номер AAh (170) принадлежит выводной областиью диска и так же никогда не присутствует в TOC. Треки с номерами A0h, A1h, A2h, B0h, B1h, B2h, B3h, B4h, C1h и C2h используются для хранения служебных данных и интерпретируются особенным образом, специфичным для каждого номера. В частности, стартовый адрес трека A1h содержит в себе номер последнего трека данной сессии, хранящийся в поле PMin.

Приводу запрещается обрабатывать треки с нестандартными ему номерами и такие треки по стандарту должны игнорироваться. Создавая трек с нестандартным номером мы можем быть абсолютно уверенны в том, что он не сорвет крышубудет "по зубам" приводу и ни в коей мере не нарушит читабемльность диска. Правда, существует определенная вероятность, что с течением времени выбранный нами нестандартный номер трека перейдет в разряд стандартных и тогда поведение привода станет непредсказуемым. Однако степень риска крайне невелика —– формат носителей CD-ROM носителей не меняется каждый день и уже содержит в себе все необходимое. Навряд ли в него будут добавляться новые point'ыуказатели, да еще и совпадающие с нашим. Так что предлагаемая защита вполне соотвествует "букве" и "духу" стандарта и в категорию "защит, основанных на искаженном TOC'е" она попала число случайно, —– так уж был скомпонован материал настоящей книги.

Но если защищенный диск вполне корректно обрабатывается приводом, то в чем же трудность его копирования? Дело в том, что о сущестовании нестандартных треков копировщику не так-то просто узнать. Даже при чтении TOC'a в "сыром" виде (команда READ TOC формат 2) привод не возвращает атрибуты нестандартных номеров треков, так что эта "сырость" весьма относительна и дотянуться до них можно лишь на субканальном уровне, читая содержимое области Lead-inLead-In области командами SEEK или /READ SUBCHANNEL (при этом треки с нестандартными номерами должны располагаться не в первой сессии, т. к.
ее область Lead-inLead- In область на интерфейсном уровне недоступна).

Защите будет достаточно лишь просканировать вводную область соответствующей сессии на предмет поиска "своих" номеров треков и, если окажется, что их там нет, то – мы имеем дело не с оригиналом, ано с копией. Читать субканальные данные вводных областей второй и всех последующих сессий умеют все приводы, правда некоторые из них делают это через то местоочень коряво и "криво", куда Макар телят не гонял. В частности нестандартный номер X может быть замещен номером 64h + (X – A0h). Так например, номер ABh интерпретируется приводом NEC как 6Fh. Следовательно, на выбор нестандартных номеров наложены определенные ограничения и по соображениям совместимости и неконфликности номера 65h—…9Fh лучше не выбирать, т. к. в этом случае привод может ошибочно интерпретировать нестандартный номер трека как стандартный (допустим, мы выбрали номер 66h, тогда 64h + 66h – A0h == 2Ah или 42 в десятичной системе исчисления, трек с номером 42 —– вполне стандартый трек).

ХорошоОК, приступаем к нашим традиционным экспериментам. Как говорится "не откадывай на завтра то, что можно выпить сегодня" (а хачинье взлом лазерных дисков —– лучший повод для оправдания количества выпитого пива. Кстати о пиве – если из под лежачего хакера что-то и течет, то это отнюдь не пиво. Впрочем, не будем отклоняться от темы обсуждения и вернемся к нашим "баранам").

Используя CCD-образ, оставшийся от прошлых экспериментов с нулевым треком, изменим строку "Point = 0x00" на "Point = 0xAB" (естественно, вместо 0xAB вы можете выбрать любое другое значение, но с учетом требований, предъявляемых к нестандартным номерам треков, о которых уже рассказывалось ранеевыше). Что? У вас нет CCD-образа? Тогда сделайте следующее:

10. С помощью своей любимой програмы "прожига" подготовьте лазерный диск, содержащий две сессии и два трека —– по одному треку в каждой.;



11. Снимите образ диска в Clone CDCloneCD- формате ( для чего пригодиться не только сам копировщик Clone CDCloneCD, но и любой другой совместимый с ним копировщик, например, Alcohol 120%Алкоголь).;

12. Откройте CCD-файл в текстовом редакторе типа "Блокнот" или нажмите <F4>, находясь в файловом менеджере FAR'e.;

13. Увеличьте значение поля TocEntries на единицу.;



14. Следом за треком два (Session = 2, Point = 2) добавьте еще одно Entry, чей указательPoint был бы равен ABh или любому другому выбранному вами значению. Содержимое остальных полей данного Entry не критично и вы вполне можете использовать их для хранения ключевой информации.;

15. Увелитьте значения всех последующих Entry на единицу, чтобы сохранить переемственность принятой системы нумерации.;

16. Нажмите <F2> или <Ctrl> +– <S> для сохранения изменений в файле.

(Внимание!

"Блокнот" под Windows 9x не понимает клавиатурной комбинации <Ctrl>+<S>, а вот его собрат под Windows NT/2000 —– понимает.

Как бы там ни было, вы должны получить приблизительно следующий результат (листинг 6.50) (по соображениям экономии места ниже приведен лишь фрагмент последнего).:

Листинг 6.50. Нестандартный номер трека в CCD-файле

[Entry 12]

Session=2

Point=0xAB

ADR=0x01

Control=0x04

TrackNo=0

AMin=0

ASec=0

AFrame=0

ALBA=-150

Zero=0

PMin=3

PSec=1

PFrame=66

PLBA=13458

Листинг 42 нестандартный номер трека в CCD-файле

Записав полученный образ на диск, убедитесь, что он нормально читается всеми, доступными вам приводами и ни коем образом ни с чем не конфликтует. А теперь считайте содержимое TOC и посмотрите: присутствует ли там "наш" нестандартный номер треака (track) или нет (листинг 6.51).:

Листинг 6.51. Содержимое TOC в "сыром" виде с отсутствующим нестандартным треком

KPNC$F:\.PHCK3\src\etc\RAW.CD.READ>CD_RAW_TOC_READ.exe 1.1



RAW TOC READER by Kris Kaspersky

* * * TOC * * *

session number

 | ADR/control

 |  | TNO

 |  |  | point

 |  |  |  |

AM:AS:AF

 |  |  |  |  |  |  | zero

 |  |  |  |  |  |  |  | PM:PS:PF

01 14 00 A0

00 00 00 00 01 00 00

01 14 00 A1

00 00 00 00 01 00 00

01 14 00 A2

00 00 00 00 00 1D 21

01 14 00 01

00 00 00 00 00 02 00

01 54 00 B0

02 3B 21 03 16 0E 22

01 54 00 C0

A2 C8 E0 00 61 1B 15

02 14 00 A0

00 00 00 00 02 00 00

02 14 00 A1

00 00 00 00 02 00 00

02 14 00 A2

00 00 00 00 03 18 17

02 14 00 02

00 00 00 00 03 01 21

02 54 00 B0

04 36 17 01 16 0E 22

Листинг 43 содержимое TOC'а в сыром виде с отсутствующим нестандартным треком

Хм! Такое впечатление, что нестандартный номер трека вообще не записался на диск. На самом же деле это предположение неверно. Записаться-то, он записался, ано вот просчитался —– едва ли. Привод просто отказался возвращать атрибуты нестандартного номера трека, делая вид, что как будто его и не было. Причем, это отнюдь не дефект какой-то одной отдельно взятой модели —– так ведут себя все приводы! (во всяком случае —– все, доступные мне, —– точно).

А теперь посмотрим что даст чтение вводной области второй сессии на субканальном уровне. Естественно, чтобы прочитать субканальные данные вводной области мы должны знать ее стартовый адрес. Как его определить? Да очень просто. Открываем CCD-файл и ищем Entry, чей Session равен 1, а Point – — A2h (она содержит стартовый адрес выводной области первой сессии) (листинг 6.52).:

Листинг 6.52. Адрес выводной области первой сессии

[Entry 2]

Session=1

Point=0xa2

ADR=0x01

Control=0x04

TrackNo=0

AMin=0

ASec=0

AFrame=0

ALBA=-150

Zero=0

PMin=0

PSec=29

PFrame=33

PLBA=2058

Листинг 44 адрес выводной области первой сессии

Легко видеть, что абсолютный адрес выводной области первой сессии составлет 00:29:33 (или 2058 в LBA-формате). Увеличив его на длину выводной области (30 сек. или 2250 в LBA-формате) мы получим абсолютный адрес вводной области второй сессии, который в данном случае равен 00:59:33 или 4308 в LBA-формате.



Что ж! Остается всего лишь запустить утилиту seek_and_Q.exe, см. прилагающийся к книге компакт-диск, и проанализировать поток цифр, возникающий на экране (листинг 6.53).:

Листинг 6.53. Содержимое TOC прочитанное на субканальном уровне в нестандартным номером трека внутри, прочитанное на приводе TEAC

KPNC$F:\.PHCK3\src\etc\RAW.CD.READ>seek_and_Q.exe 1.1 4308 4444

seek CD-ROM & read Q-subcode by KK

LBA - 10D4:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 6E



LBA - 10E9:00 15 00 0C 01 14 00 02 00 00 34 92 00 00 11 7F

LBA - 10EA:00 15 00 0C 01 14 00 AB 00 00 34 B3 00 00 11 85

LBA - 10EB:00 15 00 0C 01 14 00 02 00 00 34 92 00 00 11 81

LBA - 10EC:00 15 00 0C 01 14 00 AB 00 00 34 B3 00 00 11 85

LBA - 10ED:00 15 00 0C 01 14 00 AB 00 00 34 B3 00 00 11 85

LBA - 10EE:00 15 00 0C 01 14 00 AB 00 00 34 B3 00 00 11 86

LBA - 10EF:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 8B

LBA - 10F0:00 15 00 0C 01 14 00 AB 00 00 34 B3 00 00 11 86

LBA - 10F1:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 8B

LBA - 10F2:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 8B

Листинг 45 содержимое TOC'а прочитанное на субканальном уровне в нестандартным номером трека внутри, прочитанное на приводе TEAC

Оторвать хвост ТигруУра! Это получилось!!! Нестандартные номера треков все-таки присутствуют в TOC'е! Ну-ка, посмотрим, как поведут себя другие модели приводов, например, крайне "капризный" в этом отношении привод NEC (листинг 6.54).?

Листинг 6.54. Содержимое TOC прочитанное на субканальном уровне в нестандартным номером трека внутри, прочитанное на приводе NEC

LBA - 1188:00 15 00 0C 01 14 00 66 00 00 11 7A 00 00 3B 45

LBA - 1189:00 15 00 0C 01 14 00 6F 00 00 11 86 00 00 34 B3

LBA - 118A:00 15 00 0C 01 14 00 6F 00 00 11 87 00 00 34 B3

LBA - 118B:00 15 00 0C 01 14 00 6F 00 00 11 85 00 00 34 B3

LBA - 118C:00 15 00 0C 01 14 00 6F 00 00 11 87 00 00 34 B3

LBA - 118D:00 15 00 0C 01 14 00 6F 00 00 11 85 00 00 34 B3



LBA - 118E: 00 15 00 0C 01 14 00 02 00 00 11 80 00 00 34 92

Листинг 46 содержимое TOC'а прочитанное на субканальном уровне в нестандартным номером трека внутри, прочитанное на приводе NEC

Ага! Трека с номером ABh здесь все-таки не оказывается, зато присутствует трек с номером 6Fh, что с учетом преобразования по ранеевыше приведенной формуле дает: A0h + 6Fh -? 64h == ABh, —– как раз то, что нам нужно.

Копирование защищенного диска копировщиком Alcohol 120% Алкоголем и/или Clone CDCloneCD протекает вполне нормально (никто не "виснет", ничего не взрывается и не дымит), однако, и нестандартных номеров треков в субканальных данных второй сессии уже не оказывается, и по этим абсолютным адресам содержатся атрибуты уже совсем других треков, смотрите сами (листинг 6.55).:

Листинг 6.55. Копия диска уже не содержит нестандартного трека

LBA - 10EB:00 15 00 0C 01 14 00 02 00 00 34 92 00 00 11 7F

LBA - 10EC:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 86

LBA - 10ED:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 86

LBA - 10EE:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 86

LBA - 10EF:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 87

Листинг 47 копия диска уже не содержит нестандартного трека

Действуя по описанной ранеевыше методике, защитный механизм сможет без труда отличить оригинальный диск от его подлой копии, причем тиражирование оригинальных дисков элементарным образом осуществляется на штатном оборудовании (обычный рекордер плюс копировщик Clone CDCloneCD или/ Alcohol 120% Алкоголь —– вот и все, что вам нужно). Ничуть не с меньшим успехом защита может использоваться и в производстве штампованных CD, но это уже тема другого разговора.

Памятуя о пословице "чем меньше женщину мы любим —– тем больше времени мы спим" перейдем от любви к практике. То есть —– ко взлому. Несмотря на высокую стойкость защиты перед существующими на момент написания этих строк автоматическими копировщиками, скопировать оригинальный диск вполне по силам опытному хакеру средней руки.


Достаточно лишь запустить анализатор субканальных данных (для этих целей вполне подойдет утилита seek_and_Q) и прочитать "сырой" TOC второй и всех последующих сессий диска (если они есть). Там, среди прочей информации, мы обнаружим уже знакомый нам нестандартный номер трека (листинг 6.56).

Листинг 6.56. Идентификация защищенного диска

                          ADR/Control

                           | TNO

                           | |  Point

                           | |  |  +  PLBA  +  +тек. адр.+

                           | |  |  |        |  |         |

LBA - 10EB:00 15 00 0C 01 14 00 02 00 00 34 92 00 00 11 81

LBA - 10EC:00 15 00 0C 01 14 00 AB 00 00 34 B3 00 00 11 85

LBA - 10EF:00 15 00 0C 01 14 00 A0 00 00 22 92 00 00 11 8B

Листинг 48 идентификация защищенного диска

Теперь остается взять CCD-образ, снятый Clone CDCloneCD с оригинального диска, и добавить в него еще одно Entry, несущее в себе трек с нестандартным номером. Легко сказать… Стоит попытаться сделать это как сразу же возникает масса вопросов? Как перевести субканальные данные в формат, понятный коптровщику Clone CDCloneCD? В какое именно место CCD-файла следует добавлять новый Entry? Начнет с ответа на последний вопрос. При просмотре субканальной информации оригинального диска заметно, что трек с нестандартным номером ABh следует за треком номер 02h и предшествует треку A0h (см. листинг 6.56). На приводах с разболтанной головкой эту закономерность установить сложнее, т. к. субканальные данные возращаются в хаотичном порядке и поэтому приходится опираться отнюдь не на те адреса, на которые осуществлялось позиционирование, а на абсолютные адреса, возращенные в самой субканальной информации. Впрочем, об этом мы уже говорили. Так что открываем CCD-образ, находим в нем местечко между треками 02h и A0h… Черт, возьми! Если верить CCD-файлу (а, точнее, информации, возращенной приводом по команде READ TOC, на основании которой и создается CCD-файл), то за Entry с треком 02h следует Entry с треком B0h (стартовый адрес дозаписи), а Entry с треком A0h (номер превого трека текущей сессии) как раз и есть первый Entry данной сессии! И как прикажете это понимать?! А вот как! Стартовый адрес дозаписи в субканальных данных вводных областей вообще не хранится — поэтому-то трека с номером B0h тут и нет.


Далее. Поскольку, TOC каждой сессии дублируется в субканальных данных огромное количество раз, становится понятно, почему за треком ABh следует трек A0h, — ведь TOC по сути свой как бы "закольцован" и вынужден в угоду надежности и отказоустойчивости "пожирать" свой "хвост".

Таким образом, мы должны найти Entry с треком 02h и добавить вслед за ним Entry с треком ABh. Поле Session должно быть равно 2 (ведь мы читали вводную область второй сессии), поле ADR равно четырем старшим битам поля ADR/Control, а после Contorl — соответственно, четырем младшим. В нашем случае ADR/Contorl = 14h, следовательно ADR = 1, а Control = 4. Поле TrackNo = 0, поскольку, мы находится в области Lead-inLead-In (служебном треке с номером ноль). Поля AMin, ASec, AFrame по идее должы содержать адрес соответствующим им субканальных данных, однако, по общему соглашению их принятно считать равными нулю, что соотвествует ALBA адресу в –150 (минус сто пятьдесят). Поле Zero равно нулю по жизни, а поля PMin:PSec:PFrame равны соответствующему им полю PLBA, представленному в формате M:S:F (только помните, что некоторые приводы склонны менять поля PLBA и ALBA местами!). В нашем случае поле PLBA субканальных данных равно 34B3h, что соответствует абсолютному адресу 03:01:66.

Вот, пожалуй, и все. Обобщив весь этот материал, мы получаем следующий симпатичненький Entry, который должен выглядеть приблизительно так как показано в листинге 6.57.

Листинг 6.57. Формирование Entry для копирования защищенного диска

[Entry 12]

Session=2

Point=0xAB

ADR=0x01

Control=0x04

TrackNo=0

AMin=0

ASec=0

AFrame=0

ALBA=-150

Zero=0

PMin=3

PSec=1

PFrame=66

PLBA=13458

Листинг 49 формирование Entry для копирования защищенного диска

Теперь, увеличив содержимое поля TocEntries на единицу и перенумеровав все "хвостовые" Entry так, чтобы только что добавленный нами Entry не нарушал их стройной нумерации, запишем отредактированный образ на новую болванку (добавлять поле [TRACK AB] ни в коем случае не надо!).

Если все сделано правильно, то скопированный диск ничем не будет отличаться от оригинального и защита "упадет". Однако, взломать ее сможет далеко не всякий. Как вы уже могли убедиться, хакер должен обладать весьма глубокими познаниями в области строения лазерных дисков и особенностями их обработки различными моделями приводов.


Содержание раздела