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

">>>>> Отжиг" дисков. За, против и немного вокруг


Может ли Бог сотворить такой камень, который сам же и не сможет поднять –— неизвестно, но вот программист запросто нахкодит такое, что "хрен" потом отладит.

Программистский фольклор

Для защиты дисков от копирования, приступать к созданию своей собственной программы "прожига" совершенно необязательно. Вместо этого вы можете манипулировать с "сырыми" образами дисков, поддерживаемыми программами Алкоголиком Alcohol 120% или Clone CD. Несмотря на то, что все эти программы налагают на записываемые ими образы дисков определенные ограничения, создание качественных защитных механизмов все-таки остается возможным. Другими словами, эти программы спокойно записывают то, что самостоятельно скопировать оказываются не в состоянии!

При создании собственного копировщика защищенных дисков без умения прожигать диски можно, в принципе, и обойтись, –— достаточно лишь подготовить образ диска (т. е. корректно прочитать защищенный диск), ну а тиражирование "хакнутого" образа уже не проблема. Лучше сфокусироваться непосредственно на анализе защищенных дисков, чем изобретать велосипед, в очередной раз разрабатывая то, что уже давно разработано до вас. Alcohol 120%Алкоголь и CloneCD имеют превосходные возможности "прожига", но вот читающий движок у них явно слабоват, и даже незначительные искажения служебных структур лазерного диска способны сбить их столку.

Если же, несмотря ни на что, вы по прежнему убеждены, что свой собственный Нерон, сжигающий Рим, вамс все-таки нужен, что ж! Добро пожаловать в гости к Демону Максвелла, попасть в лапы к которому гораздо сложнее, чем вырваться из них. Шутка! А вся доля правды в том, что техника "прожига" дисков –— чрезвычайно обширный вопрос, даже краткое изложение которого потребовало бы отдельной книги. Одних лишь стандартов и спецификаций по SCSI-командам здесь окажется крайнеболее чем недостаточно, поскольку в них опущены многочисленные подробности процесса генерации различных структур данных, требующихся приводу для корректной записи исходного образа на лазерный диск.
Лучшим из имеющихся пособий по "проотжигу" дисков автор считает приложение "Functional Requirements for CD-R (Informative)" к документу "SCSI-3 Multimedia Commands", электронную версию которого можно найти по адресуздесь: http://www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf

(обратите внимание, что в более поздних ревизиях документа это приложение было изъято).

Попробуйте также обратиться к исходным текстам утилиты CDRTOOLS, которые можно найти по адресуздесь: http://prdownloads.sourceforge.net/cdromtool/cdromtool_2002-11-26.zip?download. Конечно, семь с небольшим мегабайт исходных текстов –— не самое лучшее средство для вдохновения, но более простые программы "прожига" автору неизвестны.

Более трудоемким (но вместе с тем и соблазнительным!) способом является дизассемблирование исполняемых файлов программ Alcohol 120%Алкоголя, Clone CDCloneCD, CDRWin и других программ, включая монстроузного Nero  Burning  ROMНерона. Собственно, полное дизассемблирование проводить совершенно необязательно, достаточно перехватить передаваемые приводы SCSI-команды и проанализировать последовательность их вызовов, не забывая при этом о значениях аргументов, в которых все ключевые структуры данных, собственно, и содержатся.

В зависимости от способа, выбранного разработчиком приложения для взаимодействия с устройством, "шпионаж" осуществляется либо перехватом функции DeviceIoControl с аргументами IOCTL_SCSI_PASS_THROUGH/IOCTL_SCSI_PASS_THROUGH_DIRECT (4D004h/4D014h), либо SendASPI32Command для интерфейсов SPTI и ASPI интерфейсов соответственно. Приложения, взаимодействующие с приводом посредствомчерез своегой собственногоый драйвера, также поддаются перехвату, но универсальных решений здесь нет, и каждый конкретный случай следует рассматривать индивидуально.

Давайте исследуем копировщик Alcohol 120% Алкоголь на предмет выявления алгоритма очистки и "прожига" CD-RW дисков (CD-R диски "прожигаются" аналогичным образам но, по понятным причинам, не поддаются очистке).




Итак, запускаем программу Alcohol 120%Алкоголика, переходим к вкладке [Y151] [n2k152] "Настройки", щелкаем по ссылке "Общие" и в ниспадающем боксе "Интерфейс управления дисками" выбираем "Интерфейс WinASPI Layer (безопасный режим)", если только он уже не был выбран ранее. После смены интерфейса программа Alcohol 120% Алкоголик потребует перезапуска программы, –— что ж выходим из нееего и тут же запускаем вновь, убеждаясь в работоспособности последнейго.

Теперь вызываем отладчик Soft-Ice (или любой другой отладчик, поддерживающий точки останова на функции API функции) и, предварительно загрузив ASPI-экспорт в память (NuMega Symbol Loader à File à Load Exports à Wnaspi32.dll), открываем процесс Alcohol.exe, при необходимости распаковав (по обыкновению он упакован архиватором [n2k153] упаковщиком исполняемых файлов UPX'ом).

Пытаемся установить точку останова на функции SendASPI32Command, выотдавая отладчику следующую команду "bpx SendASPI32Command", но ничего хорошего из этого у нас не получаетсяполучится, –— архиватор [n2k154] Soft-Ice ругается, что не может найти такую функцию, несмотря на то, что ее имя написано без ошибок. Это не покажется удивительным, если предположить, что библиотека Wnaspi32.dll загружается динамически в ходе выполнения программы и на этапе загрузки Alcohol.exe адреса ASPI-функций еще не известны.

Можно поставить точку останова на функции LoadLibraryA, отслеживая загрузку всех динамических библиотек, но, поскольку программа Alcohol 120% Алкоголь загружает огромное количество разнообразных динамических библиотек (DLL), то на отладку уйдет чудовищное количество времени, в течении которого мы будем "тупо пялиться" на экран, монотонно нажимаявыбивая комбинацию клавиш <CTRL>+<-D> на клавиатуре. Более прогрессивным средством мониторинга будеут установка условной точки останова, которая автоматически отсечет все заведомо ложные вызовы.


Соответствующая ей команда может выглядеть, например, так: "bpx LoadLibraryA IF *(ESP->4) == "SANW"", где SANW –— это четыре первых символа имени "Wnaspi32.dll", записанные задом наперед с учетом регистра, выбранного разработчиком программы (если регистр наперед неизвестен, можно использовать функцию сравнения нечувствительную к регистру).

Затем команда "bpx GetProcAddress" позволит перехватить загрузку всех ASPI-функций и SendASPI32Command в том числе. Имя загружаемой функции может быть просмотрено командой "d esp à 4". Дождавшись появления SendASPI32Command, выдаем командужмем "P RET" и, установив точку останова на "BPX EAX", нажимаем комбинацию клавишьдавим <Ctrl>+<-D> для выхода из отладчика Soft-Ice (все остальные точки останова при желании можно удалить).

По факту "всплытия" отладчика, наскоро набиваемнабираем команду "d esp à 4", и в окне дампа памяти появляется содержимое структуры SRB_ExecSCSICmd. Теперь 30h (48)[n2k155]  байт по счету –— это первый байт CDB-пакета (внимание! это именно первый байт пакета, а не указатель на сам пакет); 03h (3) [n2k156] и 10h (72)[n2k157]  байты –— это флаги направления передачи данных и указатель на буфер обмена соответственно.

ДалееНиже приведены примеры "шпионских" протоколов, перехваченных в процессе очистки и "прожига" болванки CD-RW болванки (листинг 2.5.2).:

Листинг 2.5.232. Содержимое перехваченных CDB-блоков, посылаемых программой Alcohol 120% Алкоголиком устройству при быстрой очистке лазерного диска

1E 00 00 00 01 00   ß PREVENT REMOVAL (ON) -----------+

51 00 00 00 00 00   ß READ DISK INFORMATION-------+   |

1E 00 00 00 00 00   ß PREVENT REMOVAL (OFF) ------|---+

BB 00 FF FF FF FF   ß SET SPEED ----------+       |   |



5A 00 2A 00 00 00   ß MODE SENSE -----+   |       |   |

BB 00 FF FF 02 C2   ß ----------------|---+       |   |

5A 00 2A 00 00 00   ß ----------------+           |   |

1E 00 00 00 00 00   ß

----------------------------|---+

51 00 00 00 00 00   ß ----------------------------+

A1 11 00 00 00 00   ß

BLANK


 

Обратите внимание, что для очистки диска программа Alcohol 120% Алкоголь использует SCSI-команду BLANK, подробное описание которой содержится в документах "Multimedia Commands –— 4" и "Information Specification for ATAPI DVD Devices". Именно команда BLANK, а не ERASE, как пытается убедить нас товарищ Всеволод Несвижский в своей книге "Программирование устройств SCSI и IDE". Приведенные им листинги программ не работают, да и не должны работать в принципе. Команда ERASE (10), с кодом операции 2Ch, местами упоминается как команда с кодом операции 1Ch, соответствующим SCSI-команде RECEIVE DIAGNOSTIC RESULTS, кстати, не поддерживаемой оптическими накопителями вообще. Команды ERASE (12) не то чтобы совсем не существовало в природе, однако согласно приведенному авторому коду операции –— ACh –— это есть ни что иное, как команда GET PERFORMANCE. Интересно, как автор планировал что-либо стирать с ее помощью?

Ладно, оставим "дохлое" дело критики в стороне и продолжим нашу "шпионскую деятельность", наблюдая за процессом "прожига" лазерного диска. Последовательность, SCSI-команд, посылаемых устройству, будет следующей:

Листинг 2.5.333. Содержимое перехваченных CDB-блоков, посылаемых программой Alcohol 120% Алкоголиком устройству при "прожиге" образа лазерного диска

выбираем "прожиг" в меню

BB 00 FF FF FF FF   ß SET SPEED

5A 00 2A 00 00 00   ß MODE SENSE

AC 00 00 00 00 52   ß GET PERFORMANCE

появляется диалог "запись"

1E 00 00 00 00 01   ß PREVENT REMOVAL (LOCK)



51 00 00 00 00 00   ß READ DISK INFORMATION

1E 00 00 00 00 00   ß PREVENT REMOVAL (UNLOCK)

запись диска в прогрессе

43 02 04 00 00 00   ß READ ATIP

51 00 00 00 00 00   ß READ DISK INFORMATION



52 00 00 00 00 00   ß READ TRACK/ZONE INFORMATION

5A 00 05 00 00 00   ß MODE SENSE

55 10 00 00 00 00   ß MODE SELECT

51 00 00 00 00 00   ß READ DISK INFORMATION

2A 00 FF FF D2 AC   ß WRITE(10) -+

2A 00 00 00 D2 BC   ß -----------+-- write Lead-In

2A 00 00 00 D2 CC   ß -----------+



2A 00 00 00 65 B3   ß WRITE(10) -+

2A 00 00 00 65 CD   ß -----------+-- write track

2A 00 00 00 65 E7   ß -----------+

В заключение отметим перечень SCSI-команд, непосредственно относящихся к записи и рекомендованных для внимательнейшего изучения. Это: BLANK, CLOSE TRACK/SESSION, FORMAT UNIT, READ BUFFER CAPACITY, READ DISC INFORMATION, READ MASTER CUE, READ TRACK INFORMATION, REPAIR TRACK, RESERVE TRACK, SEND CUE SHEET, SEND OPC INFORMATION, SYNCHRONIZE CACHE, WRITE (10). Все вышеперечисленные команды относятся к Стандарту MMC-1 и потому максимально просты для понимания. Сам же текст стандарта можно найти по адресуздесь: http://www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf.


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