Как стать автором
Обновить

Комментарии 30

Оставалось придумать как подписать таблицу ожидаемых длин и такой диск было бы абсолютно невозможно скопировать (не трогая код программы конечно)
В сообщении написано «disk» вместо «disc»
Потому что disc-это круглое, а disk-это квадратное. ;)
На самом деле «disc» — с музыкой, все остальное — «disk». Но потом много чего поменялось…

Переведено промтом? Очень много ошибок.


пустой изменений потоков намагниченности
запись точных поверхностей дисков
выполняется вызов диска для загрузки части загрузчика
И т.п.

Ещё, в вашем контексте fingerprints не надо переводить как «отпечатки пальцев». Там другой смысл. Лучше просто «отпечатки».

Когда-то давно, лет 25 назад, я делал простенькую защиту проги при помощи ключевой дискеты путем записи инфы в сектора нестандартного формата на отдельных дорожках. Штатными средствами эти сектора не считывались, дискета не копировалась, а специальный модуль в защищаемой проге эти сектора нормально считывал.

Когда-то давно, лет 25 назад, была парочка мощных программ копирования защищенных дискет, прилетевшая из Фидо.


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

Это конечно круто, но зачем пытаться копировать, то что не копируется? Легче просто снять защиту. В большинстве случаев было достаточно поменять пару байт :)

затем, если я хочу такой же диск, как у друга? а защита, допустим, с нестандартной длинной сектора, или с информацией между секторами

Я думаю, можно копировать такие диски следующим образом (с применением специализированного оборудования, конечно):
1) Контроллер измеряет скорость вращения диска с высоким разрешением и опорой на собственную тактовую частоту; и
2) подстраивает скорость записи (битовую частоту) таким образом, чтобы на дорожку влезло заданное количество бит в пределах допуска.
3) если оказалось, что записалось недопустимо много больше или меньше бит (это можно проверить путём измерения сигнала датчика индексного отверстия) — то повторять попытку, пока не запишется.

Для этого контроллер должен уметь подстраивать битовую частоту с высоким разрешением. Но для современных микроконтроллеров или FPGA это не проблема.
это можно проверить путём измерения сигнала датчика индексного отверстия

У многих дисководов этот сигнал выдавался от балды, о чем писал Питер Нортон в своей книге. Когда-то — в семидесятые — индексное отверстие действительно совпадало с началом первого сектора на дорожке, потом же стали просто писать сектора при форматировании на первую дорожку с началом в произвольном месте, а на остальные дорожки — ориентируясь на первую.
на первую дорожку с началом в произвольном месте, а на остальные дорожки — ориентируясь на первую

Не совсем так, сколько помню, и FFormat тому яркий пример — он размещал при форматировании дорожки таким образом, чтобы максимально увеличить скорость последовательного чтения (и на слух это звучало как "тук… тук… тук… тук" при стандартном форматировании и "тук-тук-тук-тук" при FF) выигрыш мог быть почти в 2 раза.
А идею с "дублированием в высоком разрешении", думаю, можно реализовать на "слегка модифицированном" LS-120, но это только про 3.5", да и "зачем?"...

Это вроде как через BIOS делалось. Что-то типа: заказываем чтение первого сектора, после того, как получили, смещаем головку и пишет новую дорожку. Как раз получается смещение, чтобы диск не делал лишнего оборота. Но не всегда это работало, потому что контроллеры в самих дисководах были сильно разными.
Всё немного иначе.

Считывание данных с дискет контроллером Intel 8272 может производиться в двух режимах: поиск и чтение отдельного сектора; или чтение дорожки целиком. Именно первый режим использовался для считывания операционными системами. Второй режим использовался только в защитах и спец утилитах.

При поиске сектора сигнал индексного отверстия не используется. Контроллер просто анализирует поступающие с дисковода данные на предмет заголовка нужного сектора. Как только будет найден заголовок — то за ним следуют данные, которые контроллером передаются в систему через DMA. По окончании чтения сектора генерируется прерывание процессора.

