понедельник, 11 мая 2009 г.

как восстановить не читающийся CD: искажение размеров файлов

Еще (или, скорее уже) во времена монохромных терминалов и 133-дюймовых дискет существовал некрасивый, но элементарно реализуемый защитный примем, препятствующий пофайловому копированию носителя. Внося определенные искажения в структуры файлов системы, разработчики "грохали" дискету ровно настолько, чтобы работа с ней становилась возможной лишь при условии учета характера внесенных искажений. Защищенная программа, "знающая" об искажениях файловой структуры, работала с ней без проблем, то штатные утилиты операционной системы на таких дисках конкретно обламывались, а общедоступных "хакерских" копировщиков в те времена еще не существовало…

Несколько файлов зачастую ссылались на общие для всех них кластера, тогда запись данных в один файл приводила к немедленному их появлению в другом, что защита могла так или иначе использовать. Естественно, после копирования файлов на новый диск, пересекающиеся кластеры "разыменовывались" и хитрый способ неявной пересылки данных переставал работать, а вместе с ним переставала работать и сама защищенная программа. Если, конечно, содержимое диска вообще удавалось скопировать… Ведь копирование файлов с пересекающимися кластерами приводило к тому, что эти кластера многократно дублировались в каждом копируемом файле, в результате чего их суммарный объем под час увеличивался настолько, что емкости тогдашних носителей попросту не хватало для его вмещения! Если же последний кластер файла "приклеивался" к его началу (т. е. файл попросту зацикливался), то объем и время его копирования вообще обращались в бесконечность… Конечно, дисковые доктора в то время уже существовали, но их использование не давало желаемого результата, т. к. лечение файловой системы приводило к полной неработоспособности защиты (в том же случае с зацикливанием – если защита закладывалась на то, что за концом файла следует его начало, то после обработки диска доктором, осуществление этого приема становилось невозможным со всеми от сюда вытекающими последствиями).

Файловые системы лазерных дисков, конечно, совсем не те, что на гибких дисках, но общие принципы их искажений достаточно сходи. Увеличивая фиктивные длины защищаемых файлов на порядок-другой, разработчик защиты может довести их суммарный объем до нескольких сотен гигабайт, так что для копирования защищенного диска понадобиться по меньшей мере пачка DVD или винчестер солидного объема. Защитный механизм, "помнящий" оригинальные длины всех файлов, сможет работать с ними без проблем, но все файловые копировщики не поймут юмора и их поведение станет крайне неадекватным.

В принципе, выход за границы файла ничем не чреват. Файловые системы лазерных дисков очень просты. Лазерные диски не поддерживают фрагментацию файлов, а потому не нуждаются в FAT. Все файлы занимают непрерывный ряд секторов и каждым файлом связано только две важнейшие характеристики: номер первого сектора файла, заданный в LBA (Logical block address) и его длина, заданная в байтах. Остальные атрибуты, вроде имени файла и времени его создания – не в счет, мы сейчас говорим исключительно о секторах.

Увеличение длины файла приводит к "захвату" того или иного количества примыкающих к его хвосту секторов и при условии, что номер последнего сектора, принадлежащего файлу, не превышает номера последнего сектора диска, копирование файла в принципе протекает нормально ("в принципе" потому, что в копируемый файл оказываются включены все файлы, встретившиеся на его пути). Если же в процессе своего копирования файл "выскакивает" за конец диска, CD-ROM привод сигнализирует об ошибке и прекращает чтение. Штатный копировщик операционной системы (равно как и большинство оболочек сторонних производителей) автоматически удаляют "огрызок" недокопированного файла с диска, в результате чего пользователь остается вообще ни с чем.

Утилита ISO9660.DIR.EXE выгодно отличается тем, что позволяет копировать не только весь файл целиком, но и любую его часть! Но как мы узнаем сколько именно байт следует скопировать? Как определим: где идут полезные данные, а где начинается "после-хвостовой" мусор (over-end garbage). Будем исходить из того, что по Стандарту файлы на диске располагаются последовательно, т. е. за последним сектором одного файла, непосредственно следует стартовый сектор следующего. А, поскольку, стартовые сектора всех файлов нам известны, определение истинных длин всех файлов, за исключением последнего, не составит никакого труда! Поскольку длина одного сектора лазерного диска составляет 2048 байт, то истинный размер всякого файла равен: (стартовый адрес следующего файла – стартовый адрес самого этого файла) * 2048. Все просто, не правда ли?

С помощью утилиты ISO9660.DIR.EXE мне и моим друзьям удалось скопировать большое количество дисков с MP3, обладающих защитой данного типа.

Комментариев нет:

Отправить комментарий