──────────────────────────────────────────
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...