Здравствуйте!

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

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

Ну и конечно нельзя упомянуть о плюсах, потому как копирование таких дисков было
весьма затруднительно и создать образ для последующей эмуляции было практически
невозможно, это и было (как сейчас принято называть) НОУ-ХАУ компании.

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

Защитить видео, можно несколькими путями:

  1. Созданием своего собственного видео формата и собственного декодера и
    далее плеера.
  2. Созданием программы для автоматической распаковки запакованного заранее
    видео и последующего передачи стандартному декодеру.
  3. Повреждением стандартного видео-файла или его заголовков.

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

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

Метод защиты собственно самого видеофайла выбрали. Теперь нужно рассмотреть
наиболее приемлемую реализацию.

Перед нами стоит задача сделать такую программу, которая бы при успешной
проверке на наличие CD диска корректировала видо-файл и запускала его в
стандартном проигрывателе, а после закрытия последнего приводила видео-файл в
первоначальный неработоспособный вид.

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

Исходники видеоплеера я предоставляю на Delphi, остальной код мы также будем
писать на нем, это дополнительно упростит понимание.

Итак, суть программы, которая будет восстанавливать и повреждать видеофайл.

Первым делом нам нужно заиметь уже поврежденный .avi файл, сделаем это самым
простым, но в то же время наглядным способом.

Откроем любой .avi видеофайл в шестнадцатеричном редакторе, к примеру можем
взять hiew и подредактируем три байта служебной информации. Возьмем байты по
смещению 0, 188 и 10248 , всего три байта меняем на любые другие значения и
видеофайл уже не открыть стандартным видеоплеером. Этим и воспользуемся в
качестве примера. Остается написать функцию, которая будет приводить испорченный
видеофайл в нормальный вид.

Выглядеть она может следующим образом:

var
OldErrorMode : Word;
f:file of byte;
nmv:byte;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX); //

указываем не выводить окна с возможными ошибками
if FileExists('video.xfm') then //
video.xfm - это
и есть вполне обычный к примеру .avi файл, который мы и будем проигрывать, в
данном случае функция проверяет его наличие

begin
{$I-} assignfile(f,'video.xfm'); //
открываем файл
{$I-} FileSetAttr('video.xfm',faarchive); //
на
запись

{$I-} reset(f); //
{$I-} seek(f,0); //
{$I-} nmv:=82; //
{$I-} write(f,nmv); //
{$I-} seek(f,10248); //
{$I-} nmv:=109; //
{$I-} write(f,nmv); //
{$I-} seek(f,188); //
{$I-} nmv:=68; //
{$I-} write(f,nmv); //
{$I-} closefile(f); //
{$I-} FileSetAttr('video.xfm',fareadonly); //
end
else
halt;

video.xfm - переименованный .avi файл, в котором испорчены 3 вышеописанных
байта. Достаточно выполнить этот код и программа заменит эти 3 байта на нужные,
после чего видеофайл можно будет открыть.

Устанавливаем SetErrorMode, что бы избежать возможных окон ошибок, к примеру
если  файл уже открыт на чтение.

А после завершения просмотра и закрытии плеера тем же самым образом вносим
повреждение в файл.

var
OldErrorMode : Word;
f:file of byte;
nmv:byte;
begin

OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
{$I-}assignfile(f,pstr+'video.xfm'');
{$I-}FileSetAttr(pstr+'video.xfm',faarchive);
{$I-}reset(f);
{$I-}seek(f,0);
{$I-}nmv:=52;
{$I-}seek(f,10248);
{$I-}nmv:=93;
{$I-}write(f,nmv);
{$I-}seek(f,188);
{$I-}nmv:=67;
{$I-}write(f,nmv);
{$I-}FileSetAttr('video.xfm',fareadonly);
{$I-}closefile(f);
SetErrorMode(OldErrorMode);
end;

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

Будем считать, что первую задачу выполнили.

Алгоритм будет таков:

  • Наш собственный видеопроигрыватель будет находиться в корне CD диска.
  • Искомый видеофайл будет заранее испорчен, но нам нужно каким-то образом
    переписать видеофайл на жесткий диск в первую очередь для возможности 
    редактирования, но также и для лучшего воспроизведения. Поэтому другие
    варианты мы и не рассматривали.
  • Задачу эту мы решаем с помощью автоматического инсталлятора, неплохой и
    достаточно простой в использовании инсталлятор это Installer Vise, его и
    будем использовать. Задача инсталлятора состоит в записи нашего видео файла
    на диск и добавления в реестр пути, куда была произведена установка, это
    информация будет использоваться проигрывателем для нахождения файла.
  • После инсталляции видеофайл файл будет записан на жесткий диск. Для
    проигрывания видео нужно запустить наш проигрыватель, находящийся на CD
    диске.

Алгоритм работы проигрывателя будет таков:

  • Первостепенно проверяет наличие записи в реестре, если не находит -
    сообщает о необходимости произвести установку программы, а если путь найден,
    проверяет наличие файлов по указанному пути, причем для отвода глаз вместе с
    настоящим видеофайлом можно записать мусорные клоны и также проверять их.
  • В случае положительных результатов проверок фалов наступает самый
    ответственный момент, программа должна распознать присутствие нашего 
    CD диска и что это не созданный посредством эмуляторов образ диска. В случае
    если проверка пройдена - исправить видеофайл и открыть на воспроизведение.
  • Таким образом мы подошли ко второй, самой значимой части данной статьи -
    защите самого CD.

При столько прогрессивной работе нынешних эмуляторов сделать это крайне
сложно и нужно придумать свой серьезный НОУ-ХАУ для распознания эмулирующей
среды.

И решение было найдено. Заключается оно в следующем:

На диск записывается файл определенной длинны, далее, с помощью ASPI интерфейса,
на CD-ROM посылается сигнал замедления скорости чтения
для быстроходных устройств, после чего из программы производим замер скорости
чтения файла в оперативную память, с помощью тестов устанавливаем оптимальное
время прохождения. Таким образом если файл будет считан с эмулирующей среды,
чтение будет производиться с жесткого диска и скорость будет высокая, что не
позволить пройти проверку по времени.

Теперь займемся реализацией, в данном примере я использовал готовые программы
использующие ASPI и не нуждающиеся в дополнительных библиотеках. Были взяты две
программы для среды Win 9x/Me и Win NT/XP.

Для Win 9x/Me - "CD1.DLL"
для Win NT/XP - "CD2.DLL"

на самом деле это исполнительные файлы .exe, переименованные в .dll.

Оба файла помещаются в корневую директорию CD диска. Для проверки скорости
чтения берем файл "CD.CDD", размером 5 100 000 байт и также помещаем в корневую
папку CD.

Теперь реализуем проверку в нашем видеоплеере.

function d_t_of_os:boolean; //
функция служит для проверке операционной системы
var
bResult: boolean;
WindowsNT: boolean;
lpOSVi: TOSVersionInfo;
begin
lpOSVi.dwOSVersionInfoSize:= sizeof(TOSVersionInfo);
bResult:= GetVersionEx(lpOSVi);
if bResult then
begin
WindowsNT:= (lpOSVi.dwPlatformId= VER_PLATFORM_WIN32_NT);
if WindowsNT then
Result:=false
else
begin
if lpOSVi.dwMinorVersion>0
then Result:=true
else Result:=true;
end;
end
else
Result:=false;
end;

if d_t_of_os=true then // проверяем систему, если
true - Win 9x/Me, false - Win NT/XP

begin
prtf1:='cd1.dll'; //
программа замедление для Win
9x/Me

end
else
begin
prtf1:='cd2.dll'; //
программа замедление для Win
NT/XP

end;

//--------------------------------------
c:=prtf1+' 0 0 0 s 2'+#0; //
посылаем замедленнее
на все возможные устройства

winexec(@c[1], sw_hide); //
воспримут только CD-ROM
c:=prtf1+' 0 1 0 s 2'+#0;
winexec(@c[1], sw_hide);
c:=prtf1+' 1 0 0 s 2'+#0;
winexec(@c[1], sw_hide);
c:=prtf1+' 1 1 0 s 2'+#0;
winexec(@c[1], sw_hide);
//--------------------------------------

sleep(100); // производим замер
MemStr := TMemoryStream.Create; //
времени чтения
файла cd.cdd

Before := GetTickCount(); //
MemStr.LoadFromFile('cd.cdd'); //
After := GetTickCount(); //
s:=(After-Before); //

chs:=s;

//--------------------------------------
c:=prtf1+' 0 0 0 s 6500'+#0; //
тем же образом
восстанавливаем скорость чтения

winexec(@c[1], sw_hide); //
c:=prtf1+' 0 1 0 s 6500'+#0;
winexec(@c[1], sw_hide);
c:=prtf1+' 1 0 0 s 6500'+#0;
winexec(@c[1], sw_hide);
c:=prtf1+' 1 1 0 s 6500'+#0;
winexec(@c[1], sw_hide);
//--------------------------------------

if s<2200 then halt; // здесь происходит проверка,
если время меньше чем 2200, значит чтение было произведено не с CD диска и
скорее всего программа запущена с эмулирующей среды, поэтому завершаем работу

Еще одним важным моментом является очистка оперативной памяти для систем NT/XP,
иначе файл при следующем запуске не будет прочитан с CD, а всего лишь изъят из
оперативной памяти, в этом случае даже у легального пользователя с
присутствующим CD диском не удастся повторно запустить программу, не прибегая к
перезагрузке.

Делаем мы это следующим образом:

var
MemStr: TMemoryStream;
ms:MEMORYSTATUS;

begin
ms.dwLength:=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(ms);
FreeMem(AllocMem(ms.dwTotalPhys),ms.dwTotalPhys);
end;

На этом наша проверка  завершена.

И впереди нас ждет последняя часть защиты.

Формируем CD для записи.

Создаем директорию "Video".

В эту директорию мы помещаем следующие файлы:

cd1.dll - программа для замедления скорости CD-ROM в среде Win 9x/Me
cd2.dll - программа для замедления скорости CD-ROM в среде Win NT/XP
cd.cdd - файл для проверки чтения
video.exe - собственно сам плеер
autorun.exe - удобно изготовить простенький автозапуск
autorun.ini - иконка для автозапуска

Эти файлы будут находиться в корневой директории CD диска. Разумеется можно
добавить readme.txt и другие полезные на ваш взгляд файлы. Теперь мы должны
сформировать файлы, которые будут устанавливаться на жесткий диск с помощью
автоматического установщика Installer Vise,

video.xfm - наш видео файл, виновник торжества
sys.xfc
ini.xfc
codek.xfc
vid.xfc

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

Теперь создаем инсталлятор с помощью все того же Installer Vise, прописываем
ключ в реестре в который инсталлятор запишет путь куда была произведена
установка. Как уже говорили ранее, эта информация будет предназначена плееру для
поиска видеофайла, а также для проверки установки видео, может пригодиться и
автозапуску. После того как инсталлятор отработает у нас появится файл setup.exe
и директория с остальными файлами инсталлятора.

Все это мы помещаем в папку "Video".

Теперь мы должны создать образ диска в файл .cue, для этого будем использовать
удобную программу CDRWIN, доступную в  приложении к данной статье. Выбираем
директорию VIDEO, создаем образ и записываем в файл, на выходе мы получаем
video.cue.

Но прежде чем записать созданный образ на диск проведем еще одну, последнюю
часть нашей защиты. Для этого берем программу TZPR.exe, которая также находится
в приложенном к данной статье архиве. Открываем в ней наш video.cue и поочередно
нажимает Step1, Step2, Step3 внося дополнительную защиту. На втором этапе
увеличиваем только размер образа, дорожку оставляем только 1.

Теперь образ полностью готов к записи. Можете записывать в помощью все той же
полезной программы CDRWIN. И проверять ваше личное видео на защищенность,
эмулируя образы диска.

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

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

Неприятным моментом остался случай сброса через кнопку reset и прочие выключения
компьютера при работе нашего плеера, в этом случае он не успеет испортить файл.
Однако для этих целей я использовал программу ctltst1.exe, которую устанавливал
вместе с видеофайлом и при запуске плеера прописывал путь в реестре в ключе
runonce. Смысл программы заключался в повреждении файла при запуске. Для более
простого решения можно добавить и в автозагрузку.

Вот, собственно, и вся технология в наиболее простом варианте.

В приложении к данной статье
находится исходный код плеера, все необходимые для компиляции библиотеки, пример
защиты с комментариями и простыми аниотладочными вставками, приведенными для
примера, а также программы CDRWIN и программа дополнительной защиты TZPR.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии