Журнал Системный Администратор, Сентябрь 2003

Журнал Системный Администратор

Сентябрь 2003

Цена: $4.5 US

  Подписаться

Зарегистриванные пользователи, пожалуйста следуйте этой ссылке

Версия для печати Вернуться к оглавлению

Искажение TOC как средство борьбы с несанкционированным копированием диска

Крис Касперски

Уже давно

Утихло поле боя,

Но сорок тысяч

Воинов Китая

Погибли здесь,

Пожертвовав собою...

 

Ду Фо «Оплакиваю поражение при Чэньтао»

Искажение TOC – жестокий, уродливый но на удивление широко распространенный прием, использующийся в доброй половине защитных механизмов. Штатные копировщики на таких дисках в буквальном смысле слова сходят с ума и едут крышей. Копировщики защищенных дисков (Clone CD, Alcohol 120%) к искаженному TOC относятся гораздо лояльнее, но требуют для своей работы определенного сочетания пишущего и читающего приводов, да и в этом случае копируют такой диск не всегда.

Пишущий привод обязательно должен поддерживать режим RAW DAO (Disc At Once), в котором весь диск записывается за один проход лазера. Режим RAW SAO (Session At Once) для этих целей совершенно непригоден, поскольку предписывает приводу писать сначала содержимое сессии, а потом – TOC. Как следствие – приводу приходится самостоятельно анализировать TOC, чтобы определить стартовый адрес сессии и ее длину. Попытка записать искаженный TOC в режиме SAO в общем случае приводит к непредсказуемому поведению привода и о работоспособной копии защищенного диска нечего и думать! Первая встретившаяся приводу сессия с искаженным TOC обычно оказывается и последней, т.к. остальные сессии писать уже некуда (искажение TOC обычно преследует цель увеличения размера сессии до нескольких гигабайт).

Читающий привод помимо режима «сырого» чтения (который поддерживают практически все приводы) должен уметь распознавать искаженный TOC, автоматически переходя в этом случае на использование «резервного» средства адресации – Q-канала подкода. В противном случае сессия, содержащая искаженный TOC, окажется недоступной для чтения даже на секторном уровне.

Таким образом, копирование дисков с искаженным TOC осуществимо не на всяком оборудовании и порядка 1/3 моделей «писцов» для этих целей непригодны. Узнать, поддерживает ли выбранная вами модель привода режим RAW DAO или нет, можно, в частности, из раздела «Tech support» справки Clone CD, где перечислены характеристики достаточно большого количества всевозможных приводов (впрочем, моих приводов там, увы, нет). Другой путь – «скормить» приводу SCSI/ATAPI команду 46h (GET CONFIGURATION) и посмотреть, что он ответит. Из двух моих «писцов» режим RAW DAO поддерживает один лишь NEC. С определением возможности чтения искаженных сессий дела обстоят на порядок сложнее, ибо данная особенность поведения является исключительно внутренней характеристикой привода и не афишируется ни самим приводом, ни его производителями. Приходится выяснять эту информацию экспериментально. Возьмите диск с чудовищно искаженным TOC (о том, как его создать, рассказано ниже), воткните его в привод и попробуйте прочесть несколько секторов из искаженной сессии. Реакция приводов может быть самой разнообразной. Тот же PHILIPS в зависимости от «настроения» своих электронных цепей то рапортует об ошибке чтения, то возвращает совершенно бессмысленный мусор, в котором не угадывается даже синхропоследовательность, возглавляющая заголовок сырого сектора.

