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

Защиты, основанные на физических дефектах


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

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

Физические дефекты, к которым привязывается защита, как правило, представляют собой крошечные пятнышкие (от одного до двух миллиметров в диаметре) выжженные на его поверхности лазером. При рассматривании диска в отраженном свете они легко обнаруживаются невооруженным глазом (рис. 9.1). На первый взгляд кажется, что точно измерив их геометрические координаты (например, с помощью палетки[9]), нам удастся воспроизвести идентичные повреждение на скопированном носителе. Однако на проверку оказывается, что это не так и причина нашей неудачи заключается в том, что номера секторов никак не привязаны к их физическому расположению. В зависимости от ширины спиральной дорожки, размеров области lead-inLead-In, длины питов и лендов, в одной и той же геометрической точке диска могут находится различные сектора! Вероятность же того, что в двух несвязанных между собой партиях болванок эти сектора совпадут, ничтожно мала! А потому, скопировать такой диск "в лоб" не получится!


Вспомнили? А теперь представьте, что произойдет, если умышленно исказить их так, чтобы даже при успешном чтении сектора возникала неустранимая ошибка контрольной суммы (т. е. такая ошибка, которая не может быть исправлена за счет избыточности). Микропрограмма, "зашитая" в привод, всесторонне проанализировав ситуации ситуацию и даже попытавшись считать "подопытный" сектор несколько раз, в конце концов перестанет ерзать головкой и возвратит сообщение об ошибке, однако, не будет уточнять физическая это ошибка или логическая. А, значит, с точки зрения программного обеспечения и физические, и логические дефекты диска будут выглядеть совершенно одинаково! Вообще-то, защита может попросить вернуть содержимое дефектного сектора в "сыром" (RAW) виде и, если поверхность диска в действительности не содержит никаких физических повреждений, этот сектор будет успешно прочитан, а, раз так, то мы имеем дело не с оригиналом, а копией. Однако не все приводы поддерживают "сырое" чтение (в просторечии называемое "сыром") и потому попытка промышленного внедрения такой проверки вызовет нарекания большого количества легальных пользователей, вызванных несовместимостью с оборудованием, так что прибегать к ней право же не стоит. Разработчики защиты могут сделать "ход конем": если привод не поддерживает "сырого" чтения, то защита доверяет тем показаниям, что у нее есть, в противном случае осуществляется дополнительная проверка. Выходит, что и "волки сыты, и овцы целы!" Скопированный таким образом диск будет работать лишь в тех приводах, что не поддерживают "сырого" чтения.

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



Операционные системы семейства Windows оказываются на удивление "богаты" в отношении средств работы с дисками CD- ROM на сектором уровне. Помимо очевидных функций CreateFile или DeviceIoControl, существуют такие "приблуды" как ASPI (Windows 9x/NT) и SPTI (только Windows NT), да и другие интерфейсы имеются во множестве. Под Windows 9x можно напрямую обращаться к CDFS-драйверу через функцию ABSOLUTE_READ[10]

прерывания [Y194] [n2k195] INT 2Fh (точнее, не совсем напрямую, а через специальный переходник 16-разрядной динамической библиотеки DLL, вызывающей DPMI-функцию Simulate Real Mode Interrupt[11]; подробнее об этом можно прочитать в технической заметке Q137813 "How Win32 Applications Can Read CD-ROM Sectors in Windows 95" из Microsoft Knowledge Base, входящей в состав MSDN, прилагаемой к диску с Microsoft Visual Studio. Там же содержится исходный текст функции для работы с дисками CD-ROM на секторном уровне).

Под Windows NT чтение/запись секторов осуществляется еще проще. Достаточно открыть диск в cooked-mode[12], после чего с ним будет можно работать на логическом уровне. Образно говоря, все содержимое диска будет трактоваться как один большой файл. Детальное описание этого процесса вы найдете в технической заметке Q138434 "How Win32-Based Applications Read CD-ROM Sectors in Windows NT" из Microsoft Knowledge Base.

Кстати, для проверки наличия дефекта на существование, вовсе не обязательно спускаться на уровень "голых" секторов. Ничуть не с меньшей эффективностью можно воспользоваться и файловым обменом. Очевидно, что файл, содержащий по крайней мере один сбойный сектор не сможет читаться и даст ошибку! Основное достоинство этого способа в том, что его можно реализовать на любом языке, оперируя лишь штатными средствами. Никаких API-функций и "монструозных" IOTCTL[Y196] [n2k197] , — вызова функций fopen/fread будет вполне достаточно!



