DVD-RX, борьба с защитой

в 9:26, , рубрики: DVD, linux, rip, видео, копирайт, Песочница, метки: , , ,

DVD-RX это многоуровневая защита DVD видео от несанкционированного копирования. Но раз есть информация которую можно просмотреть, значит её можно и сохранить. В этом посте я опишу то, как именно мне удалось снять образ с такого диска, при помощи Linux.

Так как мне до этого ни разу не приходилось иметь дело с защищёнными дисками, а в частности с DVD-RX, пришлось опробовать многие способы, чтобы получить устраивающий результат.

Содержимое диска, который был у меня представляло из себя 30 минутный видеоролик без меню, хранящегося в виде огромного количества файлов (больше сотни) с расширением VOB и каждый размером свыше одного гигабайта. Впрочем сам ролик является нарезкой новостей с телевидения, так что я даже ничего не нарушил. Суммарный объём содержимого составлял порядка одного терабайта, несмотря на то, что объём самого диска был стандартным, т.е. 4,7 Гб. Следовательно от копирования содержимого в виде файлов я отказался сразу. От сграбливания видео с экрана я тоже решил отказаться, хотя это было бы быстрее, но я задался идеей сделать именно копию диска. Попытка снять образ при помощи K3b ни к чему не привела, т.к. после скопированных 10 мб стали появляться ошибки чтения секторов. Несмотря на то, что в функционал K3b входит пропуск ошибок чтения и ограничение их попыток, сам привод старается прочитать каждый сектор, а на одну попытку прочтения битого сектора уходит порядка 10 секунд, что является не только затяжным процессом, но и изрядно насилует лазер в приводе.

Почитав литературу, по копированию информации с плохих носителей, я решил воспользоваться консольной программой dd_rescue, которая умеет создавать образы файлов блочных устройств, пропуская заданное количество байт вначале (забивая их нулями). К сожалению, я так и не смог найти программного решения, для быстрого поиска bad block`ов на оптических носителях. Пришлось искать методом тыка. Я знал нижнюю границу, где начинались битые сектора (10 мб), поэтому решил взять сразу 100 Мб для проверки. Как ни странно, сектор начинающийся со 100 Мб тоже был битым, как и с 200, но на 300 пошли данные, поэтому в качестве нижней границы поиска я выбрал 200 мб, а в качестве верхней — 300. В итоге мне пришлось сделать примерно 20 прыжков, чтобы найти границу между битыми и живыми секторами. Таким образом я скопировал верхнюю часть диска.

Впрочем когда я взглянул на поверхность диска, я понял что мне придётся искать ещё две границы, т.к. там было два кольца, резко отличающихся по цвету.

image

Тем же способом (запуская dd_rescue на разных местах и глядя в вывод) я нашёл нужные границы.
Одна была в районе 63 Мб, а вторая в районе 130. Итак у меня уже был iso файл весом 10 Мб (от центра диска до первых бэдблоков), и файл размером 4,7 Гб, содержащий информацию от конца бэдблоков до края диска. Мне было необходимо сделать дамп между теми кольцами. Я воспользовался тем же dd_rescue, нажав на Ctrl+C когда посыпались бэдблоки:

$dd_rescue -s 62973431 -f /dev/sr0 /home/mascom/middle

Таким образом у меня были три файла, которые мне нужно было соединить в один, накладывая один поверх начала другого, вроде слоёв (в том смысле что это не просто конкатенация). Я воспользовался программой split, разбив средний файл на равные части, каждая размером с малый файл.

$split -b 9997139 /home/mascom/middle

Заменив файл первой части (xaa) на 10 мегабайтный begin.iso и соединив все части в одну, у меня получился файл содержащий информацию от физического центра диска, до начала второго кольца.

$cat begin.iso xab xac xad xae xaf xag xah xai xaj xak xal xam xan xao xap xaq xar xas xat xau xav > begin1
$rm xaa xab xac xad xae xaf xag xah xai xaj xak xal xam xan xao xap xaq xar xas xat xau xav

Повторив эту процедуру с большим файлом (используя размер получившегося begin1, заменяя им новый xaa и сконкатенатив их заново) я получил готовый, работающий iso образ исходного диска.

Автор: mascom

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js