Основной недостаток защитных механизмов с искаженным TOC состоит в том, что некоторые приводы такие диски просто «не видят» и потому не могут их воспроизвести. Легальный пользователь, испытавший несовместимость защиты со своей аппаратурой, в лучшем случае обложит ее разработчика матом и поспешит вернуть диск продавцу… если, конечно, сможет вытащить эту «бяку» из недр CD-ROM, и не факт, что у него получится, поскольку микропроцессорная начинка некоторых приводов при попытке анализа искаженного TOC просто «зависает» и привод полностью абстрагируется от всех раздражителей внешнего мира, не реагируя в том числе и на настойчивые попытки пользователя сделать диску «EJECT». Дырку для аварийного выброса диска, правда, еще никто не отменял[1], но, по слухам, не везде она есть (хотя лично мне приводов без дырки еще не встречалось), а там где есть – зачастую оказывается скрытой за декоративной панелью или – что более вероятно – пользователь может вообще не знать, что это за отверстие такое, для чего оно предназначено и как им, собственно, следует пользоваться. На «Макинтошах» таких дырок нет – это точно (или же «Маковские» пользователи все сплошь идиоты). Во всяком случае, количество судебных исков, поданных последними, в буквальном смысле слова не поддается ни разуму, ни исчислению. Самое интересное, что подавляющее большинство этих исков были удовлетворены и разработчикам пришлось оплатить и «ремонт» аппаратуры, и моральный ущерб, и собственно сами судебные издержки. (Между нами говоря, снятие защиты с дисков, записанных с грубыми нарушениями стандарта, коими, в частности, и являются диски с искаженным TOC, не считается взломом, и не преследуется по закону, поэтому ломайте, ломайте и еще раз ломайте).

Создание защищенного диска  искаженным TOC

Для создания защищенного диска с искаженным TOC нам понадобится: любая программа записи на диск, умеющая создавать многосессионные диски (например, Roxio Easy CD Creator), копировщик защищенных дисков, сохраняющий содержимое TOC в текстовом файле, доступном для редактирования (мы выбираем Clone CD), и, естественно, сам пишущий привод, поддерживающий режим сырой записи в режиме DAO. Для облегчения восприятия материала все действия будут расписаны по шагам, хотя это выглядит и не слишком литературно.

Шаг первый

Достаем из упаковки CD-R болванку или – что даже лучше – засовываем в привод потертый жизнью CD-RW диск  и записываем на него пару сессий в штатном режиме. Будет лучше (вернее, нагляднее), если вторая сессия будет включать в себя файлы первой сессии – той самой сессии, чей TOC мы и собираемся искажать. Интересно, сможет ли привод прочесть ее содержимое или нет?

Шаг второй

Запускаем Clone CD и просим его создать образ оригинального диска (выбираемый профиль настроек на данном этапе некритичен, поскольку диск еще не защищен, то с равным успехом можно использовать как «CD с данными», так и «Protected PC Game»; галочку «создавать Cue-Sheet» взводить необязательно – все равно она действительна лишь на односессионных CD).

Шаг третий

Если все сделано правильно и программно-аппаратное обеспечение во всей своей совокупности работает нормально, на жестком диске должны образоваться три файла: IMAGE.CCD, – несущий в себе содержимое Q-канала подкода Lead-In области или, попросту говоря, TOC; IMAGE.IMG – «сырой» образ диска со всеми секторами от 00:00:02 до «сколько-на-диске-есть-там» и IMAGE.SUB – содержимое полей подкода «программной» части диска. Последний файл в принципе может и отсутствовать (он создается только, если взведена галочка «Чтение субканалов из треков с данными»), но это некритично, т.к. сейчас нас в первую очередь интересуют не каналы подкода, а сам TOC!

Откроем файл IMAGE.CCD в любом текстовом редакторе и попытаемся перевести расклад геометрии диска на человеческий язык.

Листинг 1. Содержимое неискаженного TOC в сыром виде. Обобщенно говоря, диск содержит две секции – по одному треку каждая.

Абсолютный адрес начала первого трека 00:00:02, абсолютный адрес Lead-out-области первой сессии 00:29:33 (адрес последнего

сектора трека на две секунды короче), абсолютный адрес начала второго трека 03:01:33, а абсолютный адрес Lead-out второй

сессии 03:24:33. Максимально достижимая емкость диска 22:14:34 (хотя на самом диске и написано, что он 23-минутный).

 

[CloneCD]               ; данные о Clone CD

Version=3               ; версия Clone CD.

 

[Disc]                  ; данные диска

TocEntries=12           ; количество элементов TOC

Sessions=2              ; количество сессий = 2

DataTracksScrambled=0   ; поле DVD (см. inf-8090), для CD эта информация лишена смысла

CDTextLength=0          ; CD-Text в полях подкода Lead-in-области отсутствует

[Session 1]             ; данные сессии 1

PreGapMode=1            ; тип трека Mode 1 (трек с данными, 2048 байт данных)

PreGapSubC=0            ; данных подканала нет

 

[Session 2]             ; данные сессии 2

PreGapMode=1            ; тип трека Mode 1 (трек с данными, 2048 байт данных)