Таким образом, возможных способов привязки к диску очень много и локализация защитного механизма в коде ломаемого приложения представляет довольно "муторную" задачу. Если точки останова, установленные на функцию DeviceIoContorl не дадут никакого результата (что, впрочем, случается не так уж и часто), то вашему положению трудно позавидовать. Покупайте бочонок пива и занимайтесь с защитой до утра. Да помогут вам API-шпион и контекстный поиск. Ну, со "шпионом", положим все ясно, согласитесь вы. Но поиск-то тут причем? А вот причем: зная номера сбойных секторов, вы можете попробовать отыскать соответствующие им константы в теле программе. Если разработчик защиты не использовал дополнительных ухищрений, то номера контролируемых секторов записаны в программе, так как они есть и все, что вам остается, — поставить на соответствующую ячейку памяти точку останова и немного подождать пока к ней кто ни будь не обратиться. Естественно, если вы исследуете программу не в отладчике, а дизассемблере, то вместо точек останова вам следует использовать перекрестные ссылки.



Если же, несмотря на все усилия, взломать защиту никак не получается, то попробуйте прибегнуть к помощи CloneCD и/или Alcohol 120%. Обе эти утилиты распознают сбойные сектора и имитируют их на логическом уровне. CloneCD — с помощью корректирующих кодов, а Alcohol 120%  с помощью корректирующих кодов и виртуального диска! Впрочем, как показывает практика, в подавляющем большинстве случав к виртуальному диску прибегать нет никакой необходимости. Защитные механизмы в своей массе слишком "доверчивы" и искажение контрольной суммы сектора легко вводит их в заблуждение.

Таким образом, стойкость защит данного типа следует считать крайне неудовлетворительной и вам следует хорошо подумать, прежде чем оснащать такой защитой ваши собственные программы. Любой грамотный пользователь, умеющий "держать в руках" CloneCD, скопирует защищенный диск в два счета, и вы останетесь не у дел.


К тому же, для создания качественных физических дефектов ("качественный физический дефект" — это звучит!) требуется труднодоступное и весьма дорогостоящее оборудование, которого у программистов, "пасущихся на вольных хлебах" попросту нет! Царапать же диск гвоздем категорически недопустимо! Это не только ненадежно, небезопасно для здоровья диска CD-ROMпривода, но и не эстетично…

Если же, несмотря на все мои предупреждения, вы все-таки решили остановиться на защите данного типа, то позвольте дать вам несколько советов. Во-первых, наносить повреждения следует не со стороны поликарбонатной подложки, а со стороны защитного слоя. То есть, попросту говоря, сверху диска. Нанося диску повреждения, помните о том, что попытка нанести глубокую радиальную царапину заканчивается, как правильно, очень печально. Диск теряет свою механическую прочность и центробежные силы рано или поздно разрывают его на куски, что практически всегда приводит к гибели и сам привод CD-ROM. Лучше проколите в отражающем слое небольшую дырочку, — того будет вполне достаточно, чтобы один или даже несколько секторов перестали читаться. Осуществить такую операцию можно обычной швейной иголкой.

Теперь поговорим о том, как при нанесении физических дефектов не повредить никаких полезных данных. Царапать не записанную область лазерного диска —бесполезно, все равно он ее не прочтет. Вот и приходится записывать на диск что ни будь не нужное. Такое, "что" не жалко и повредить. Один из возможных способов действия выглядит так.

17.  

18. 1) Взяв чистую болванку CD-R, вы "заливаете" на нее все файлы программы, за исключением того, что содержит защитный механизм привязки к диску. Как правило, это главный исполняемый файл программы, хотя защита вполне может быть помещена и в одну из динамических библиотек или даже внедрена в файл данных, но это уже "извращение".

19. 2) Нажмите на кнопку выброса диска и каким-либо образом пометьте положение последней записанной дорожки (например, измерьте диаметр "прожженной" области обычной ученической линейкой).

20. 3) Верните диск на место и запишите на него примерно 150 Мбайт всякой всячины, которая и послужит плацдармом для царапанья. Закрывать сессию все еще не надо!

21. 4) Теперь нанесите диску одно или несколько физических повреждений, тыкая иголкой в область последнего записанного кольца.

22. 5) Запустите любой "дисковый доктор" и определите позиции всех обнаруженных сбойных секторов;

23. 6) "Прошейте" номера сбойных секторов в защищаемую программу и "залейте" защитный модуль на болванку, закрыв за собой сессии.

24. 7) Все! Защита готова!


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