DonNews #11
21 апреля 2000

Программирование - Алгоритм защиты диска от копирования.

<b>Программирование</b> - Алгоритм защиты диска от копирования.
──────────────────────────────────────────
Disabler/DPl


       Защита дисков от копирования
      (На примере защиты UltraSonic)

  Итак, здесь я  подробно  опишу  алгоритм
защиты дисков от  копирования  на  примере
защиты, применённой   в   UltraSonic'е,  а
точнее  в  его  ранних   версиях.  Кодовое
название   защиты:  Disabler    Protection
System (DPS).
  Для начала немного истории. Создавая  US
я столкнулся с проблемой защиты дисков  от
насанкционированного    копирования    или
говоря проще, как сделать  диск  полностью
не копируемым. За основу  были  взяты  два
алгоритма защиты. Это Fucklock  Protection
System by Destroyer/OHG и защита  от  игры
Prince of Persia (версия от Magic Soft).
  Первое, что я сделал, это собрал на один
диск   все    копировщики    нестандартных
форматов,  а    так-же    программы    для
форматирования   и    проги,   позволяющие
сканировать дорожки.
        Получился вот такой набор:

               Копировщики:
       Omega Copy v1.3, v1.4, v2.0
                 UFO v1.0
              SoftCopy v1.3
           McDonald v1.x, v2.x
          Elastic Copy v0.1demo

                Форматеры:
             Free Format v8.3
          Elastic Copy v0.1demo

                 Сканеры:
          Conver Commander v4.61
                 RDS v3.1
          Elastic Copy v0.1demo

  После  этого  начались  эксперименты   с
форматированием.  Вначале    я    пробывал
сделать нестандартный формат  в  программе
Free  Format, но  обломался, т. к.  всегда
находился  копировщик, который   мог   его
скопировать. Пришлось  его  вычеркнуть  из
списка. Далее, взял   Elastic   Copy   (by
Disabler  (это  я)) и  сработало! Ни  один
копировщик,   кроме    моего,   не    смог
скопировать диск. Весь прикол  заключается
в вот в чём: берём диск и форматируем так:

   трек   сектора - размер (для tr-dos)

    0    1,2,3,4,5,6,7,8,16 - 1
    0    9,#F8 - 3
    0    18 - 0

   1-10  #F8,#F9,#FA,#FB,#FC - 3
   1-10  #FD - #FD

  11-160 1,2,...,15,16 - 1
  11-160 #FD - #FD

 При таком формате сектор #FD получается с
битой контрольной суммой, да  и  размер  у
него нестандартный (128*2^253 байт). После
форматирования сканируем  дорожки  и  ищем
битые  сектора, после  чего   заносим   их
контрольные  суммы   в   таблицу.  Таблицу
записываем на 16ый сектор нулевой дорожки.
Контрольные суммы  секторов  будут  разные
для каждой копии  диска  и  воссоздать  их
невозможно.

А  теперь  алгоритм  проверки   диска   на
лицензионность    (процедура    error    -
"обработка" не лицензионного диска):

1. Берём случайное дисло от 1 до 128 - это
  номер проверяемой дорожки;
2. Ищем на ней битый сектор, если его  нет
  вызываем error;
3. Проверяем номер этого сектора, если  он
  не равен #FD - error;
4. Читаем  контрольную  сумму  сектора   и
  сверяем со значением в таблице, если они
  не равны - error;

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


          В продолжение темы...

        Некоторые алгоритмы защиты


  Сегодня Я расскажу о  том, как  защитить
prog'у от всякого рода кнопочек, а  так-же
как изготовить эти самые кнопочки.

  Итак, на  сегодня   известны   следующие
подлые кнопки. (Я сразу буду описывать как
их сделать и как перехватить)

1. Break

 Делается: нажатием Space+Caps Shift

 Перехват: LD IX,ERROR; процедура   выдачи
                     ; сообщения об ошибке
           PUSH IX
           LD (23613),SP
           CALL ..... ;      то, что можно
                     ; остановить Break'ом
           POP IX

  Хочется сказать, что данный пример  есть
процедура перехвата любых ошибок связанных
с  RST  8, т. е. использующих   переменную
err_sp (23613).

2. NMI

 Делается: подачей земли на 17ую ногу Z80

 Перехват: LD HL,ERROR
           LD (23728),HL