PreGapSubC=0            ; данных подканала нет

 

[Entry 0]               ; данные элемента TOC №0

Session=1               ; элемент сессии 1

Point=0xa0              ; номер первого трека сессии 1 в PMin/тип диска в PSec

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=1                  ; номер первого трека сессии 1

PSec=0                  ; тип диска CD-DA и CD-ROM-диск в Mode 1

PFrame=0                ; не несет никакой полезной информации

PLBA=4350               ; номер трека, представленный Clone CD как LBA-адрес, т.е. глупость

 

[Entry 1]               ; данные элемента TOC №1

Session=1               ; элемент сессии 1

Point=0xa1              ; номер последнего трека сессии 1 в PMin

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=1                  ; номер последнего трека сессии 1 (в сессии только один трек)

PSec=0                  ; не несет никакой полезной информации

PFrame=0                ; не несет никакой полезной информации

PLBA=4350               ; номер трека, представленный Clone CD как LBA-адрес, т.е. глупость

 

[Entry 2]               ; данные элемента TOC №2

Session=1               ; элемент сессии 1

Point=0xa2              ; положение Lead-out-области в PMin:PSec:PFrame

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный  для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=0                  ; \

PSec=29                 ;  + - абсолютный адрес Lead-out-области сессии 1

PFrame=33               ; /

PLBA=2058               ; LBA-адрес Lead-out-области сессии 1

 

[Entry 3]               ; данные элемента TOC №3

Session=1               ; элемент сессии 1

Point=0x01              ; данные трека 1 сессии 1

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=0                  ; \

PSec=2                  ;  + - абсолютный адрес начала трека 1 сессии 1

PFrame=0                ; /

PLBA=0                  ; LBA-адрес начала трека 1 сессии 1

 

[Entry 4]               ; данные элемента TOC №4

Session=1               ; элемент сессии 1

Point=0xb0              ; позиция следующий записываемой области в AMin:ASec:AFrame

ADR=0x05                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=2                  ; \

ASec=59                 ;  + - абсолютный адрес следующей записываемой области

AFrame=33               ; /

ALBA=13308              ; LBA-адрес следующей записываемой области

Zero=3                  ; кол-во pointer в Mode 5

PMin=22                 ; \

PSec=14                 ;  + - абсолютный адрес максимальной записываемой области

PFrame=34               ; /

PLBA=99934              ; LBA-адрес максимальной записываемой области

 

[Entry 5]               ; данные элемента TOC №5

Session=1               ; элемент сессии 1

Point=0xc0              ; стартовый адрес Lead-in-области Hybrid-диска (если он есть)

ADR=0x05                ; Mode 5 (Оранжевая книга)

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=162                ; рекомендуемая мощность лазера для записи

ASec=128                ; Application code

AFrame=140              ; зарезервировано

ALBA=288590             ; LBA-"адрес" трех предыдущих полей

Zero=0                  ; зарезервировано

PMin=97                 ; \

PSec=27                 ;  + - абсолютный адрес Lead-in-области Hybrid-диска (адрес лежит за пределами диска, т.е. Hybrid-диска нет)

PFrame=21               ; /   

PLBA=-11604             ; LBA-адрес Lead-in-области Hybrid (вычислен с переполнением)

 

[Entry 6]               ; данные элемента TOC №6

Session=1               ; элемент сессии 1

Point=0xc1              ; копия ATIP-информации

ADR=0x05                ; -+

Control=0x04            ; -+

TrackNo=0               ; -+

AMin=4                  ; -+

ASec=120                ; -+

AFrame=96               ; -+

ALBA=26946              ; -+ – ATIP-информация

Zero=0                  ; -+

PMin=0                  ; -+

PSec=0                  ; -+

PFrame=0                ; -+

PLBA=-150               ; -+

 

[Entry 7]               ; данные элемента TOC №7

Session=2               ; элемент сессии 2 (вот мы и добрались до сессии 2!)

Point=0xa0              ; номер первого трека сессии 2 в PMin/тип диска в PSec

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=2                  ; номер первого трека сессии 2 (нумерация треков сквозная!)

PSec=0                  ; тип диска CD-DA и CD-ROM-диск в Mode 1

PFrame=0                ; не несет никакой полезной информации

PLBA=8850               ; номер трека, представленный Clone CD как LBA-адрес, т.е. глупость

 

