Введение
Недавно я затеял одиссею по изучению защит гибких дисков
В своих предыдущих постах я уже рассказывал (напрямую или косвенно) о примерах интересных схем защиты гибких дисков:
- Слабые биты. [ссылка: Weak bits floppy disc protection: an alternate origins story on 8-bit]. Защита «слабыми битами» реализуется так: часть поверхности диска оставляется пустой изменений потоков намагниченности. В условиях отсутствия сигнала привод гибких дисков повышает коэффициент усиления своего усилителя и видит шум, проявляющий себя как недетерминированные цифровые сигналы с диска.
- Нечёткие биты. [ссылка: Technical Documentation — Dungeon Master and Chaos Strikes Back — Detailed analysis of Atari ST Floppy Disks]. При защите «нечёткими битами» изменения потоков намагниченности записываются с интервалами, отличающимися по времени от спецификации (например, MFM). Благодаря использованию интервалов прямо посередине пары ожидаемых значений (например, 5 мкс вместо ожидаемых 4 мкс или 6 мкс) можно заставить контроллер дисков возвращать недетерминированные цифровые сигналы.
- Длинные/короткие дорожки. [ссылка: Turning a £400 BBC Micro (1981) into a $40,000 disc writer (1987)] [см. раздел «Capabilities Unlocked»] [Перевод статьи на Хабре]. При защите длинными дорожками запись переходов намагниченности выполняется чуть быстрее, чем обычно. Это может быть целая дорожка или только её часть. В любом случае, будет казаться, что дорожка содержит больше байтов, чем обычно должно быть в дорожке. Такая защита работает, потому что у контроллера гибких дисков обычно есть широкий допуск на битрейт, чтобы учитывать тот факт, что дисковые приводы естественным образом крутятся на разных скоростях.
В этой статье мы рассмотрим совершенно иную защиту, обладающую уникальными особенностями, которая мне кажется довольно изобретательной.
Western… что?
Не так легко найти компанию «Western Security, Ltd.», связанную с компьютером BBC Micro. Как же понять, что она существует? Во-первых, при разработке моего эмулятора beebjit [ссылка] я сделал множество ошибок и получил кучу багов. Разбираясь с точной эмуляцией гибких дисков, чтобы иметь возможность загрузки оригинальных защищённых образов дисков, я наткнулся на следующее:
Игра Jolly Jack Tar компании Sherston Software
Разумеется, автор оригинала не мог учесть такой ситуации. Дело или в неисправном диске (это не так), или в незаконной копии (не совсем правда)… или в эмуляторе с багами. Вот ещё один экран ошибки. Вероятно, это более ранняя версия схемы защиты? В сообщении написано «disk» вместо «disc» и даже не учитывается то, что диск может быть повреждён:
Игра Phantom Combat компании Doctor Soft
(Я рискую сильно отклониться от темы, но вот ещё один скриншот. Он не связан с Western Security Ltd., но на нём тоже представлен специальный экран, отображаемый при сбое защищённого загрузчика диска. Этот случай интересен тем, что при обычной работе пользователь не увидит такого замечательного изображения!)
Такое сообщение показывает Disc Duplicator 3, если считает, что создаётся незаконная копия
Во-вторых, мы знаем название Western по маркерам дубликаторов дисков. Маркер дубликаторов дисков — это специальная дорожка, написанная одним из коммерческого ПО для дублирования дисков. Обычно это одна дорожка после конца обычного диска, например, 41-я или 81-я дорожка диска. Несмотря на то, что она находится «вне пределов» диска, большинство приводов дисков ищет хотя бы одну дорожку за его границами. На этой дорожке обычно можно найти один заголовок сектора и тело сектора с ошибкой CRC. Это необычная конструкция, которая выявляется, например, когда моя программа discbeast [ссылка] изучает диск Jolly Jack Tar:
Просмотр Jolly Jack Tar в Discbeast
В маркере дубликатора есть дата и одна-две текстовые строки. В случае Jolly Jack Tar это:
86 07 01 (1986, July 1st)
523-037E WESTERN NM,10/256 PROT DUP 5"-48/40 1S SD SS
32173-2Aw
Существует и ещё одна менее распространённая строка маркер дубликатора, связанная с Western security, например, в Tens and Units компании Sherston Software. Похоже, это более ранняя версия-прототип:
85 10 31 (1985, October 31st)
523-037C BBC NM,10/256 WESTERN SEC. PROTO1 DUP 5"-48/40 1
70422-00w
Вкратце повторим основы защиты дисков
Прежде чем начать разбираться в работе защиты Western Security, давайте повторим основы защиты дисков. Существуют различные специфические нюансы, но в целом принцип довольно прост:
- Диск легко считать, но сложно записать.
Диск должен относительно легко считываться. Если диск не может считываться стандартными контроллерами дисков, то вы не сможете продать диск, потому что покупатели не смогут его загрузить!
А правильный способ обеспечения сложности записи дисков заключается в тщательном изучении чипов потребительских контроллеров дисков и приводов дисков, чтобы диск было невозможно записать стандартным оборудованием.
Защита дисков BBC Micro не пошла по этому пути — первые диски, а также многие последующие диски были экзотичными, но их было не особо сложно создать при помощи стандартного контроллера дисков. Однако требовалась специальная программа. У компаний-производителей ПО, в отличие от пользователей, была их специальная программа мастеринга, поэтому в этом смысле диск было «сложно» записать. Но позже, когда появились стандартные программы копирования наподобие Disc Duplicator 3, диски внезапно оказалось копировать «легко», если у вас или у друга была продвинутая программа для копирования дисков.
Однако некоторые первопроходцы BBC Micro действительно записывали диски, которые «нельзя» записать при помощи стандартного контроллера дисков. Наиболее примечательные из них:
- Схема со слабыми битами Саймона Хослера, ссылка есть выше. (И здесь: [ссылка].) [1]
- Многие диски, например, The Sentinel компании Firebird, прятали данные между секторами. [2]
[1] Одна из основных задач контроллера дисков — запись точных поверхностей дисков, т.е. никогда не записывать слабые биты. Однако в современную эпоху я нашёл способ хитростью заставить контроллер Intel 8271 записывать слабые биты. Насколько я знаю, эта техника не была открыта и не использовалась в те времена.
[2] Я думаю, что при умном программировании данные между секторами можно записывать стандартными контроллерами дисков. Для этого потребуется выполнять запись на дорожку несколько раз и сбрасывать контроллер дисков в критические моменты времени. Однако я не встречал старых программ копирования дисков, пытавшихся копировать такие диски.
Анализ защищённого загрузчика Western Security Ltd.
В этой версии The Wizard's Revenge компании Sherston Software используется защита диска Western Security Ltd.
Вот скриншот из игры.
А вот, что делает с диском discbeast:
Здесь нет ничего особо необычного. Красный блок в конце обозначает дорожку с одним сектором, имеющим ошибку CRC. Это не часть защиты диска, а маркер дубликатора. Зелёным цветом обозначена стандартная схема секторов, в которой нет ничего особо экзотичного. Буквой «D» обозначено наличие удалённых секторов. Это защита диска, но она не экзотична и не сложна в копировании. Однако при загрузке диска в мой эмулятор beebjit при помощи контроллера гибких дисков Western Digital WD1770 и -log disc:commands
мы получаем нечто весьма необычное:
info:disc:1770: command $E4 tr 1 sr 3 dr 1 cr $29 ptrk 1 hpos 1884
Команда $E4 обозначает «считать дорожку». Она не используется при обычном выполнении загрузки диска, да и в любом другом известном защищённом загрузчике.
Настало время немного разобраться в загрузчике, чтобы понять, что происходит. Цель этого поста заключается не в подробном описании всех мельчайших деталей загрузчика. Как и многие защищённые загрузчики, он «зашифрован», а точнее обфусцирован. Деобфускация производится им самостоятельно при помощи множества слоёв самомодификации. На PC $0657 выполняется вызов диска для загрузки части загрузчика из удалённых секторов в дорожке 9. Подобное легко можно спутать с частью защиты, но это не так. Ниже, на PC $3CF7, есть цикл:
[ITRP] 3CF7: JSR $3D16
[ITRP] 3CFA: LDA $75
[ITRP] 3CFC: SEC
[ITRP] 3CFD: SBC $3F4E
[ITRP] 3D00: TAX
[ITRP] 3D01: LDA $86
[ITRP] 3D03: STA $3F71,X
[ITRP] 3D06: INC $75
[ITRP] 3D08: LDA $3F4F
[ITRP] 3D0B: CMP $75
[ITRP] 3D0D: BCS $3CF7
Я не ожидаю, что его назначение будет понятно из данного фрагмента (без всех подпроцедур), но здесь в цикле обходятся дорожки с 1 по 8 включительно. Каждая дорожка полностью считывается и длина дорожки сохраняется в таблице по адресу $3F71. Ниже, на PC $3CB6, эти длины сравниваются с таблицей, расположенной по адресу $3D9B. Эта проверка особенно интересна. Чтобы защита от копирования считалась выполненной, подсчитывается количество дорожек, длина которых находится в пределах ±1 от ожидаемой, и это количество должно быть равно 7 или 8. Мы сразу же видим, что эта защита не является точной технологией. И этого стоило ожидать: диски являются аналоговыми носителями, поэтому в начале и конце дорожки присутствует немного шума. При разных считываниях один и тот же диск на одном приводе и контроллере может демонстрировать незначительные вариации длин дорожек. Посмотрев на загрузку в beebjit, можно увидеть подсчитанные и ожидаемые длины. (0x4A == 3122 байта.)
Перехват с моего диска:
3F71: 4A 4D 4B 4A 4B 4D 4D 4A
Ожидания:
3D9B: 4A 4C 4B 4A 4B 4D 4C 4A
Как видите, мои считывания с диска почти в точности равны ожидаемым, за исключением дорожки 2, на которой насчитали 3125 байт вместо ожидаемых 3124. Эта разность находится в интервале погрешности ±1, поэтому проверку прошли все 8 дорожек (а требуется 7 или больше).
Объясню подробнее: защищённый загрузчик ожидает, что длина дорожек с 1 по 8 (в байтах закодированных частотной модуляцией) должна быть равна 3122, 3124, 3123, 3122, 3123, 3124, 3123, 3122. Это невероятный уровень точности и прецизионности записи для технологий 1985 года. Каждый байт занимает на вращающемся диске примерно 64 мкс, но для приводов дисков той эпохи часто указывали отклонение RPM (оборотов в минуту) «меньше ±1,5%». При 300 об/мин, ±1,5% — это ±3 мс на оборот! По моему опыту, приводы обладают гораздо большей точностью, но тем не менее! Как с этим справлялись технологии 1985 года?
Дополнительное примечание о контроллерах дисков WD1770 и Intel 8271. Мы сосредоточились на анализе защиты на контроллере WD1770. Этот диск также нормально загружается на контроллере Intel 8271. В нём используется совершенно другой путь выполнения кода, чтобы в данном случае вычислять длину дорожек косвенно. Это удалось сделать, потому что все байты-заполнители, записанные до конца дорожки, равны 0x00, а не обычному значению 0xFF. Используется «чтение с выходом за границы» последнего сектора дорожки, а длина дорожки определяется по смене считываемых значений с 0x00 на 0xFF.
Гениальный ход
И потом мы осознаём гениальность этой схемы. Что если они не записывали дорожки с чрезвычайной точностью, потому что таких технологий ещё не существовало? Что если они просто записывали дорожку любым способом, а затем изучали результат? Думаю, создатели защиты делали следующее:
- Форматировали диск. (И всё — достаточно обычного форматирования диска, и вы получите ужасно сложно защищённый диск.)
- Считывали длины дорожек 1-8 диска, которые только что были записаны.
- Для каждого диска генерировались, обфусцировались и записывались в загрузчик на дорожке 9 соответствующие таблицы ожидаемых длин дорожек.
Вот так хитрость! Такие диски ужасно сложно копировать, даже имея специализированное оборудование той эпохи. На самом деле, этот трюк настолько хитёр, что из-за него нам нужно вернуться к самим основам защиты дисков. Вот что мы говорили ранее:
- Диск должно быть легко считывать, но сложно записывать.
Однако защиту Western Security Ltd. довольно легко записать, достаточно отформатировать диск. Поэтому, вероятно, мы должны сказать:
- Диск должно быть легко считывать, но сложно воссоздать.
Защиту Western Security легко записать, легко считать, но очень сложно скопировать. Одно из преимуществ такой защиты заключается в том, что для экономии можно записывать её на обычном домашнем компьютере. Тем не менее, многие диски, с которыми я сталкивался, имели маркеры дубликаторов, обычно оставляемые дорогими машинами дублирования дисков.
Чем мы можем подтвердить свою теорию? Например, найти второй диск с той же игрой The Wizard's Revenge и посмотреть, отличаются ли они. Я нашёл диск, и да, они отличаются. Мой первый диск, который рассматривался выше:
Track 0 sectors 10 length 3124 fixups 1 CRC32 2E6B86E9
Track 1 sectors 10 length 3122 fixups 0 CRC32 37E30EC8
Track 2 sectors 10 length 3125 fixups 1 CRC32 F7BDE89B
Track 3 sectors 10 length 3123 fixups 0 CRC32 BB1E32C3
Track 4 sectors 10 length 3122 fixups 1 CRC32 2EC84AF1
Track 5 sectors 10 length 3123 fixups 0 CRC32 58FD732B
Track 6 sectors 10 length 3125 fixups 0 CRC32 43416F5A
Track 7 sectors 10 length 3125 fixups 1 CRC32 B3D8AB10
Track 8 sectors 10 length 3122 fixups 1 CRC32 8D02AC32
Track 9 sectors 10 length 3125 fixups 1 CRC32 75B1F57B
Track 10 sectors 10 length 3123 fixups 1 CRC32 D2B0A1EF
[...]
Другой диск:
Track 0 sectors 10 length 3126 fixups 1 CRC32 2E6B86E9
Track 1 sectors 10 length 3129 fixups 1 CRC32 37E30EC8
Track 2 sectors 10 length 3127 fixups 1 CRC32 F7BDE89B
Track 3 sectors 10 length 3127 fixups 1 CRC32 BB1E32C3
Track 4 sectors 10 length 3127 fixups 1 CRC32 2EC84AF1
Track 5 sectors 10 length 3129 fixups 1 CRC32 58FD732B
Track 6 sectors 10 length 3129 fixups 1 CRC32 43416F5A
Track 7 sectors 10 length 3128 fixups 1 CRC32 B3D8AB10
Track 8 sectors 10 length 3128 fixups 1 CRC32 8D02AC32
Track 9 sectors 10 length 3127 fixups 1 CRC32 1F5ABD44
Track 10 sectors 10 length 3128 fixups 0 CRC32 D2B0A1EF
[...]
Как мы видим, данные секторов (указанные в CRC32) дисков одинаковы, за исключением дорожки 9, на которой хранится таблица ожидаемых длин дорожек. А длины самих дорожек отличаются. В обоих случаях присутствуют колебания длин дорожек, а в случае второго диска дорожки чуть длиннее. Это значит, что привод, форматировавший диск, работал с чуть меньшим RPM, позволяя записать больше байтов за один оборот.
Есть и второй способ подтверждения нашей теории. Я спросил у Саймона Хослера, написавшего в 1980-х много игр для Sherston Software, помнит ли он какие-нибудь подробности. Он рассказал следующее:
«Western Security создавал не я, но думаю, она работала так… Она работала потому, что каждый привод дисков работает на своей скорости. Поэтому когда привод создаёт дорожку на диске, то после добавления всех заголовков, секторов и прочего, остаётся немного незаполненного пространства, куда он записывает немного „заполняющих“ битов, которые ничего не делают. Количество заполняющих битов зависит от точной скорости форматирующего привода. Поэтому при копировании оно будет отличаться. Помню, эта система доставляла много проблем, потому что приводы дисков постоянно менялись (?). [...] систему называли „Fingerprinting“»
Остаётся загадкой, как с созданием таких дисков мог справляться коммерческий дубликатор. Я нашёл отсылки к скрипту «Freeform» [ссылка], использовавшемуся совместно с дубликаторами Trace. Мне не удалось найти руководства по этому скриптовому языку. После деобфускации в памяти загрузчика остаются какие-то странные фрагменты, возможно они как-то с ним связаны?
3F80: 54 70 00 41 44 44 20 20 20 20 20 72 00 4D 4F 56 Tp.ADD r.MOV
3F90: 45 54 4F 20 20 74 00 55 4E 49 54 20 20 20 20 75 ETO t.UNIT u
3FA0: 00 54 52 41 43 4B 20 20 20 76 00 53 45 43 54 4F .TRACK v.SECTO
3FB0: 52 20 20 77 00 54 4F 50 54 52 41 43 4B 78 00 55 R w.TOPTRACKx.U
Воссоздание защищённых дисков в стиле Western Security
У меня завалялась пара сильно отличающихся приводов дисков, поэтому я решил их попробовать. Я отформатировал диск в каждом приводе, затем посмотрел на длины дорожек (в байтах), считанных контроллером дисков WD1772 в реальном компьютере BBC Micro model B.
Первый претендент: мой привод Chinon F-051MD. Это более старый привод, всего с 40 дорожками и только односторонний. Механизм дверки с защёлкиванием позже вышел из моды (может, был менее надёжным?). Ещё один способ его датировки — крупный основной чип в стиле DIP. Это NEC D8048, который был клоном Intel 8048! (В нём есть ROM, который мне когда-нибудь ещё предстоит извлечь!)
Второй претендент: не мой Mitsuibish MF504C, но довольно похожий. Гораздо более новый привод, с 80 дорожками и двухсторонний. Обратите внимание на более новые чипы, опрятную проводку и упрощённый механизм защёлкивания. Здесь этого не видно, но у него ещё и шаговый двигатель меньшего размера (следующее поколение?).
Длины дорожек с Chinon F-051MD:
[...]
Track 1 sectors 10 length 3137 fixups 1 CRC32 67F0950E
Track 2 sectors 10 length 3138 fixups 1 CRC32 67F0950E
Track 3 sectors 10 length 3138 fixups 1 CRC32 67F0950E
Track 4 sectors 10 length 3139 fixups 1 CRC32 67F0950E
Track 5 sectors 10 length 3138 fixups 1 CRC32 67F0950E
Track 6 sectors 10 length 3140 fixups 1 CRC32 67F0950E
Track 7 sectors 10 length 3140 fixups 1 CRC32 67F0950E
Track 8 sectors 10 length 3139 fixups 1 CRC32 67F0950E
Track 9 sectors 10 length 3140 fixups 1 CRC32 67F0950E
Track 10 sectors 10 length 3140 fixups 1 CRC32 67F0950E
[...]
Длины дорожек с Mitsubishi MF504C:
[...]
Track 1 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 2 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 3 sectors 10 length 3118 fixups 0 CRC32 67F0950E
Track 4 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 5 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 6 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 7 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 8 sectors 10 length 3119 fixups 1 CRC32 67F0950E
Track 9 sectors 10 length 3118 fixups 1 CRC32 67F0950E
Track 10 sectors 10 length 3119 fixups 1 CRC32 67F0950E
[...]
Эти два привода определённо имеют уникальные «отпечатки пальцев»! У более старого привода присутствует чуть больше вариативности/колебаний в длинах отдельных дорожек. На самом деле, похоже, что в последних секторах он может уместить больше байтов на дорожку — большинство последних дорожек имеет длину 3142. Кроме того, старый привод обычно может уместить 20 или чуть больше байтов на дорожку. Это означает, что он вращается чуть медленнее. Более новый привод работает как часы, с минимальными флуктуациями длин дорожек. Из-за этого он чуть меньше подходит для генерации уникальных для каждого диска «отпечатков пальцев», но копирование диска на домашнем компьютерном оборудовании всё равно будет сложным — в используемой машине должен быть установлен привод с точно такой же прецизионностью, и привод должен работать точно с такой же скоростью, что и при записи оригинального диска.
В последний раз взглянем на длины дорожек, на этот раз с диска игры Phantom Combat компании Doctor Soft. В этом диске используется защита Western Security Ltd.:
Ничто так не свидетельствует о слишком переусложнённой защите дисков, как наклейка с предупреждением о совместимости (слева посередине). На наклейке написано, что поддерживаются только ROM-ы дисков Acorn. К сожалению, ROM-ы дисков других компаний были распространены намного больше.
[...]
Track 1 sectors 10 length 3152 fixups 0 CRC32 67F0950E
Track 2 sectors 10 length 3152 fixups 1 CRC32 67F0950E
Track 3 sectors 10 length 3152 fixups 0 CRC32 67F0950E
Track 4 sectors 10 length 3152 fixups 1 CRC32 67F0950E
Track 5 sectors 10 length 3151 fixups 0 CRC32 67F0950E
Track 6 sectors 10 length 3152 fixups 0 CRC32 67F0950E
Track 7 sectors 10 length 3150 fixups 0 CRC32 67F0950E
Track 8 sectors 10 length 3151 fixups 0 CRC32 67F0950E
[...]
Это и есть защита диска, скрытая под самым нашим носом. Это 8 защищённых дорожек, которые на самом деле являются дорожками с совершенно стандартным форматированием (CRC32 67F0950E). В них правильное количество секторов и там нет удалённых секторов. Программа discbeast отобразит эти дорожки сплошным зелёным цветом, то есть скажет, что ничего необычного в них нет!
Длина дорожек немного колеблется, а кроме того, дорожки необычно длинные (в идеале их длина составляет 3125 байтов). Не совсем понятно, намеренно ли дорожки записывались чуть длиннее, но это определённо помогает защите дисков. Любой привод дисков, который будут использовать для воссоздания этих дорожек, вряд ли будет вращаться с такой скоростью, потому что она на 0,8% медленнее, а технология двигателей приводов дисков обычно даёт результаты лучше. Интересно заметить, что простая защита длинными дорожками является всего лишь ещё одним вариантом в схеме Western Security.
Вероятно, этот диск записывался на самом BBC Micro, а не на какой-то сложной машине для дублирования: об этом говорит отсутствие маркеров дубликаторов; кроме того, секторы данных игры свидетельствуют, что их записывали посекторно, а не по дорожкам. Кто знает, возможно разработчики намеренно стремились найти медленный привод; у некоторых старых приводов даже есть крутящийся регулируемый резистор для изменения скорости двигателя.
Заключение
В статье мы рассмотрели самую мощную схему защиты дисков BBC Micro model B среди всех, найденных мной в процессе изучения большинства дисков с защитой от копирования, выпущенных для этой машины. Очень хитро, что для создания или считывания диска не требуется специализированного оборудования. Однако с дублированием диска возникнут проблемы.
Подозреваю, что даже современное оборудование, например, Greaseweazle, будет испытывать проблемы с достижением побайтовой точности; необходимо дополнить его высококачественным приводом дисков, вращающимся с очень стабильной скоростью (например, моим Mitsubishi MF504C).
Я снова поговорил с Саймоном, и насколько он знает, защиту реализовал Джордж Килинг, с которым бы я хотел связаться только затем, чтобы похвалить его за потрясающую работу.
Автор: PatientZero