3. 48kb RESET (Имеет  смысл  на  пзу  91го
  года, где нет очистки памяти по rst 0)

 Делается: Обычный reset, но при сбросе
           включается пзу с basic 48.

 Перехват: XOR A; Вариант 1 - сброс
           LD (23568),A

                   или

           LD A,1; Вариант 2 - перехват
           LD (23568),A
           LD HL,52
           LD (23730),HL; Переход на
                        ; адрес 24872
           ORG 24872
           JP ERROR

  Подробно    об'ясняю,   как     работает
последний пример. При RESET'е делается  JP
0 в ПЗУ. В пзу стоит проверка:
           .....
           LD A,(23568)
           DEC A
           JP NZ,99;  т.е. если по адресу
                   ; 23568 не 1, то JP 99
                   ; (см.Вариант 1)
           .....
  По адресу 99 стоит пр-ра очистки памяти.
Далее есть фрагмент:
           .....
           LD A,#FE
           IN A,(254)
           RRA
           JP NC,1202; если нажат Caps
                     ; Shift, то сброс
           .....
  По адресу 1202 находится тоже, что и  по
адресу  99. И  наконец   далее   находится
фрагмент:
           .....
           LD HL,(23730)
           LD (HL),62
           DEC HL
           LD SP,HL
           CALL .....
           .....
  Он  нас  и  интересует. Если  по  адресу
23730 будет число меньше #4000 (16384), то
процессор дойдет до первой команды CALL  и
при выходе не вернется на  место  входа, а
перейдет на адрес:
           LD HL,(23730)
           DEC HL
           DEC HL
           LD A,(HL)
           DEC HL
           LD L,(HL)
           LD H,A
           JP (HL)
  Таким  образом, если   в   адрес   23730
запихнуть  значение  52  процессор  возмет
значения из адресов 49 и  50, т. е. #2А  и
#61 и перейдет на адрес #612А (24872)

4. Normal magic

 Делается: нажатие кнопки NMI при работе
           пзу DOS'а

 Перехват: невозможен, но  можно  загадить
диск на который  сбрасывается   программа.
После нажатия Magic срабатывает  процедура
по адресу 102 в пзу  DOS'а. Эта  процедура
делает  копию  памяти  на  диске. Но   она
делает еще кое-что, а если быть точнее, то
после Magic'а по  адресу  23552  находится
#C9. Таким образом делаем проверку:

           LD A,(23552)
           CP #C9
           RET NZ; magic'а небыло!
           DI
           LD A,#3F
           LD I,A
           IM 1
 ERROR     XOR A
           LD (23798),A
           LD (23801),A
           LD (23883),A
           LD C,1
           LD IX,ERROR
           PUSH IX
           LD (23613),SP
           CALL 15635
           XOR A
           LD HL,0
           LD DE,0
           LD BC,9*256+5
           CALL 15635
           POP IX
           .....

5.Scorpion magic

  Ничего сказать не могу, т. к. ни разу не
видел данную машину.

6.Cashe magic

 Делается:  нажатием   кнопки   NMI    при
           включенном Cash'e

 Перехват: Данный Magic отличается от всех
 остальных  тем, что  JP  102  делается  в
 Cashe. Зашита:

           DI
           IN A,(251)
           LD HL,ERROR
           LD A,195
           LD (102),A
           LD (103),HL
           IN A,(123)
           EI

7.Cashe reset

 Делается: нажатием RESET  при  включенном
           Cash'e

 Перехват: DI
           IN A,(251)
           LD HL,ERROR
           LD A,195
           LD (0),A
           LD (1),HL
           IN A,(123)
           EI

    Вот и все, что Я знаю о защите...


              C U, May Be...



Другие статьи номера:

От авторов - Причины задержки номера.

Новости - Состояние дел у Ростовских спектрумистов: Disabler, Klim, Wild, Dimon, The Rom.

Paradox 2k - Информация о ростовской demo-party: paradox 2k

Millennium party - Информация о проведении Минского демопати.

Forever 2E3 results - Финальные результаты.

Софт - Описание компилятора С для спектрума.

Софт - небольшой обзор системного софта: UltraSonic version 2.,Shuffle Commander v1.0, Elastic Copy v1.0, Strange Player v3.0, Screen Mixer v1.0, ZX C++, Smagly 3, Quick Commander 2.4.

Программирование - Алгоритм защиты диска от копирования.

Кодинг - Заливка замкнутой области на экране.

кодинг - Алгоритм спектрального анализа звука в реальном времени.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Ассемблер - Самая быстрая процедура выключения музыки.
FIDO - Эротический задачник.
For Coderz - Маленькие программерские хитрости.
Обзор - о будущем разделе.
Сплошные приколы - Уголовная хроника. 7 самых коротких анекдотов. Рассказ "Мегаполис-экспресс".

В этот день...   21 ноября