[Entry 8]               ; данные элемента TOC №8

Session=2               ; элемент сессии 2

Point=0xa1              ; номер последнего трека сессии 2 в PMin

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=2                  ; номер последнего трека сессии 2 (в сессии только один трек)

PSec=0                  ; не несет никакой полезной информации

PFrame=0                ; не несет никакой полезной информации

PLBA=8850               ; номер трека, представленный Clone CD как LBA-адрес, т.е. глупость

 

[Entry 9]               ; данные элемента TOC №9

Session=2               ; элемент сессии 2

Point=0xa2              ; положение Lead-out-области в PMin:PSec:PFrame

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=3                  ; \

PSec=24                 ;  + - абсолютный адрес Lead-out-области сессии 2

PFrame=23               ; /

PLBA=15173              ; LBA-адрес Lead-out-области сессии 2

 

[Entry 10]              ; данные элемента TOC №10

Session=2               ; элемент сессии 2

Point=0x02              ; данные трека 2 сессии 2

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=3                  ; \

PSec=1                  ;  + - абсолютный адрес начала трека 2 сессии 2

PFrame=33               ; /

PLBA=13458              ; LBA-адрес начала трека 2 сессии 2

 

[Entry 11]              ; данные элемента TOC №11

Session=2               ; элемент сессии 2

Point=0xb0              ; адрес следующей записываемой области в AMin:ASec:AFrame

ADR=0x05                ; Mode 5

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=4                  ; \

ASec=54                 ;  + - абсолютный адрес следующей записываемой области

AFrame=23               ; /

ALBA=21923              ; LBA-адрес следующей записываемой области

Zero=1                  ; количество pointer Mode 5

PMin=22                 ; \

PSec=14                 ;  + - абсолютный адрес последней возможной Lead-out-области (на самом диске написано 23 мин.,

это ж как надо округлять 22:14:34)

PFrame=34               ; /

PLBA=99934              ; LBA-адрес последней возможной Lead-out-области

 

[TRACK 1]               ; данные трека 1

MODE=1                  ; режим Mode 1

INDEX 1=0               ; post-gap?

 

[TRACK 2]               ; данные трека 2

MODE=1                  ; режим Mode 1

INDEX 1=0               ; post-gap?

Давайте теперь немного поиздеваемся над TOC и увеличим стартовый адрес первого трека так, чтобы он вышел далеко за пределы первой сессии и попал… ну, собственно, куда нибудь он все равно попадет. Чтобы быстро отыскать соответствующую ему запись, воспользуемся контекстным поиском. Жмем <F7> и вводим «point=0x1»:

Листинг 2. Атрибуты трека 1.

 

[Entry 3]        ; данные элемента TOC №3

Session=1        ; элемент сессии 1

Point=0x01       ; данные трека 1 сессии 1

ADR=0x01         ; q-Mode == 1

Control=0x04     ; диск с данными, запрещенный для копирования

TrackNo=0        ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0           ; \

ASec=0           ;  + - абсолютный адрес текущего трека

AFrame=0         ; /

ALBA=-150        ; LBA-адрес текущего трека

Zero=0           ; это поле должно быть равно нулю, как оно и есть

PMin=0           ; \

PSec=2           ;  + - абсолютный адрес начала трека 1 сессии 1

PFrame=0         ; /

PLBA=0           ; LBA-адрес начала трека 1 сессии 1

Как мы видим, здесь присутствует как абсолютный, измеряемый в минутах, секундах, фреймах, так и LBA-адрес трека, представляющий собой не что иное, как порядковый номер сектора, считая от нуля. На самом деле, LBA-адрес – это «отсебятина», добавляемая в файл самим Clone CD, и в TOC LBA-адрес не хранится. Судя по всему, Clone CD вычисляет LBA-адрес исходя из соображений удобства (работать с LBA-адресацией действительно намного комфортнее). Однако при внесении каких-либо изменений в CCD-файл за согласованием обоих типов адресов нам придется следить самостоятельно. Для перевода абсолютных адресов в LBA можно воспользоваться следующей формулой:

Logical Sector Address=(((Minute*60)+Seconds)*75+Frame)–150

Ниже представлен вид атрибутов трека 1 до и после искажения:

Листинг 3. Атрибуты трека 1 до искажений (слева) и после искажения (справа). 

 

[Entry 3]                             [Entry 3]

