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

Получение доступа к удаленным файлам


Прежде, чем приступить к восстановлению удаленных файлов, давайте-ка вспомним основные принципы организации файловой системы ISO9660 (Joliet). Итак, шестнадцатый сектор первого трека каждой сессии жестко закреплен за дескриптором тома. Его легко узнать по сигнатуре "CD001", хранящейся в секторе по смещению 1. Если это действительно так (ну мало ли, вдруг нам подсунули диск без файловой системы, например, аудиодиск), тогда по смещению 156 в секторе корневого каталога [n2k18] расположена записьструктура Directory Record корневой директории. Наибольший интерес представляют ее следующие поля: длина самой Directory Record (байт по смещению 0), стартовый LBA-адрес файла/вложенной директории (двойное слово в low-endian формате по смещению 2), длина файла/вложенной директории (двойное слово в low-endian формате по смещению 10), атрибуты файла (байт по смещению 25), длина имени файла/вложенной директории (байт по смещению 32) и, наконец, непосредственно само имя файла (цепочка байт, начинающаяся со смещения 33). Файловая система Joliet устроена аналогичным образом, но соответствующий ей дескриптор тома расположен не в шестнадцатом, а в семнадцатом секторе.

Если первый, считая от нуля, бит атрибутов равен единице, то мы имеет дело с вложеннымой каталогомдиректорией[n2k19] , в противном случае –— с файлом. Вложенные каталогидиректории представляют собой совокупность записей типа Directory Record, каждая из которых указывает либо на целевой файл либо на очередную вложенную директорию.

Таким образом, для просмотра содержимого произвольной сессии нам потребуется всего лишь узнать стартовый адрес ее первого трека. Эту информацию легко получить путем чтения TOC'а на "сыром" уровне (команда: 43h, формат: 02h). Так же, можно воспользоваться любой утилитой "прожига" дисков, способной выдавать информацию о геометрии диска (для этой цели подходяит, в частности,, Roxio Easy CD Creator, Stomp Record Now, Nero  – Burning Rom и многие другие).
Увеличив стартовый адрес первого трека на 16 секторов (для работы с ISO- 9660) или на 17 секторов (для работы с Joliet), мы попадем на описатель тома, то есть –— нана корневойую каталогдиректорию. А дальше уже рекурсивный спуск по древу каталоговдиректорий пойдет "как по маслу" (под Windows можно даже не заботиться об исчерпании стека, если, конечноа, файловая система не содержит грубых ошибок, приводящих к ее зацикливанию. Между прочим, такие трюки с зацикливанием достаточно часто используются в защитах).

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

Для последующих экспериментов нам потребуется утилита ISO9660.dir, которая расположена на прилагающимся к книге компакт-диске. Используя любую программу "прожига" запишем на диск CD-RW/CD-R диск три сессии с таким расчетом, чтобы в первой или второй сессии образовалось несколько удаленных файлов, которые нам, собственно, и предстоит найти.

Допустим, стартовые адреса дисковых сессий располагались так как это (показано всм. листинге 10.1. Трек номер AA представляет собой выводную область и не представляет для нас никакого интереса., приведенный ниже):

Листинг 10.1. Стартовые адреса первых треков каждой из трех сессий диска



> ISO9660.dir.exe 1.1

track |  Start LBA

------+-----------



  1   |          0

  2   |      13335

  3   |      22162

 AA   |      24039

Листинг 1  стартовые адреса первых треков каждой из трех сессий диска (трек номер AA представляет собой выводную область и не представляет для нас никакого интереса)

Теперь, последовательно вызывая утилиту ISO9660.dir.exe со стартовыми адресами 0, 13 335 и 22 162, мы увидим содержимое каталогов директорий первой, второй и третьей сессий соответственно. Для удобства сравнения результат работы программы представлен в виде горизонтальной таблицы (листинг 10.2). При сравнении видно, что вторая сессия содержит удаленный файл See You.mp3 (в тексте он выделен полужирным шрифтом), отсутствующий в оглавлении третьей сессии.:

Листинг 10.2. Сравнение содержимого каталогов трех сессий

>ISO9660.dir 1.1 0 -–Joliet

>ISO9660.dir 1.1 13335 –Joliet

>ISO9660.dir 1.1 22162 -Joliet

start|size   |name

-----+-------+-----------------

22   |2048   |.

22   |2048   |..

25   |3591523|PersonalJesus.mp3

start|size   |name

-----+-------+-----------------

13357|2048   |.

13357|2048   |..

25   |3591523|PersonalJesus.mp3

13360|3574805|See You.mp3

start|size   |name

-----+-------+-----------------

22184|2048   |.

22184|2048   |..

25   |3591523|PersonalJesus.mp3

22187|3472405|Strangerlove.mp3

Листинг 2 сравнение содержимого директорий трех сессий показывает, что вторая сессия содержит удаленный файл "See You.mp3" (в тексте он выделен жирным шрифтом), отсутствующий в оглавлении третьей сессии.

Видите, вторая сессия содержит файл "See You.mp3", который отсутствует в оглавлении третьей сессии, а это, значит, что штатным средствам операционной системы он категорически недоступен! И действительно, команда dir показывает всего лишь два файла (листинг 10.3). Но нас-то не проведешь! Мы-то уже знаем, что здесь содержится один удаленный файл.:



Листинг 10.3.  Таким представляется содержимое диска операционной системе

Том в устройстве G имеет метку NEW

 Серийный номер тома: 4171-70DC

 Содержимое папки G:\

30.06.2003  00:10            3 591 523 01 - Personal Jesus.mp3

30.06.2003  00:12            3 472 405 03 - Strangerlove.mp3

               2 файлов      7 063 928 байт

               0 папок               0 байт свободно

Листинг 3 таким представляется содержимое диска операционной системе. Но нас-то не проведешь! Мы-то уже знаем, что здесь содержится один удаленный файл

Для восстановления файла достаточно дать запустить нашу утилиту со следующими ключами: ISO9660.dir.exe 1.1 "See You.mp3" 13360 3574805 или воспользоваться любой программой для "грабежа" секторов с диска (но тогда нам придется вручную усечь "хвост" последнего сектора на необходимую величину). Короче говоря, мы должны считать 3 .574 .805 байт, начиная с сектора 13. 360 и до последнего сектора файла включительно (в силу отсутствия фрагментации сектора, принадлежащие файлу, всегда располагаются последовательно).

Если все сделано правильно, то на жестком диске образуется файл See You.mp3, который теперь можно проиграть любым MP3-плеером, наслаждаясь своей любимой музыкой. А можно, – используя любую программу "прожига", "закинуть" восстановленный файл на тот же самый лазерный диск, дописав к нему еще одну сессию. Конечно, это далеко не самое лучшее и элегантное решение (ведь теперь восстановленный файл будет записан дважды), но, к сожалению, ни одна из известных мне утилит "прожига" не позволяет вмешиваться в процесс генерации файловой системы, и не позволяет вручную формировать ссылки на файлы предшествующих сессий.

Теперь подготовим следующий диск для восстановления. Запишем на болванку какой-нибудь файл. Затем, слегка изменив его содержимое, запишем под тем же самым именем на диск еще один или несколько раз.


Убедимся, что при просмотре оглавления штатными средствами Windows мы видим всего лишь один файл –— тот, что был записан последним. А теперь вообразим себе, что нам жизненно потребовалось получить доступ к одной из его предшествующих версий. No problem как говорят англичане! Запускаем утилиту ISO9660.dir и видим, что на диске имеются две следующих сессии (листинг 10.4).:

Листинг 10.4. На восстанавливаемом диске имеются две сессии со стартовыми адресами 0 и 12000 соответственно

>ISO9660.dir.exe 1.1

track |  Start LBA

------+-----------

  1   |          0

  2   |      12000

 AA   |      12600

Листинг 4 На восстанавливаемом диске имеются две сессии со стартовыми адресами 0 и 12.000 соответственно

Последовательно запуская утилиту ISO9660.dir с ключами 0 и 12 .000 мы обнажим, что… А, впрочем, давайте не будем забегать вперед. Сейчас вы сможете увидеть все это сами (листинг 10.5).:

Листинг 10.5. Обе сессии содержат один и тоже файл asm.drf.zip, однако, стартовые адреса файла в обоих случаях не совпадают, да и длина различна тоже

> ISO9660.dir.exe 1.1 0 –Joliet

> ISO9660.dir.exe 1.1 12000 -Joliet

start     | size     |  name

----------+----------+------------

22        |2048      |.

22        |2048      |..

25        |38189     |asm.drf.zip

start     | size     |  name

----------+----------+---------------

12022     |2048      |.

12022     |2048      |..

12025     |354533    |asm.drf.zip

Листинг 5 обе сессии содержат один и тоже файл asm.drf.zip, однако, стартовые адреса файла в обоих случаях не совпадают, да и длина различна тоже

На первый взгляд здесь все нормальнопучком:, файл asm.drf.zip присутствует в обоих сессиях, и невнимательному наблюдателю может показаться, что в обоих случаях речь идет про один и тот же файл. Однако, более подробный анализ показывает, что стартовые адреса файла не совпадают, следовательно, мы имеем дело с двумя различными файлами! Длины файлов также различны и, судя по всему, последний файл является более свежей версией своего собрата.


Добыть предшествующую версию файла можно так: ISO9660.dir.exe 1.1 asm.drf.zip 25 38189. И этот прием действительно работает!

Разумеется, для практического использования утилита ISO9660.dir.exe катастрофически неудобна. Однако, не судите ее строго, ведь это всего лишь демонстрационный пример. Надеясь пробудить в своих читателях стремление к творчеству я предлагаю всю недостающую функциональность реализовать самостоятельно. Задача минимум –— "обернуть" утилиту в комфортный графический (а еще лучше консольный) интерфейс, например, написать "плагин" (Plug-In)плагин к файловому менеджеру FAR'у, отображающий содержимое выбранной сессии на панели. Это гораздо проще, чем запрограммировать полноценный дисковый драйвер, а эффект с точки зрения пользователя все равно один и тот же. Задачу сравнения имен и стартовый адресов файлов так же не помешало бы возложить на компьютер, поскольку ручной поиск удаленных (замещенных) файлов крайне непродуктивен –— типичный CD-ROM содержит тысячи, если не десятки тысяч файлов, рассредоточенных по мощной древовидной структуре. Вот и попробуй перебери их все!


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