Что я знал приступая к разработке защиты, это то, что уже есть программы копировщики дискет, которые используя команды "Чтение дорожки" и "Запись дорожки" спокойно клонируют дискеты, и с этим что-то нужно было делать.
Уже столкнувшись с защитой программы, которая гоняла головки на дорожки дискеты за 80-ую, я прикинул, что это слишком очевидное проявление. Значит защита должна проверяться не заметно. Самое простое, записать метку на 8-ю дорожку, туда где хранится директорий дискеты, и проверять метку именно при чтении каталога дискеты.
Соответственно, проверка защиты не должна находиться в начале программы (где её легко найти), и срабатывать защита должна не сразу после проверки, а эффект должен быть "отложенным".
Изучая чтение с дискеты, обратил внимание, что сектор на дискете 1КБ, и он читается за один раз в буфер ДОСа, а потом выдаётся блоками по 128 Байт. А так-же обратил внимание, что при копировании файла штатными средствами, копируется в новый файл столько блоков (по 128Байт), сколько их указано в записи директория дискеты.
Вывод напрашивался сам, поместил подпрограмму проверки и обслуживающие её алгоритмы в конец файла, а после записи программы на "защищенную" дискету, уменьшал количество блоков программы. Это делала специальная утилита, которая ставила метку на дискету и записывала саму программу на дискету.
В результате, если просто штатными средствами скопировать программу на КвазиДиск или другую дискету, то программа копируется не полностью, и её запуск в таком виде приводил к сбою ДОС.
Если же программа запускалась с родной дискеты, то в памяти Вектора был тот не достающий кусок, где он был и как я его подтягивал, я уже не помню.
Это был первый уровень защиты, как я извращался, что-бы спрятать обращение к подпрограмме проверки метки и кодировал саму подпрограмму, подробностей уже не помню. Помню, что обращение прятал глубоко в стек, и в явном виде адрес начала подпрограммы в ассемблерном тексте не был виден. И первоначально как-то модифицированный код, просто так не дизассемблировался.
Всё это извращение было направлено только на то, чтобы спрятать чтение дискеты и анализ наличия метки. Т.к. было ясно, что какая бы ни была метка, если станет понятно, в чём защита, повторить её на любой другой дискете не составит особого труда.
Я уже писал, что защита срабатывала отложенно. Если метка не была обнаружена, в основной код программы вносилось изменение, которое через некоторое время приводило к заполнению памяти "мусором" с помощью стека, т.е. сбоил ДОС (если я правильно помню). Ни каких сообщений, что копия программы не официальная.
Собственно о метке на дискете.
Проведя эксперименты с записью и чтением дорожки на дискете, я заметил, что даже на одной дискете, на одном дисководе запись дорожки всегда происходила "со смещением".
Изучив формат дорожки, обнаружил большую область синхробайт в начале дискеты.
Оказалось, что если начать запись дорожки (уже рабочей дискеты с файлами в каталоге), и прервать запись на этой первой области синхробайт, то читаемость дискеты не пострадает. Дискета штатными средствами отлично читалась, писалась, в общем работала как обычно.
Но если попытаться прочитать дискету командой "Чтение дорожки", то после того байта на котором была прервана запись, читался сплошной "мусор". Из-за сдвига фазы (как я подозреваю) у прерванной записи и родного форматирования дискеты, синхронизация не восстанавливалась и информация всей дорожки терялась. Соответственно, не возможно было скопировать дискету штатными копировщиками.
Сама "метка" конечно примитивна, читалось определённое кол-во байт командой "Чтение дорожки", и проверялось наличие не правильных синхробайт, появлявшихся после байта на котором прекращалась запись дорожки при её маркировке.
[свернуть]