Если драйвер дисковода достаточно расторопный — то он может, получив данные одного сектора, сразу дать контроллеру команду на чтение следующего. Таким образом можно прочитать все секторы с дорожки за один оборот диска. Но, если драйвер диска слишком медленно думает — то следующий сектор может проскочить под головкой до того, как драйвер даст контроллеру команду на его считывание. В результате придётся ждать следующего оборота диска и тратить по обороту на каждый сектор, что в разы замедляет скорость чтения.

Если PC работает стабильно медленно, и драйвер дисковода никогда не успевает считать 2 рядом расположенных сектора подряд — то применяется система перемежения секторов — «Interleave». Сектора размещаются на дорожке с чередованием номеров:

1, 6, 2, 7, 3, 8, 4, 9, 5

Приведённая выше последовательность называется «2:1 Interleave». В такой системе, получив от контроллера данные первого сектора, процессор имеет ещё время, пока под головкой пробегает сектор 6, для выдачи контроллеру команды на чтение второго сектора, и при этом второй сектор будет считан на том же обороте диска. Все секторы дорожки можно считать за 2 оборота диска, что хуже, чем 1, но лучше, чем 9 (когда процессор не успевает без Interleave).

Стандартный формат MS-DOS использовал 2:1 Interleave.

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

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

Для борьбы с этим явлением было придумано смещение нумерации секторов на соседних дорожках:

Дорожка 0 — 1, 2, 3, 4, 5, 6, 7, 8, 9
Дорожка 1 — 9, 1, 2, 3, 4, 5, 6, 7, 8
Дорожка 2 — 8, 9, 1, 2, 3, 4, 5, 6, 7

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

Подобные форматы дискет можно было реализовать только спец утилитами. Стандартные команды форматирования в DOS и Windows это не поддерживали и форматировали все дискеты с 2:1 Interleave.
У многих дисководов этот сигнал выдавался от балды, о чем писал Питер Нортон в своей книге

Можно пруф? Я не встречал ни одного исправного дисковода, который бы выдавал индексный сигнал от балды.

Индексный сигнал при работе дисковода необходим для следующих вещей:
1) Маркировать начало и конец записи во время форматирования: запись дорожки целиком ведётся от индекса до индекса;
2) Вести счёт оборотам диска при поиске сектора на дорожке. Если сектор не был найден после заданного числа индексных импульсов — то контроллер выдаёт ошибку «Sector not found».
3) Маркировать начало и конец считывания для операции «чтение дорожки целиком». Правда, эта операция в операционных системах обычно не использовалась, а использовалась только в защитах и сервисных утилитах для анализа и восстановления дисков.

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

Форматирование дорожки — это просто её полная перезапись, включая индексные метки секторов, преамбулы для настройки ФАПЧ, промежутки между секторами и индексными метками и т.д. При форматировании некоторые контроллеры (напр. КР1818ВГ93) позволяют произвольным образом задавать структуру, расположение и содержание данных на дорожке. При этом можно разместить секторы произвольных размеров в произвольной последовательности, не обязательно начиная с первого. Возможно, именно это явление описывалось у Нортона.

Индексный сигнал дисковода используется контроллером дисковода при форматировании. Контроллеры на всех PC были одинаковые — это микросхема Intel 8272. В более поздних вариантах она была интегрирована в микросхемы чипсета, но логика её работы осталась неизменной.

Таким образом, если на каких-то дисководах индексный сигнал формируется не от датчика положения диска — то на таких дисководах, как минимум, будет невозможно форматирование дискет. Как максимум — драйвер будет зависать в случае ошибки чтения вида Sector Not Found.
В 1990 году мне рассказывали про метод «прокола иголкой».
Прокалываем дискету, ищем где сбой чтения и этот адрес вписываем в прогу. И теперь она работает только с этого диска.
Уж и не знаю насколько это было эффективно.
Это делалось промышленным способом, только кололи не иголкой, а жгли лазером, и не абы где, а в нужном месте конвейерным способом. Помню, изучал комплект 3,5” дискет для школьного класса с какой-то обучалкой — дырка еле-еле была видна на просвет, но находилась в одной и той же позиции. Скорее всего, сначала жгли гибкий носитель с закрепленной на нем металлической фигней, потом упаковывали в корпуса, потом — на дупликатор.
Еще гулял достаточно crasy метод:
— форматируем дорожку каким-либо форматом, пишем нужное
— начинаем форматировать эту же дорожку другим форматом и прерываем операцию к моменту окончания записи заголовка