Session=1                             Session=1

Point=0x01                            Point=0x01

ADR=0x01                              ADR=0x01

Control=0x04                          Control=0x04

TrackNo=0                             TrackNo=0

AMin=0                                AMin=0

ASec=0                                ASec=0

AFrame=0                              AFrame=0

ALBA=-150                             ALBA=-150

Zero=0                                Zero=0

PMin=0                  -->          PMin=10

PSec=2                  -->          PSec=2

PFrame=0                -->          PFrame=0

PLBA=0                  -->          PLBA=-1

На самом деле, коварный автор схитрил и вместо вычислений LBA-адреса сослался на тот факт, что его версия Clone CD всегда использует абсолютные адреса, а LBA игнорирует.

Выбор абсолютного адреса первого трека произвольный, но осуществленный с таким расчетом, чтобы искаженный адрес гарантированно вылетал за границы первой сессии, Lead-out-область которой находится по адресу 00:29:33 (см. элемент TOC №2).

Шаг четвертый

Теперь смонтируем искаженный образ диска на виртуальный привод, создаваемый программой Alcohol 120%, и посмотрим, что из этого получилось. Конечно, нет никакой уверенности в том, что виртуальный привод поведет себя как настоящий, но ведь и настоящие приводы на искаженных дисках ведут себя по-разному! Поэтому использовать Alcohol в качестве рабочего «макетника» вполне допустимо, тем более что это экономит уйму времени и болванок, ведь монтирование виртуального диска в отличие от «прожига» болванки осуществляется мгновенно, если, конечно, оно вообще осуществляется… Вплоть до версии 1.4.3 включительно – самой свежей версии на момент написания этих строк – Alcohol органически не переваривал искаженные образы дисков и отказывался их монтировать, апеллируя к недоступности образа файла: «Unable to mount image. File not accessible». Судя по всему, Alcohol понимает искаженный TOC слишком буквально, пытаясь отыскать в файле-образе то, чего там заведомо нет (трека, начинающегося с адреса 10:02:00 и заканчивающегося адресом 00:29:33 там нет точно!).

Какая жалость! Возможность монтирования дисковых образов с искаженным TOC позволила бы нам преодолевать защиту от копирования на любых пишущих приводах, а не только на тех, что поддерживают режим RAW DAO, – просто сбрасываем образ защищенного диска на болванку в виде обыкновенного файла и динамически монтируем его Alcohol по мере необходимости. Выходит, что на проверку Alcohol оказывается гораздо менее крут, чем это кажется!

Шаг пятый

В порядке эксперимента попробуем «прожечь» искаженный образ в режиме RAW SAO, в котором, как уже было сказано выше, корректная запись сессий с искаженным TOC невозможна. Для гарантированного исключения возможных побочных эффектов желательно использовать привод, не поддерживающий RAW DAO чисто физически (ну мало ли, вдруг копировщик в плане проявления чудес искусственного интеллекта автоматически перейдет на более подходящий режим записи, игнорируя наши установки).

Мастер записи образов копировщика Alcohol 120% выдает следующую информацию о записываемом образе:

Листинг 4. Сводная информация по записываемому образу, выдаваемая Alcohol. Обратите внимание на размеры и адрес первого трека

первой сессии (они выделены другим цветом).

 

Тип:       Файл-образ Clone CD

Путь:      L:\

Имя:       Image.ccd

           Image.img

           Image.sub

Размер:    8.81 MB

Сессий:    2

Треков:    2

 

Сессия 01:

  Трек 01: Mode 1, Длина: -42942(8191.92 GB), Адрес: 045000

Сессия 02:

  Трек 02: Mode 1, Длина: 001715(3.3 MB), Адрес: 013458

Вот это номер! Если верить Alcohol, то длина первого трека составляет целых 8 Тб. Этот чудовищный объем не то что на CD на DVD-диск не влезет! На самом деле, длина треков в TOC нигде явным образом не хранится, но вычисляется как разница стартовых адресов двух смежных треков (если же сессия содержит всего один трек, в ход идет адрес Lead-out-области, примыкающий к треку). Искажение стартового адреса первого трека привело к тому, что разница стартовых адресов Lead-out-области и этого самого трека стала отрицательной. Действительно, 00:29:33 – 10:02:00 = 2058 – 45000 = – 42942, а если вспомнить, что LBA-адреса по стандарту выражаются 32-разрядными неотрицательными числами, становится понятно, как Alcohol получил такой неестественно огромный объем (отрицательные числа – это такие числа, чей старший бит взведен, отсюда – маленькое отрицательное число – это очень большое положительное). Расчеты показывают, что заявленное Alcohol значение в 8 Тб достигается лишь при использовании 43-битных переменных. Вот это да! Alcohol спроектирован с запасом на будущее (а в будущем нас, как известно, ждут диски с объемами от 30 и более гигабайт, для адресации которых 32 бит оказывается уже недостаточно, плюс еще необходимо учесть резерв, предназначенный для «отлова» отрицательных длин, образовавшихся в результате жестоких извращений с TOC, ведь Alcohol – это защищенный копировщик!)

И вот наступает волнующий момент – момент заливки искаженного образа на CD-R/CD-RW-диск (внимание! используя CD-RW-диск, вы должны отдавать себе отчет в том, что можете его безвозвратно потерять! Если ваш единственный пишущий привод откажется опознавать такой диск, очистка последнего окажется невозможной!). Благополучно проглотив искаженный образ, Alcohol, безо всяких препирательств со своей стороны зажигает огонек индикации записи (если, конечно, на вашем приводе он есть) и приступает к делу. Проходит минута, другая… а индикатор прогресса по-прежнему остается на нуле. К исходу шестой минуты, когда пишущая головка достигает кромки диска, процесс записи аварийно прерывается приводом и Alcohol, издав грустное «бэмс», сигнализирует об аппаратной ошибке.

Просмотр «недорезанного» диска на приводах ASUS и NEC обнаруживает лишь первую сессию, а от второй не видно и следа. С приводом PHILIPS дела обстоят еще хуже – он вообще отказывается признавать засунутую в него штуку лазерным диском, и после непродолжительного скрежета своих механических внутренностей, сопровождаемых натужными завываниями перебирающего различные скорости мотора, индикатор «DISC IN» прощально гаснет. «Прощально» в том смысле, что с испорченной болванкой вам придется расстаться. Конечно, если это всего лишь дешевый CD-R, то туда ему и дорога, но потерять CD-RW жалко. К счастью, на NEC очистка диска протекает успешно, и, воодушевленные этим обстоятельством, мы продолжаем свои издевательства вновь.

Копировщик Clone CD ведет себя в этом отношении иначе. Во-первых, он оценивает длину искаженного трека в 4 294 868 664 Кб (см. листинг, приведенный ниже), что указывает на использование 32-разрядных переменных и вытекающую отсюда невозможность отличать положительные длины от отрицательных.

Листинг 5. Сводная информация по записываемому образу, выдаваемая Clone CD. Обратите внимание на размер первого трека первой сессии

(он выделен другим цветом).

 

ИНФОРМАЦИЯ О ФАЙЛЕ-ОБРАЗЕ:

 

Число сессий: 2

Занято на диске: 34850 Кбайт

Секторов: 15173

Время: 03:22:23 (мин:сек:кадр)

 

ИНФОРМАЦИЯ О СЕССИИ 1:

 

Размер сессии: 4726 Кбайт

Число треков: 1

Pregap: Данные Mode 1, размер: 103359 Кбайт

Track 1: Данные Mode 1, размер: 4294868664 Кбайт

 

ИНФОРМАЦИЯ О СЕССИИ 2:

 

Размер сессии: 3939 Кбайт

Число треков: 1

Track 2: Данные Mode 1, размер: 3939 Кбайт

Во-вторых, обнаружив, что запись искаженного TOC на данном приводе невозможна, Clone CD корректирует TOC так, чтобы его облик принял человеческий вид. В результате процесс «прожига» протекает без каких-либо ошибок и мы получаем как будто бы работоспособный диск. Стартовый адрес первого трека начинается там, где кончается Lead-in-область первой сессии (точнее, pre-gap первого трека начинается там, где кончается post-gap Lead-in-области первой сессии, но это уже детали). Такой диск нормально читается в любом приводе CD-ROM, но! Если защитный механизм прочитает содержимое TOC, он легко обнаружит, что имеет дело с копией, но не с оригиналом. Спрашивается: и на кой черт нам такое копирование нужно?! Хоть бы предупреждение было какое… Ладно, профессионалы запросто определят, в чем подвох, но в каком положении окажутся новички, и/или просто квалифицированные пользователи, использующие Clone CD для своих нужд? В общем мрак, одним словом…

