Прежде, чем приступить к восстановлению удаленных файлов, давайте-ка вспомним основные принципы организации файловой системы 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 |
|
> 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 |