CD4USER - CD-R / CD-RW и DVD технологии для пользователя - это вся правда о CD-R, CD-RW и DVD технологих глазами простого юзера! Запись, перезапись, копирование и восстановление дисков, свежие программы и драйвера, тесты приводов и расходных материалов, FAQ (вопросы и ответы), статьи и ссылки на полезные ресурсы - в общем все, что нужно пользователю CD и DVD!...
»»»
Все материалы, опубликованные на данном сайте, предназначены исключительно для образовательных и ознакомительных целей...
Если автор статьи не указан (или указан не верно) - свяжитесь со мной для разрешения этого вопроса по e-mail
Мы уважаем Закон и авторские права!
Искажение TOC как средство борьбы с несанкционированным копированием диска
( Часть 3 )
Автоматическое копирование и обсуждение его результатов
В какой бы привод защищенный диск ни был вставлен, 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-трек
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-трек
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 ; диск с данными, запрещенный для копирования
TrackNo=0 ; трек, который мы сейчас читаем, – это Lead-in-трек
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-трек
AMin=162 ; рекомендуемая мощность лазера для
ASec=200 ; Application code (в оригинале здесь было 128)
AFrame=224 ; в оригинале здесь было 140
ALBA=294074 ; 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=192 ; -+
AFrame=150 ; -+- ATIP (изменена!)
ALBA=32400 ; -+
Zero=0 ; -+
PMin=0 ; -+
PSec=0 ; -+
PFrame=0 ; -+
PLBA=-150
[TRACK 1]
MODE=0
INDEX 1=45000
Сокращение сессий с двух до одной очень сильно смущает. Куда девалась вторая – неискаженная(!) сессия, вообще непонятно. И, хотя искаженные данные первого трека сохранились, оказались неожиданно измененными поля Application Code и ATIP (и это несмотря на то, что запись производилась на ту же самую CD-RW-болванку, что и раньше, хотя ее «прожиг» осуществлялся различными приводами).
Как следствие: скопированный диск оказывается работоспособен не на всех приводах (ASUS и NEC его прочитают, а вот PHILIPS – нет), к тому же защите ничего не стоит прочитать текущий TOC и сравнить его с эталонным.
Короче говоря, «факир был пьян, и фокус не удался». Что ж, попробуем обратиться за помощью к Alcohol– уж он-то должен наверняка с этим справиться. Действительно, Alcohol видит обе сессии: как искаженную, так и неискаженную, однако по малопонятным причинам сохраняет в образ лишь вторую из них (Clone CD сохранял первую). Ну что это за зоопарк, а? Содержимое TOC скопированного диска можно даже и не сравнивать – там будет далеко не то, что защита собирается ожидать. И напрасно! Содержимое TOC, снятое Alcohol, практически полностью соответствует оригиналу. Единственно, в чем ошибся Alcohol, – определил тип pre-gap обоих треков не как Mode 1, но как Mode 2. Впрочем, в силу отсутствия в образе первой сессии полученная с его помощью копия диска все равно оказывается неработоспособной.
Рисунок 2. Alcohol видит обе сессии защищенного диска, но...
Рисунок 3. Копирует лишь вторую из них, а первую нагло пропускает!
А ведь заявлялось, что Clone CD/Alcohol 120% способны копировать любые существующие на сегодняшний момент защищенные диски, и вдруг на поверку оказывается, что даже такую простую защиту, которую может создать на кончике пенька любой программист, они преодолеть ни вместе, ни по раздельности не в состоянии! Причем аппаратура, на которой все эти эксперименты и осуществлялись, возможность корректного копирования искаженного диска гарантированно поддерживает (сам проверял), и потому отмахнуться физическими ограничениями приводов разработчикам обоих копировщиков уже не удастся!
Даже не верится, что такой простой прием «ослепляет» лучших копировщиков защищенных дисков! Неужели и вправду создание некопируемых дисков вполне осуществимо на обыкновенном бытовом оборудовании?! Да! Именно так! Конечно, не стоит путать некопируемость диска автоматическими копировщиками с принципиальной невозможностью получения его идентичной копии. В ручном режиме копирование таких дисков вполне осуществимо (правда, при условии, что ваш пишущий привод поддерживает режим RAW DAO, а читающий – читает сектора из обоих секций), и сейчас мы продемонстрируем как.
Так как же все-таки скопировать такой диск?
Конечно, с помощью «Добермана Пинчера» (или любого другого блочного копировщика файлов), HIEW, двух образов защищенного диска (один – с первой сессией – от Clone CD, другой – со второй сессией – от Alcohol) мы можем воссоздать идентичную копию оригинального диска путем их совокупного объединения, но… это будет как-то не по-хакерски, да и вообще некрасиво.
Чтобы не писать свою собственную программу «прожига» диска, ограничимся использованием Clone CD. При условии, что подсунутый ему образ диска запечатлен правильно, Clone CD обычно справляется с прожигом «на ура». Итак, у нас есть более и менее верный файл image.ccd, содержащий TOC, но недостает файла образа image.img. Попробуем его получить? Будем отталкиваться от того, что LBA-адреса всех секторов диска пронумерованы последовательно, включая области, занятые Lead-In/Lead-Out и прочим служебным барахлом. Разумеется, непосредственное чтение служебных областей диска на секторном уровне невозможно, но… именно на этом мы и собираемся сыграть! Последовательно читая диск с первого по последний сектор, мы обнаружим, что сектора с LBA-адресами с 0 по 2055 сектор включительно читаются без каких-либо проблем, после чего наступает сумеречная зона нечитающихся секторов, протянувшаяся вплоть до сектора 13307. Здесь сектора либо совсем не читаются либо возвращаются в сильно мутированном виде, легко опознаваемые по отсутствию правильной синхропоследовательности в их заголовке. Наконец, с адреса 13308 чтение вновь продолжается без каких-либо проблем.
Судя по всему мы имеем дело с двухсессионным диском и сумеречная зона между сессиями есть ни что иное, как Lead-Out/Lead-In. Накинув два сектора на post-gap (при условии, что он записан с соблюдением стандарта), получаем, что LBA-адрес последнего значимого сектора первой сессии составляет 2057 или, в пересчете на абсолютные единицы – 00 минут, 29 секунд и еще 32 фрейма. Соответственно, LBA-адрес первого сектора второй сессии равен 13308 + 150 (pre-gap) == 13458, или 3 минуты, 1 секунда, 33 фрейма. Конечно, если исследуемый диск содержит большое количество ошибок, то его анализ значительно усложняется, т.к. физические дефекты на секторном уровне могут выглядеть точно так же, как Lead-In/Lead-Out-области, конечно, при том условии, что дефективные области имеют соответствующую протяженность, – а это вряд ли.
Отбросив сектора, расположенные в зонах pre- и post-gap (т.е. 150 секторов от конца первой читаемой области и ровно столько же от начала следующей), мы должны объединить их в один файл, используя для этой цели любой файловый копировщик (например, штатную команду MS-DOS copy file_1 /b + file_2 image.img). Остается прочитать сырой TOC SCSI/ATAPI командой READ TOC (opcode: 43h, format: 2h) и записать его в image.ccd файл в соответствии с синтаксисом Clone CD. Как альтернативный вариант – можно воспользоваться ccd-файлом, сформированным программой Alcohol, предварительно скорректировав pre-gap Mode (как уже сказано выше, Alcohol определил его неправильно, перепутав Mode 1 с Mode 2). Согласно стандарту режим сектора задается пятнадцатым, считая от нуля, байтом его заголовка. Если этот байт равен одному (что, собственно, и наблюдается в нашем случае), то и Mode сектора будет 1, но не 2.
При условии, что все сделано правильно, после записи собственноручно сформированного образа диска мы получаем практически идентичный оригинал. Просто? Да проще простого! И написать автоматический копировщик, автоматизирующий наш труд, можно буквально за несколько часов! Если чтение «сырых» секторов с диска представляет для вас проблему, воспользуйтесь исходными текстами утилит ASPI32.raw/SPTI.raw, как раз такое чтение и осуществляющих.
Так что искажение TOC – не очень-то надежный прием защиты от копирования, как ни крути. Правда, от обычных пользователей, вооруженных Clone CD/Alcohol, он все-таки спасает, а больше от защиты зачастую и не требуется.
Пример реализации защиты на программном уровне.
Покажем теперь, как такая защита может быть реализована на программном уровне. Самое простое, что можно сделать, – отправить приводу команду «сырого» чтения TOC (opcode: 43h, format: 2h) и сравнить возращенный ею результат с эталоном. Какие именно поля TOC защита будет проверять, – это ее личное дело. По минимуму достаточно проверить количество сессий и стартовый адрес искаженного трека. По максимуму можно контролировать весь TOC целиком. Естественно, от побайтового сравнения контролируемого TOC с оригиналом настоятельно рекомендуется воздержаться, т.к. это неявно закладывает защиту на особенности микропрограммной прошивки читающего привода. Стандарт ничего не говорит о том, в каком порядке должно возвращаться содержимое TOC, и потому его бинарное представление может варьироваться от привода к приводу. Грамотно спроектированная защита должна анализировать только те поля, к содержимому которых она привязывается явно.
Демонстрационный пример, приведенный ниже, как раз и иллюстрирует технику корректной привязки к TOC. Разумеется, явная проверка целости TOC может быть элементарно обнаружена хакером и выкинута из программы как ненужная, поэтому не стоит копировать этот демонстрационный пример один к одному в свои программы. Лучше используйте значения полей TOC как рабочие константы, жизненно необходимые для нормальной работоспособности программы, – в этом случае сличение паспортов с лицами будет не столь наглядным. Естесственно, явная проверка оригинальности диска все равно обязана быть, но ее основная цель отнюдь не защитить программу от взлома, а довести до сведения пользователя, что проверяемый диск с точки зрения защиты не является лицензионным.
Листинг 8. Демонстрационный пример простейшей защиты, привязывающейся к искаженному TOC и не позволяющей себя копировать.
/*--------------------------------------------------------
*
* crack me 9822C095h
* ==================
*
* демонстрация техники привязки к искаженному TOC;
* для работе программе требуется лазерный диск, прожженный
* соответствующим образом
---------------------------------------------------------*/
#include
#include
#include "CD.h"
#include "SPTI.h"
#include "ASPI32.h"
// параметры защищенного диска, которые мы будем проверять
//------------------------------------------------------–
#define _N_SESSION 2 // количество сессий
#define _TRACK 1 // номер проверяемого трека
#define _TRACK_LBA 0x6B124 // стартовый LBA-адрес трека _TRACK
// параметры программы
//--------------------
#define MAX_TRY 3 // максимальное количество попыток чтения TOC
#define TRY_DELAY 100 // задержка между попытками
#define MAX_TOC_SIZE (2352) // максимальный размер TOC
main(int argc, char **argv)
{
// основные переменные
long a, real_len, try = 1;
// сюда будет читаться TOC
unsigned char TOC[MAX_TOC_SIZE];
// SCSI CDB-блок для SCSI/ATAPI-устройств
unsigned char CDB[ATAPI_CDB_SIZE];
// TITLE
fprintf(stderr,"crackme 9822C095 by Kris Kaspersky\n");
if (argc <2)
{
fprintf(stderr,"USAGE:crackme.9822C095h.exe drive\n");
fprintf(stderr,"\tdrive - \\\\.\\X: or Trg.Lun\n");
return -1;
}
// инициализация буферов
memset(CDB, 0, ATAPI_CDB_SIZE); memset(TOC, 0, MAX_TOC_SIZE);
// готовим CDB-блок
CDB[0] = 0x43; // READ TOC
CDB[2] = 0x2; // RAW TOC
CDB[6] = 0; // номер первой сессии
CDB[7] = HIBYTE(MAX_TOC_SIZE); // размер...
CDB[8] = LOBYTE(MAX_TOC_SIZE); // ...буфера
// читаем TOC
while(1)
{
// посылаем CDB-блок SCSI/ATAPI-устройству
a = SEND_SCSI_CMD(argv[1], CDB, ATAPI_CDB_SIZE, NO_SENSE, TOC, MAX_TOC_SIZE, SCSI_DATA_IN);
// TOC успешно прочитан, рвем когти
if (a == SCSI_OK) break;
// произошла ошибка. Возможно привод не готов?
// выдерживаем паузу
Sleep(TRY_DELAY);
// максимальное количество попыток уже вышло?
if (try++ == MAX_TRY)
{ fprintf(stderr,"-ERR: can not read TOC\x7\n"); return -1;}
}
// TOC прочитан, приступаем к его анализу
//---------------------------------------
// проверка количества сессий
if ((TOC[3] - TOC[2]) != (_N_SESSION-1))
{fprintf(stderr, "-ERR: not original CD\n");return -1;}
// проверка стартового LBA-адреса трека _TRACK
//--------------------------------------------
// определение реальной длины TOC
real_len = TOC[0]*0x100L+TOC[1];
// перебор всех entry
for (a = 4; a < real_len; a+=11)
{
// это наш трек?
if (TOC[a+3] == _TRACK)
if ((((TOC[a + 4]*60L) + TOC[a + 5])*75L) + TOC[a + 6] != _TRACK_LBA)
{fprintf(stderr, "-ERR: not original LBA\n"); return -1;}
else
break;
}
// это оригинальный диск!
printf("Hello, original CD\n");
}
Предлагаемая защита не копируется Clone CD (т.к. он создает всего одну сессию вместо ожидаемых двух), но легко обходится Alcohol, который хоть и помещает на место первой секции непотребный мусор, зато вполне корректно воссоздает оригинальный TOC.
Для усиления защиты мы можем попытаться не только проверять обе сессии на существование, но и контролировать целостность их содержимого. Разумеется, не обязательно перелопачивать каждую из секций целиком. Достаточно выбрать несколько ключевых секторов, желательно имеющих по возможности уникальное содержимое. Постойте! – воскликнет внимательный читатель. Разве автор не предостерегал нас о последствиях такой проверки?! Ведь никто не может гарантировать, что на оборудовании пользователя эти сектора вообще прочтутся! Что ж, отвечу я. Закладываться на читабельность секторов действительно категорически не рекомендуется, но вот контролировать успешно просчитавшиеся сектора можно и нужно! То есть: если ключевые сектора не читаются, то все ок и нет никаких поводов считать диск нелицензионным – это просто у конечного пользователя оборудование такое (в смысле кривое). Другое дело, если чтение секторов прошло без ошибок, но вместо ключевых данных в них оказалось нечто совсем иное. Вот тогда, действительно, проблема не в оборудовании, а в диске.
Усиленный вариант защиты уже не копируется Alcohol (т.к. вместо оригинального содержимого первой сессии Alcohol помещает на диск какой-то дикий мусор), но может быть скопирован вручную по методике, описанной выше. К тому же, привязка к искаженному TOC элементарно отламывается в отладчике/дизассемблере. Так что дальнейшее совершенствование защиты практически полностью бессмысленно. От «простых смертных» пользователей мы уже защитились, а от хакеров мы не сумеем защититься все равно (во всяком случае, не этим способом). В любом случае более продвинутые защиты – тема отдельного разговора.
Условные обозначения:
Под приводом NEC понимается _NEC CD-RW NR-9100A; firmware version 1.4.
Под приводом ASUS понимается ASUS CD-S500/A; firmware version 1.4K.
Под приводом PHILIPS понимается PHILIPS CDRW2412A; firmware version P1.55.
Alcohol 120% – отличный копировщик защищенных дисков, условно-бесплатную версию которого можно утянуть с сайта http://www.alcohol-soft.com/. Автоматически ломает более половины всех существующих типов защит от копирования и позволяет динамически монтировать образы защищенных дисков на виртуальный привод CD-ROM, что очень удобно для экспериментов. К сожалению, монтированию подлежат лишь «правильные» образы, коими большинство образов защищенных дисков отнюдь не являются.
Clone CD – хороший копировщик защищенных дисков, условно-бесплатную версию которого можно утянуть по следующему адресу: http://www.elby.ch/. С копированием защищенных дисков в полностью автоматическом режиме Clone CD справляется скорее плохо, чем хорошо, однако после ручного шаманства с настройками и непосредственно самим образом защищенного диска он может скопировать добрую половину существующих типов защит. Утверждение о том, что Clone CD «берет» практически все существующие защиты от копирования, – ложное и невероятно далеко от действительности.
Глоссарий к статье:
Lead-In Area – вводная область диска. Служебная область диска, по сути своей представляющая нулевой трек, всегда предшествующий первому треку PA. Каждая сессия многосессионного диска имеет собственную вводную область. Размер вводной области по стандарту составляет 9 мегабайт (60 секунд, или 4500 секторов). Q-канал подкода вводной сессии содержит TOC, среди прочей полезной информации, указывающей либо на адрес выводной области (закрытый диск), либо на адрес вводной области следующей сессии (открытый диск). Содержимое вводной области недоступно для чтения на программном уровне. Визуально вводная область выглядит равномерно освещенным блестящим кольцом.
Lead-Out Area – выводная область диска. Служебная область диска, условно обозначаемая треком номер AAh и замыкающая собой всякую закрытую сессию. Выводная область служит своеобразным индикатором конца сессии и/или диска и помогает оптической головке не вылететь за пределы диска. Пишущие приводы должны корректно обрабатывать диски с незакрытыми сессиями, однако обыкновенные приводы CD-ROM и аудиопроигрыватели это делать не обязаны. Внимание! Отсутствие выводной сессии (равно как и некорректное задание ее адреса) может повредить некоторые модели приводов (один из них PHILIPS).
Емкость выводной области односессионного диска по стандарту составляет 13,5 Mб (6750 секторов или 1,5 минуты). Емкость выводных областей для второй и последующих сессий многосессионных дисков уменьшена до 4 Мб (0,5 минуты, или 2250 секторов). Содержимое выводной области недоступно на программном уровне. Визуально выводная область выглядит равномерно освещенным блестящим кольцом.
Program Area – программная область. Область диска, расположенная между Lead-In- и Lead-Out-областями и содержащая информационные треки с музыкой или данными. Это – основная область диска, целиком доступная на секторном уровне с паузами между аудиотреками включительно.
TOC – (Table Of Content) – таблица содержимого или попросту оглавление диска. Служебная область диска, записанная в Q-канале подкода вводной области диска, также называемой Lead-In-областью (такое блестящее кольцо у внутреннего края диска). Многосессионный диск имеет несколько независимых TOC – по одному TOC на каждую закрытую сессию.
TOC содержит информацию о стартовых адресах вводной/выводной областей диска и атрибуты всех его треков (как-то тип трека: аудио или данные, а если данные, то в каком режиме – Mode 1, Mode 2 и т.д., абсолютный стартовый адрес трека и номер соответствующей ему сессии). Также TOC содержит часть ATIP и указатели на местоположение ее продолжения.
Непосредственно (т.е. на секторном уровне) для чтения TOC недоступен, но для извлечения его содержимого в «сыром» виде можно воспользоваться следующей SCSI/ATAPI командой READ TOC/PMA/ATIP (операционный код: 43h) с format field == 2h.
Однако не стоит путать TOC с файловой системой – между ними нет ничего общего! Файловые системы на лазерных дисках хранятся непосредственно в PM и свободно доступны для чтения на секторном уровне.