Правда, в режиме RAW DAO нарезка искаженного образа протекает отлично и Clone CD не вносит в TOC никакой отсебятины, благодаря чему у нас образуется действительно защищенный CD, который мы сейчас и будем ломать.

Шаг шестой

Просмотр защищенного диска под приводом NEC показывает все файлы, даже те, что принадлежат первому треку – тому самому треку, чей стартовый адрес жестоко искажен. Двойной щелчок мышью доказывает, что файлы не только присутствуют в каталоге, но и успешно открываются ассоциированным с ними приложениям и, судя по всему, выглядят вполне нормальными. Нашу душу начинают грызть смутные сомнения: действительно ли пишущий привод записал стартовый адрес первого трека таким, каким мы просили, или молчаливо исправил его на лету?

Для ответа на этот вопрос мы должны исследовать геометрию диска, т.е., попросту говоря, прочитать TOC. Запускаем уже полюбившийся нам Roxio Easy CD Creator и в меню «CD» находим пункт «CD Information». Щелкаем по нему мышкой, и на экран тут же выпрыгивает диалоговое окно с раскладкой диска (внимание! не все программы способны «переваривать» искаженный TOC! Easy CD Creator это умеет, а вот, например, Record NOW! – нет. В отсутствии подходящей утилиты вы можете воспользоваться программой raw.TOC.exe, поставляемой вместе с этой книгой).

Как и следовало ожидать, стартовый адрес первого трека лежит далеко за пределами своей «родной» сессии, и его длина, будучи выраженная положительным числом, значительно превышает доступную емкость диска (см. рис. ниже). Так что все наши волнения абсолютно безосновательны!

Рисунок 1. Отрицательная длина первого трека сводит штатный копировщик с ума

Постойте, но как же тогда осуществляется доступ к содержимому первого трека? А кто вам вообще сказал, что лазерный диск адресуется по трекам?! Основной адресацией лазерного диска с данными является сектор. Абсолютный же адрес всякого сектора однозначно определяется принадлежащим ему Q-каналом подкода (с учетом несовпадения границ секций и секторов максимально возможное расхождение, допускаемое стандартом, составляет 1 сек, т.е. 75 секторов, поэтому этот способ используется лишь для грубого позиционирования оптической головки). Точная наводка на цель выполняется непосредственно по самому секторному заголовку, в явном виде содержащему его абсолютный адрес. Номера треков в процессе обработки сектора вообще не участвуют, вернее могут и не участвовать… Но могут ведь и участвовать! Все зависит от электронной начинки привода и его микропрограммной прошивки. Как именно они в этом участвуют – сие есть великая тайна разработчиков привода, и простым смертным ее понять не дано. Но так или иначе, встретив некорректный TOC, некоторые приводы запутываются, и в стройных битовых рядах возникает настоящая сумятица.

Результаты тестирования трех моих приводов следующие: NEC, как уже говорилось выше, показывает содержимое обоих секций, корректно обрабатывая их содержимое. ASUS показывает только первую – искаженную – сессию и в упор не видит вторую, делая ее недоступной даже на секторном уровне. Зато файлы первой сессии обрабатываются вполне корректно. PHILIPS, напротив, видит обе сессии, но корректно обрабатывает файлы лишь последней из них (т.е. той, что не искажена). Искаженная сессия доступна на секторном уровне, но нестабильно. Иногда без всяких видимых причин PHILIPS и возвращает лишенный всякого смысла мусор.

Мораль: защитные механизмы, базирующиеся на искаженном TOC, не могут закладываться ни на одну из сессий. Поэтому обе сессии должны дублировать содержимое друг друга – авось хоть одну из них привод пользователя да прочтет. Какой же тогда в этой защите смысл? А вот какой – пускай защита не может без риска для жизни привязаться к сессиям, она может привязаться к сырому содержимому TOC. О том, как осуществить такую привязку на практике, мы поговорим чуточку позднее, а пока попробуем скопировать защищенный диск нашими фаворитами – Clone CD и Alcohol 120%.

Автоматическое копирование и обсуждение его результатов

В какой бы привод защищенный диск ни был вставлен, Clone CD выдает неизменно постоянный результат, не имеющий ничего общего с реальной действительностью. По его скромному мнению, диск содержит всего одну сессию с общей протяженностью в 4,6 Мб, но зато размер единственного трека последней составляет ни много ни мало – 3,9 Тб!

Листинг 6. Таким видит защищенный диск копировщик Clone CD. Обратите внимание, что он распознал лишь одну сессию из двух (первую),

да и то неправильно.

 

ИНФОРМАЦИЯ О CD В ДИСКОВОДЕ:

Число сессий: 1

Занято на диске: 4726 Кбайт

Секторов: 2058

Время: 00:27:33 (мин:сек:кадр)

 

ИНФОРМАЦИЯ О СЕССИИ 1:

 

Размер сессии: 4726 Кбайт

Число треков: 1

Pregap: Данные Mode 1, размер: 103359 Кбайт

Track 1: Data, размер: 4294868664 Кбайт

Еще до завершения процесса копирования нас начинают одолевать стойкие сомнения или, я бы даже сказал, непоколебимая уверенность в том, что диск будет скопирован неправильно. И действительно, чего мы опасались, то мы и получили! Давайте создадим образ скопированного диска в плане сравнения копии TOC с оригиналом.

Листинг 7. Образ защищенного диска, снятый программой Clone CD (несоответствующие поля выделены другим цветом).

 

[CloneCD]               ; данные о копировщике

Version=3               ; версия Clone CD

 

[Disc]                  ; данные о диске

TocEntries=7            ; количество элементов TOC = 7 (в оригинале было 12)

Sessions=1              ; кол-во сессий = 1 (в оригинале было 2)

DataTracksScrambled=0   ; поле DVD

CDTextLength=0          ; CD-Text в полях подкода Lead-in-области отсутствует

 

[Session 1]             ; данные сессии 1

PreGapMode=1            ; тип трека == Mode 1

PreGapSubC=0            ; данных подканала – нет

 

[Entry 0]               ; данные элемента TOC №0

Session=1               ; элемент сессии 1

Point=0xa0              ; номер первого трека сессии 1 в PMin/тип диска в PSec

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=1                  ; номер первого трека сессии 1

PSec=0                  ; тип диска CD-DA и CD-ROM-диск в Mode 1

PFrame=0                ; не несет никакой полезной информации

PLBA=4350               ; номер трека, представленный Clone CD как LBA-адрес, т.е. глупость

 

[Entry 1]               ; данные элемента TOC №1

Session=1               ; элемент сессии 1

Point=0xa1              ; номер последнего трека сессии 1 в PMin

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=1                  ; номер последнего трека сессии 1 (в сессии только один трек)

PSec=0                  ; не несет никакой полезной информации

PFrame=0                ; не несет никакой полезной информации

PLBA=4350               ; номер трека, представленный Clone CD как LBA-адрес, т.е. глупость

 

[Entry 2]               ; данные элемента TOC №2

Session=1               ; элемент сессии 1

Point=0xa2              ; положение Lead-out-области в PMin:PSec:PFrame

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=0                  ; \

PSec=29                 ;  + - абсолютный адрес Lead-out-области сессии 1

PFrame=33               ; /

PLBA=2058               ; LBA-адрес Lead-out-области сессии 1

 

[Entry 3]         ; данные элемента TOC №3

Session=1               ; элемент сессии 1

Point=0x01              ; данные трека 1 сессии 1

ADR=0x01                ; q-Mode == 1

Control=0x04            ; диск с данными, запрещенный для копирования

TrackNo=0               ; трек, который мы сейчас читаем, – это Lead-in-трек (т.е. TOC)

AMin=0                  ; \

ASec=0                  ;  + - абсолютный адрес текущего трека

AFrame=0                ; /

ALBA=-150               ; LBA-адрес текущего трека

Zero=0                  ; это поле должно быть равно нулю, как оно и есть

PMin=10                 ; \

PSec=2                  ;  + - абсолютный адрес начала трека 1 сессии 1

PFrame=0                ; /

PLBA=45000              ; LBA-адрес начала трека 1 сессии 1

 

[Entry 4]               ; данные элемента TOC №4

Session=1               ; элемент сессии 1

Point=0xb0              ; позиция следующей записываемой области в AMin:ASec:AFrame

ADR=0x05                ; q-Mode == 1

Control=0x04            ; диск с данн