чтобы считать содержимое — требуется опять же начать и успеть прервать форматирование нужным (известным) форматом… соответственно расставив точки останова или попытавшись пошагово пройтись — необратимо убьём содержимое.
Во времена, когда такого рода защиты были популярны, был копир, которому было абсолютно наплевать на это все. Идея была проста и очевидна — уйти от цифры. Два диска на одном шинделе, две головы и чисто аналоговый способ переноса намагниченности поверхности. А дырки в дисках, на этой же штуке, стали делать при помощи оптопары и иголки на соленоиде. Что касается длины дорожки, то посмотрев на формат дорожки становится все понятно Pre_gap — sector — gap — sector… Остаток дорожки. Играясь размерами гапов можно было выгадать на дорожке ещё несколько сотен байт для хранения чего нибудь «нужного», а фактическая длина дорожки измеряема. Уж сейчас не вспомню последовательность байт, но смысл простой — ставим размер сектора заведо больше, читаем последний сектор. При проходе индесного отверстия чтение завершается с ошибкой, но в буфере остаётся все что считано. По изменению в последовательности можно вычислять длину дорожки с точностью до полубита. Один из моих модулей в дипломной работе как раз этим и занимался. Правда задача решалась другая — определить мы все ещё на том же хосте работаем или уже попробовали на другом запустить. 95 год :-):-):-):-)
Проблема этого копира была в его малой доступности. Этак возможно пара штук на город-миллионник. Поэтому он как таковой в расчет особо не брался…
Хотя 95 год… уже наверное коммерциализировался в том числе и рынок пиратки. Правда и CD-диски пошли уже.
Для 5.25 собирался ручками за вечер, в общем-то…
CD уже были. Только, зараза, дорогие — и сами приводы, и диски пиратские, так что народ в 1995 больше пиратил на дискетах. Но на CD той поры встречались интересные вещи. Например, одна софтина ставилась только с дискет, которые нужно было менять (отслеживалось открытие дверцы), и в дискете, видимо, была та самая «дырка». Так вот, на CD лежали образы дискет, а к ним прилагалась специальная программа для записи образа и последующей «порчи» нужного сектора.
Софтинка была «недоланной» :-) были «неприятные» софтинки, которые наличие дырки проверяли записью сектора :-(
Уж не «Лексикон» ли?
Не, какая то бухгалтерия. И, как ни странно, это было не совсем пиратство. Софтинка была честно купленной и умела деинсталлироваться, увеличивая счётчик на еденичку. Но разработчики почему то считали, что умерший носитель обязывает клиента купить софтину ещё раз. Кончилось банальным пиратством — один раз восстановил носитель, потом инсталляция, снанпшот, деинсталл, вернуть снанпшот (задумался… а ведь тогда и термина такого не было ведь :-)), деинсталл и так далее. На итерации так 10ой я сдался и бросил это занятие, тем более что это была просьба от друзей, а не заработок. :-)
По-моему в 95-96 уже на сотню развалов на митинском рынке 1-2 были с дискетами, остальные торговали «болгарами» и «золотом».
В Москве — может быть, тем более, что пиратка, в основном, оттуда по стране расходилась. У нас же CD как-то так массово появились в 1996, сначала — с игрушками и с комплектами Windows 95 + Office 95. Ставить 95-ую «Винду» с офисом с дискет — то еще удовольствие…
Ну это для тех кто Novell Netware 2.15 не ставил)
Дык и Windows 95 с дискет ставили, и OS/2. «Винда» вообще имела нестандартный формат дискет, и не на каждую 3,5” 1.44 Mb ее можно было писать. Просто народ стал ленивым, и потребовал установки с CD, тем более, что железо потихоньку стало дешеветь.
Сложная защита с точки зрения попытки копирования «как есть», но элементарная с точки зрения создания взломанной версии. Достаточно изменить один байт — операцию сравнения, чтобы всегда происходил переход как если сравнение показало совпадение таблиц длин.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации