DonNews
#11
21 апреля 2000 |
|
Программирование - Алгоритм защиты диска от копирования.
────────────────────────────────────────── 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...
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября