За несколько десятилетий ЭВМ эволюционировали от «100 квадратных метров площади, 25 человек обслуживающего персонала и 30 литров спирта ежемесячно» до вполне миниатюрных образцов: Commodore-64, Atari 800XL, Apple II, Электроника БК-0010… Проблема была в цене: все эти модели весьма били по карману рядовому обывателю (примерно как покупка автомобиля).

Всё изменил Клайв Синклер, выпустивший на рынок ZX Spectrum – первый дешёвый персональный компьютер. Спектрумы продавались ударными темпами: только в одной Англии за неделю приобретали порядка пятнадцати тысяч машин. Причём, помимо и так недорогой версии «в сборе», покупателям предлагался удешевлённый вариант в виде отдельных комплектующих – эдакий конструктор «Собери сам».



Схема была достаточно быстро скопирована и спектрум-подобные ПК начали производить по всему миру. Только на просторах СССР существовали десятки официальных клонов («Москва», «Ленинград», «Зеленоград», «Балтика», «Пентагон» и многие другие) и сотни неофициальных. Спаять такой девайс был в состоянии любой уважающий себя радиолюбитель (конечно, при наличии всех комплектующих, которые добывались на радио-рынках и через знакомых). К слову, импортным в таком компьютере мог быть только процессор: «мозгом» Спектрума был Z80, разработанный фирмой Zilog в 70-х годах и получивший широчайшее распространение по всему миру: от персональных компьютеров до противокорабельных ракет. А с 1991 года на просторах уже России был налажен выпуск отечественных «реплик» Z80 – первые экземпляры маркировались Т34ВМ1, последующие – КР1858ВМ1.

Но как использовать персональный компьютер в 80-е? На нём можно изучать принципы программирования, печатать тексты… и играть. Что и делало большинство владельцев Spectrum. Спрос родил предложение: на свет появилось множество фирм, занимающихся разработкой программного обеспечения и видеоигр. И все они хотели заработать, однако распространение программ через пиратские копии неприятно нарушало бизнес-планы. Разработчики пытались защитить свои продукты от копирования, пираты учились обходить защиту. Противостояние продолжается и по сей день: вернёмся в прошлое и посмотрим, с чего же всё начиналось.

Защита игр, распространяемых на компакт-кассетах


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


Количество игр и оформление явно говорит нам, что кассета пиратская

Скопировать игру с такого носителя было элементарно: достаточно было обладать двухдековым магнитофоном и чистой кассетой для записи. Впрочем, последнее не обязательно: кассеты можно было и перезаписывать, однако это негативно отражалось на качестве, поскольку бытовые магнитофоны не могли полностью размагнитить ленту, чтобы стереть с неё предыдущие данные. Условной защитой была защелка, выломав которую можно было запретить перезапись кассеты… но установка сложенной бумажки или картонки в нужное место легко решала эту проблему.

Защита от копирования на кассетном уровне


Единственным работавшим «кассетным» способом защиты от прямого копирования было использование более высокочастотного кодирования, которое делало невозможным создание копии на непрофессиональном оборудовании в домашних условиях. Также можно встретить упоминания о способе проверки подлинности кассеты путём анализа уровня шума на «чистых» участках: при записи на промышленном оборудовании фирменных кассет пишущая головка в промежутках между файлами могла быть отключена, и лента оставалась первозданно чистой, тогда как при копировании в кустарных условиях работа стирающей головки неминуемо повышала уровень шума даже на «пустых» участках. Однако на практике такая защита встречалась крайне редко, тем более что даже навскидку этот способ выглядит достаточно проблемным из-за устаревания магнитной ленты и различной чувствительности считывающих устройств.

Некоторые производители пытались обмануть пользователей, размещая на кассетах предупреждающие надписи и, иногда, меняя внешний вид магнитной ленты (только визуально, чтобы отпугнуть пиратов).


Работало это примерно так

Описанные выше способы могли работать только для игр или программ: защитить от копирования кассеты с музыкой было невозможно (во всяком случае, не внося существенных изменений в конструкцию кассеты и магнитофона). Так что проблема незащищённости магнитной плёнки беспокоила не только разработчиков видеоигр и программного обеспечения, но и звукозаписывающие компании. В 1980-х годах в США и Европе была даже запущена антипиратская кампания «Домашняя запись убивает музыку», но попытки отпугнуть людей от копирования виниловых пластинок и аудиокассет не снискали особого успеха. Во многом спасал положение тот факт, что при копировании через двухдековый магнитофон (а уж тем более – при записи музыки с радиотрансляции) страдало качество, особенно, если копирование производилось не с оригинала. Поэтому активные движения по защите от аудиопиратства были начаты только с переходом на CD-диски, копии которых уже ничем не отличались от исходника.
Немного большего успеха добились производители видео-контента: для VHS-кассет фирмой Macrovision был разработан вполне действенный механизм защиты от пиратства. На каждую защищённую плёнку помимо основной информации записывались импульсы помех, которые пропускались видеомагнитофонами при воспроизведении, но вызывали ошибки при копировании и оцифровке.

Для игр, записанных на магнитную ленту, такой метод был бы неприемлем. Любые помехи приводили к ошибке «R Tape loading error», что было весьма прискорбно, если игра почти загрузилась. Но высокая чувствительность к помехам в некотором роде уже служила своеобразной защитой: потеря качества при перезаписи с плёнки на плёнку приводила к тому, что копии, особенно выполненные на низкокачественном оборудовании, не всегда читались. Гораздо более серьёзные последствия по сравнению с потерей качества при копировании аудиокассет: там хоть что-то было слышно…

Поэтому более грамотный (и долгий) способ заключался в копировании содержимого кассеты в память компьютера и последующую запись на чистую плёнку с первозданным качеством через дополнительное устройство – Datasette (хотя можно было воспользоваться и кассетным магнитофоном с линейным выходом). И от этого уже можно было попытаться защититься!


Тот самый Datasette

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

Защита от копирования на программном уровне


Естественно, что сам исходный код тоже шифровался (причём в первую очередь): это было сделано как против пиратов, так и против не чистых на руку коллег, которые бы могли подсмотреть способ реализации той или иной функции. Код запутывали, внедряли в него «пустышки» и излишние переходы, находили и использовали не задокументированные команды, кодировали с использованием машинного кода. Наиболее часто используемой защитой была «ксорка» – логический оператор ассемблера XOR, выполнявший операцию исключающего ИЛИ между всеми битами двух операндов. Как это работало: предположим, у нас есть некая последовательность битов: 100110. Если взять в качестве “ключа” 011000, то, применяя операцию XOR, мы получим на выходе 111110 (0 и 1 вместе дают 1, 0 и 0 — 0, 1 и 1 — тоже 0). Зная ключ, мы легко восстановим из зашифрованной последовательности верную, а вот не зная… тоже восстановим, конечно, но не очень легко.

А если учесть тот факт, что в некоторых играх количество этих «ксорок» доходило до нескольких сотен, становится понятно, что восстановить верную последовательность было очень нелегко. Чаще всего кодирование производилось не вручную, а через специальные утилиты: например, Alcatraz protection.

От шифрования постепенно переходили к динамической защите: программы начали содержать самогенерирующиеся части (генерация происходила, к примеру, в результате каких-либо арифметических действий). Дошло до того, что программы генерировали исполняющий код, а затем сразу же затирали его.

Последнее работало против ещё одного распространённого способа «взлома» кода: через остановку исполняющего кода и просмотр содержимого, находящегося в текущий момент времени в памяти компьютера. Выполнялся такой взлом через дополнительное периферийное устройство в виде картриджа – мультифейс, подключаемый к системному разъему компьютера. Изначально такие картриджи использовались программистами для отладки их собственных творений, но очень быстро стали популярны в среде пиратов.


Мультифейс — маленькое устройство, но большой шаг для пиратства!

Для защиты от мультифейсного копирования создатели игр начали использовать постепенную загрузку уровней, что требовало уже многократного копирования памяти для получения полного образа игры. Наиболее же эффективным способом борьбы с таким «взломом» было исключение самой возможности остановки программы. Зачастую при попытке остановки защищённой игры на экран выводилось послание, стиль которого разнился от насмешки до угрозы… или просто подписи – например, CRACKED BY BILL GILBERT (псевдоним известного польского взломщика, оставившего свой след на большинстве игр, знакомых спектрум-геймерам на просторах СССР).

Да-да, пираты тоже защищали свои кассеты от дальнейшего тиражирования! Распространение нелицензионных копий тогда было не делом идеи, а вполне себе бизнесом: если пустая кассета стоила порядка двадцати рублей, то кассету с игрой можно было продать уже не меньше чем за сто.

Ещё один вариант «программной» защиты препятствовал не копированию, но запуску на «нелицензионных» компьютерах. Так, в Бресте был собран свой клон Спектрума – ПЭВМ «Байт», под который выпускались специальные кассеты с программами и играми. От запуска на любом спектрум-совместимом компьютере, кроме «Байта», их оборонял «Церикопик», проверяющий процедуру обработки немаскируемого прерывания, которая у «Байта» и оригинального Спектрума отличалась. Вторая версия «Церикопика» обращалась к определённому байту в ПЗУ, а самая продвинутая вычисляла быстродействие компьютера в нижней и верхней памяти, чтобы сравнить её с эталонной. Если проверка проваливалась, на экран выводилось сообщение «Покупайте компьютер Байт» и загрузка программы прекращалась.


Если проследить эволюцию первых программных методов защиты информации, видно, что противостояние пиратов и разработчиков привело к весьма любопытным техническим решениям. И хоть на первый взгляд они никак не затрагивали конечного пользователя и не влияли на производительность, был один нюанс: чем сложнее становилась защита, тем больше места она занимала на кассете в ущерб основному коду.

Защита игр на дискетах


В 1985 году на рынок был выпущен Beta Disk Interface – контроллер, позволяющий подключить к Спектруму дисковод. Примечательной особенностью этого интерфейса была «волшебная кнопка» – Magic Key – нажатие на которую осуществляло запись всей памяти компьютера (все ОЗУ и содержимое регистров процессора) в отдельный файл на дискете. Теперь для прямого копирования игр не обязательно было обладать мультифейсом! Таким способом можно было делать копии даже защищённых игр, причем исходный носитель роли не играл: копировали как старые программы с компакт-кассет, так и новые, поставляемые уже на дискетах.


Beta Disk и та самая кнопка Magic

Однако, проанализировав работу «волшебной кнопки», можно было увидеть, что при копировании на дискету были пропущены несколько ячеек памяти – те самые, которые использовал сам интерфейс, не имевший собственной оперативной памяти. Производители игр начали вставлять в код проверку содержимого этих ячеек и использовать их для хранения наиболее важной информации.

Никуда не ушли и рассмотренные выше способы: шифрование исходного кода и нестандартная запись на магнитный носитель. Применительно только к дискетам практиковалась также запись информации на нестандартные участки, обычно используемые для служебных записей (структура дорожек, длина секторов и т.д.). Изменяли длину и количество секторов: например, вместо 16-ти секторов по 256 байтов, записывали 3 сектора по 1024 байта, 2 по 512 и один на 256 байта.

Ещё одним новшеством в кодировании дискет от копирования стала защита «плавающими битами», которая базировалась на возможности создания бита с промежуточным значением (не 0 и не 1). При чтении такой бит в части случаев считывался как 0, а в части – как 1. Проверялось наличие такого бита банальным многократным считыванием одного и того же участка дискеты.

Способ Вячеслава Медноногова


Один из советско-российских разработчиков игр для спектрум-совместимых компьютеров, выпустивший на рынок «Дурака», «НЛО» и ряд других проектов, придумал свой оригинальный способ защиты. Заключался он в намеренном нанесении дефектов на лицензионные дискеты, полностью повторить которые на пиратских дискетах не представлялось возможным. Сам Вячеслав царапал лицензионные дискеты, некоторые его последователи довольствовались уколом иглы.


Справа видна карандашная отметка — таким образом отмечен предел, выше которого царапать было нельзя

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

Защита без привязки к носителю


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

Одним из наиболее известных способов был Lenslok. Заключался он в следующем: в определённый момент на экран выводились перепутанные линии, которые можно было расшифровать при помощь специальной призмы. А призма шла в комплекте с лицензионной кассетой – изготовить её подделку в кустарных условиях было задачей нетривиальной.
Способ был придуман и запатентован Джоном Фростом и больше всего запомнился благодаря использованию в старой игре Elite. Широкого распространения Lenslok не получил, в том числе из-за проблем с масштабируемостью: на очень больших телевизорах невозможно было расшифровать код с помощью маленькой призмы. К тому же, из-за ошибки поставщика, примерно 500 копий Elite в начале продаж были укомплектованы не той призмой.


А даже если и той, видно было… не очень

Другие способы получили большее распространение, хотя смысл у них был точно таким же, как и у Ленслока: для подтверждения обладания лицензионной копией геймерам необходимо было подтвердить обладание труднокопируемыми приложениями к кассетам или дискетам. Например, ввести код с определённой страницы мануала (правда, не все проекты указывали конкретную страницу – иногда ответ приходилось поискать). Да, сейчас защита через бумажное руководство кажется примитивной, однако в 80-90-е годы ХХ века скопировать дискету или кассету было, порой, проще, чем скопировать цветную книжку…

Больше всего запомнились, конечно, оригинальные попытки, предлагающие выйти за рамки «найди на пятой странице третье слово в пятом абзаце». Так, у Pool of Radiance в комплекте шёл бумажный круг, при помощи которого можно было перевести последовательность рун в буквы, которые и разблокировали дальнейшее прохождение уровня. А в Alone in the Dark 2 вместо кругов использовались цветные карты с прорезями, совмещая которые можно было получить требуемый код.


В Ultima издатели пошли дальше и снабдили каждую лицензионную копию высококачественной тканевой картой игрового мира, по которой можно было определять координаты городов (и вводить их в качестве ответа на каверзные вопросы по ходу сюжета).


Ещё целый пласт игр задавал геймерам самые разные вопросы, ответы на которые были в бумажном мануале: например, какому вымышленному государству принадлежит тот или иной герб, как это было в Populos – первом симуляторе бога от Питера Молиньё. Иногда вопросы касались реального мира: например, в There in the World is Carmen Diego? геймерам приходилось отвечать на каверзные вопросы по типу «Сколько людей проживает в Замбии?».
Конечно, в современных реалиях попытаться ответить можно и без печатного мануала, но в 90-е далеко не у всех были свежие энциклопедии с данными о населении Замбии в 1990-м году. Да и если число будет хотя бы на тысячу отличаться от заложенного в программе, игра просто закроется.

Впрочем, не всегда провал проверки приводил к вылету игры: иногда разработчики просто усложняли прохождение нелицензионной копии. Или пытались воззвать к совести пиратов. Судя по тому, что пиратство не заглохло, а лишь сильнее расцвело с появлением в нашей жизни новых технологий – безрезультатно.

Источники


ТЫК




Возможно, захочется почитать и это:


Разрабатывайте и развивайте свою игру (и не только) с помощью облачного хостинга для GameDev

Комментарии (64)


  1. nikitaGlobal
    24.03.2024 15:13
    +8

    Когда увидел заголовок вспомнил "опознай самолет" в F19, номер девушки из телефонной книги "Leisure suit Larry III" и т.д.
    Автору спасибо, про аппаратные защиты и про призмы не знал.
    В первом Ларри вопросы были скорее на определение совершеннолетия и касались широко известных фактов, например, как расшифровывается название фирмы "ИБМ" или кто из исполнил какую-то песню.
    В игре "Budokan" при входе нужно было сопоставить текст на японском с гербом, причем иероглифы соответствовали моменту в который нажимаешь кнопку на заставке, я разучил на определенной секунде нажимать пробел и получать одно известное мне сочетание герба и текста.
    Была еще популярна о том что игроделы закладывают вирусы, которые активируются при неправильных ответах на эти вопросы.


    1. chieftain_yu
      24.03.2024 15:13
      +3

      Вроде, силуэты надо было определять и в F-117A.

      Но да, спасибо этой проверке - силуэты запоминались накрепко.


    1. Wolframium13
      24.03.2024 15:13
      +1

      Вспомнил спэйс квест с Роджером Вилко, там были координаты для гиперпрыжка или чот такое.


  1. Tagar
    24.03.2024 15:13
    +3

    их оборонял «Церикопик», проверяющий процедуру обработки немаскируемого прерывания, которая у «Байта» и оригинального Спектрума отличалась.

    NMI в Спектруме не использовалось вообще. Оно использовалось внешними устройствами, такими, как контроллер дисковода. Совершенно непонятно, о какой "процедуре обработки NMI" идет речь.


    1. IvanovII
      24.03.2024 15:13
      +1

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


      1. Tagar
        24.03.2024 15:13
        +1

        NMI на Z80 генерируется аппаратно.


        1. IvanovII
          24.03.2024 15:13
          +1

          К сожалению не осталось никаких следов от той эпохи, чтобы посмотреть листинг кода, даже название забыл напрочь. В книжках по архитектуре на русском примерно тоже самое было написано про немаскируемые прерывания, только БГ (тот самый) точно знал что именно происходит при вызове команды на самом деле, поскольку куда дальше переносился адрес исполнения, мне узнать не удалось


    1. tormozedison
      24.03.2024 15:13
      +4

      NMI нашёл применение в продвинутых клонах, насчёт «Байта» не знаю (а это клон очень продвинутый), но у «Орели БК-08» одна из кнопок прямо называется NMI, там можно в любой момент вытащить на экран отладчик, покопаться в содержимом ОЗУ, и вернуться обратно в работавшую перед этим программу.


      1. Tagar
        24.03.2024 15:13
        +2

        Это сколько угодно. Но это уже не каноничный Спектрум, и программы, расчитанные на особенности советских клонов (да еще и определенных, а не всех), никто не писал.

        Да и реализована эта кнопка была аппаратно, а не программно. Из программного кода вызвать NMI невозможно - в системе команд Z80 нет для этого команды.


        1. Leopotam
          24.03.2024 15:13

          Еще как писали. У меня как раз был такой - ZS Scorpion 256 с аппаратным отладчиком. Там так же происходила запись в определенные регистры и вызов прерываний для переключения страниц. Вот этим и пользовались, записывая мусор, что приводило либо к подвисанию, либо к рестарту.


          1. Tagar
            24.03.2024 15:13

            Я правильно понял, что целенаправленно писали программы, результатом деятельности которых было подвисание либо рестарт?


            1. Leopotam
              24.03.2024 15:13

              Да, но там много делать не нужно было, достаточно было поправить адрес в блоке памяти, куда писались настройки принтера и прочий мусор, а в скорпионе было модифицированное местами пзу - переход в итоге делался по новому адресу в пзу, который в итоге приводил к переходу в 0 (reset). Точнее сказать уже не смогу, последний раз эту железку видел более 25 лет назад.


              1. Tagar
                24.03.2024 15:13

                Возможно, вопрос был неправильно понят.

                Зачем может понадобиться писать программу, результатом деятельности которой будет подвисание либо рестарт?

                В Скорпионе модифицированное ПЗУ - да пожалуйста, хоть сто порций, там не только ПЗУ модифицировано, но и сама схема, архитектура немного, но отличается от классического Спектрума. Но в Спектруме, несмотря на наличие ошметков подпрограммы в ПЗУ, которая должна обслуживать NMI, это самое NMI, да и сама эта подпрограмма никак, нигде и никогда не используются. Следовательно, на оригинальном Спектруме вызвать NMI невозможно ну совсем никак - на ногу процессора не приходит сигнал, она не распаяна, висит в воздухе (немного утрирую, но пусть), на него ничего не подается, и кнопки никакой нет. Да, нештатное использование буфера принтера или области системных переменных может вызвать ресет Скорпиона - но не срабатывание NMI. На Скорпионе NMI генерируется аппаратно - и все тут. Могу ошибаться, со Скорпионом дела никогда не имел, но мне кажется, что теневой монитор на Скорпионе невозможно вызвать даже через запись в какой-то порт какого-то значения. Еще раз - могу ошибаться, но там теневой монитор вызывается только аппаратным рубильником. Ну, на крайний случай - сочетанием клавиш, которое обрабатывается все-таки аппаратно, и подает сигнал на ногу процессора NMI.


                1. Leopotam
                  24.03.2024 15:13

                  Нет, имелось ввиду, что после настройки пары циферок и нажатия на апаратную кнопку отладчика происходил множественный переход с конечным адресом в 0. Это не мешало обычной работе и срабатывало только при попытке входа в сервис-монитор.


                1. qw1
                  24.03.2024 15:13
                  +1

                  Следовательно, на оригинальном Спектруме вызвать NMI невозможно ну совсем никак - на ногу процессора не приходит сигнал, она не распаяна, висит в воздухе (немного утрирую, но пусть), на него ничего не подается, и кнопки никакой нет

                  Я кстати кнопку припаивал между ногой CPU NMI и GND. Настраивал обработчик, чтобы он выходил в BASIC, и так можно было ломать сложные загрузчики. Они там делают 100500 ксорок, а ты потом жмёт кнопку и получаешь код расшифрованным.


    1. qw1
      24.03.2024 15:13
      +3

      В оригинальном ROM была ошибка в обработчике NMI, псевдокод
      IF (*5CB0) != 0 THEN RETN ELSE JP (*5CB0)
      Из-за чего NMI мог перейти только на адрес 0, т.е. сделать RESET
      В клонах это исправили, заменив 1 байт на
      IF (*5CB0) == 0 THEN RETN ELSE JP (*5CB0)
      Некоторые защиты проверяли именно этот патченный байт.


  1. SadOcean
    24.03.2024 15:13
    +3

    Вроде похожая (аналоговая) защита была в Star Control II.
    Вместе с игрой шла космическая карта, и для старта нужно было ответить на вопрос о позиции определенной звезды.


    1. axe_chita
      24.03.2024 15:13

      Если ты играл в взломанный Star Control II, и тебе нужно было по сюжету лететь в систему координаты которой у тебя спрашивали при старте, то игра вешала комп. Было ли это задумано изначально разработчиками, или создатели кряка не докрутили неизвестно.


  1. tormozedison
    24.03.2024 15:13
    +1

    Дискеты не только царапали и протыкали иглами, но и дырявили лазерами, преимуществом становилось отсутствие выпуклостей, опасных для голов дисковода.


    1. MaFrance351
      24.03.2024 15:13
      +1

      Причём использовалось это и в куда более серьёзном ПО. У меня есть софт для старой платы шифрования с вот такой вот защитой от копирования.


    1. tbp2k5
      24.03.2024 15:13

      Защита через дискеты с дефектами - так себе: с одной стороны лицензионный продут довольно скоро становился нерабочим - дискеты не долговечны, а с другой - защита полезной программы относительно легко ломается (и напрямую и через свой обработчика на int13h)


      1. ruomserg
        24.03.2024 15:13
        +1

        Да ну! Уж если народ на это шел - то обычно программировался контроллер дисковода через порты ввода-вывода... Кто ж серьезную защиту через bios будет делать...


        1. tbp2k5
          24.03.2024 15:13

          Насколько я помню, программы которые навешивали защиту - таким баловались (типично чтобы нестандартно отформатировать дискету), а вот то, что шло в продажу обходилось стандартными прерываниями (иначе не везде-бы работало...)


          1. qw1
            24.03.2024 15:13

            До Windows повсеместно использовалось программирование железа через порты (прежде всего, графика, VGA/EGA/CGA). А уж контроллер FDD и его порты были очень даже стандартными.


            1. tbp2k5
              24.03.2024 15:13

              Согласен. И я таким баловался. Но вот вот случаев низкоуровневого чтения через прямое программирование контролера я могу припомнить единицы: помниться был любопытный вариант защиты где дискета не портилась но защитные метки писались (и читались) в меж-секторном пространстве..


              1. qw1
                24.03.2024 15:13

                я могу припомнить единицы

                На PC я ни разу не сталкивался вживую с защитой дискет. Но тогда мне не нужен был коммерческий софт, переписанные дискеты приходили из 10-х рук, и приходило только то, что точно копировалось.

                Позже, в начале 2000-х, были защиты (StarForce), которые работали с контроллером CD-ROM напрямую. Вряд ли пользователи точно знали все подробности. Также и в дискетные времена могли не догадываться, а как именно в их программе устроена защита.

                в меж-секторном пространстве..

                Не очень эффективно, потому что были копировщики, которые читали дорожку в RAW виде и писали её так же.


      1. adeshere
        24.03.2024 15:13

        Защита через дискеты с дефектами - так себе: с одной стороны лицензионный продут довольно скоро становился нерабочим - дискеты не долговечны, 

        Мы это решали просто: при штатном использовании программы ключевая дискета запрашивалась раз в несколько месяцев. Если программу переставляли на другой комп, или при других очень существенных изменениях в окружении первый запрос происходил почти сразу же после этого (в течение недели-двух), а потом (при удачном исходе проверки) опять раз в полгода. Так что на время жизни программы одной дискеты обычно хватало ;-) Кроме того, мы почти сразу стали давать каждому юзеру не одну ключевую дискету, а пару. Но это скорее не на случай порчи дискеты, а потому, что каждый дисковод уникален: у нас были случаи, когда поцарапанная дискета на каком-то дисководе не работала штатно. А вот чтобы не сработали сразу обе - не бывало ни разу.

        защита полезной программы относительно легко ломается (и напрямую и через свой обработчика на int13h

        Это имеет смысл, если ты потом можешь взломанную программу продать. А в нашем случае продукт был сверхузконишевый. Фактически все потенциальные юзеры даже в 1980-е годы знали друг друга лично либо по публикациям (программа у нас русскоязычная полностью, поэтому она ходила и до сих пор ходит почти исключительно в FUSSR; отдельные пользователи-коллеги, уехавшие за бугор, не в счет). Так что защита была скорее моральным стимулом, чем

        реальной необходимостью

        Точнее, в самый начальный момент мы действительно опасались, что кто-то нашу программу попытается перепродать. Но это было актуально только в самый первый момент (насколько я помню, это был 1988 год). Потом по мере появления публикаций в журналах, развернутой встроенной справки с самодельным контролем четности (т.е. отредактировать инфу об авторах сложно), и, главное, налаженной системы выпуска новых версий этот риск очень скоро

        свелся к нулю

        Тем более, что цена лицензии совершенно не стимулировала какую-то нелегальщину. За программу, которая становилась основным рабочим инструментом на многие годы, мы просили две месячные зарплаты,

        но только не наши

        а того сотрудника, который будет пользоваться продуктом. Поэтому для научных организаций оплата была символической (какие были зарплаты в науке в 90-е годы, напоминать вряд ли нужно). А вот при продаже программы в банк мы пару раз получили неплохую надбавку к зарплате ;-)

        Впрочем, эта лафа быстро закончилась, так как банки очень скоро перешли на специализированное ПО, которое может и хуже прогнозировало ряды, но зато несоизмеримо лучше интегрировалось в остальную банковскую инфраструктуру данных, а главное,

        гораздо лучше подходило для текущей рутины

        Ключевое отличие в том, что у нас каждый набор рядов уникален. Мы их получаем годами, поэтому можем потратить кучу времени для ручного "вылизывания" данных, "вклеивания" в модель априорной физики, оптимизации ее параметров и т.д. Основное время у нас уходит на уточнение или замену моделей при поступлении новых данных, их интерпретацию и т.д. В общем, у нас центральная фигура - это эксперт, а программа - это набор лопат, которыми он может копать круглые, продолговатые или какие-то совсем уж изощренные "ямы" по Клейну. Прогноз в нашей схеме - это скорее побочный эффект хорошей модели, и он часто гораздо менее интересен, чем внутренняя структура модели. Этот подход резко контрастирует с задачами оперативного прогнозирования параметров временного ряда в банке, где модель обычно настраивается один раз (желательно полуавтоматически), а затем в реальном времени выдает новые числа по мере поступления данных. То есть нужны не изыски, а готовая "яма".

        Но пережить самые трудные времена эти продажи нам действительно помогли.

        Ну и во-вторых, у нас запрос ключевой дискеты происходил стохастически и довольно редко. А вызовы  int13h в программе были на каждом углу. Поэтому сажать профессионала на взлом, чтобы он несколько дней искал нужный вызов (или, еще хуже, ждал, прока он произойдет), было бы экономически нерентабельно. Тем более, что там еще и некоторые другие методы маскировки использовались. Несмотря на всю их простоту, при взломе ведь надо было все это понять, а это тоже рабочее время неплохого профессионала.


  1. ifap
    24.03.2024 15:13
    +2

    однако в 80-90-е годы ХХ века скопировать дискету или кассету было, порой, проще, чем скопировать цветную книжку…

    Никто и не копировал книжку целиком, просто прикладывали к игре текстовой файлик с парами вопрос/ответ.


    1. qw1
      24.03.2024 15:13
      +1

      Чтобы получить все возможные пары вопрос-ответ, нужно покопаться в коде, то есть взломать загрузчик и расшифровать основной модуль игры. Если зашли так далеко, можно и полностью отключить ввод паролей.


  1. tbp2k5
    24.03.2024 15:13
    +2

    IMHO Фото вашего "Datasette " - магнитофон к Commodore 64. С64 шел с таким кассетником или с дисководом (в более жирной конфигурации)


    1. Tagar
      24.03.2024 15:13
      +7

      Кассета с Кашпировским тоже, кажется, не от Спектрума.


  1. adeshere
    24.03.2024 15:13
    +6

    > Способ Вячеслава Медноногова

    А в каком году это было?

    Мы так свою самодельную программу (не игру) защищали: к ней тоже прикладывалась вручную поцарапанная гвоздиком (хорошо, иголкой) ключевая дискета ;-)

    А поскольку мы все это придумывали и писали, сидя в горной памирской глухомани, и в полном отрыве от "Большой земли", то были уверены, что мы это все сами изобрели... Интернетов-то тогда в наших краях не существовало. Хотя, с высоты современного опыта, начинаешь понимать, что глючные дискеты тогда не только у нас были. А от глючной (и потому уникальной) дискеты до описанной технологии и вовсе полшага. Так что такая мысль наверняка почти одновременно сразу во многие головы приходила...

    У меня даже сохранилась программа, которая гоняла такую дискету на нескольких дисководах и накапливала статистику по плохо читающимся секторам (она на каждом дисководе была своя, разумеется). Затем автоматически выбирались "плохие" и "хорошие" сектора, которые наиболее стабильно воспроизводили ошибки чтения-записи (или их отсутствие) на разных дисководах. Потом они жестко прописывались в exe-шнике, который компилировался специально под каждую такую дискету.

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

    А вот та самая функция проверки ключевой дискеты на древнем фортране

    Как видно из алгоритма, проверка была довольно лояльной, чтобы учесть индивидуальные особенности разных дисководов. Единственное, прошу прощения, но я так и не смог победить "умный" редактор Хабра, который катастрофически портит фортрановский код при вставке, глотая пробелы и отступы

    в случайных местах

    Причем в буфере обмена все хорошо: в любой другой редактор код вставляется совершенно корректно... А что наделал хаброредактор, видно по циклу do ниже... И с длинными строками фигня какая-то...

    UPD: А еще символы "*" в операторах описания переменных полетели... А вверху должна быть ровная красивая рамка-прямоугольник. А чуть ниже - операторы типа "logical*1 function ...". Прям зла не хватает! Но время правки на исходе.

    Специально оставил все как есть, т.к. простых способов вставить код корректно у меня не нашлось. А применять "сложные" (т.е. сидеть править каждую строчку вручную) не хочу, так как тогда администрация Хабра точно проблему проигнорирует. А так может вдруг все-таки кто-то что-то подкрутит?

    Надеюсь, что особый стиль автоформатирования кода, присущий редактору Хабра, не помешает вам улыбнуться, читая комментарии в этой функции ;-) Кстати, у меня она все еще компилируется (фортран!), и даже работала бы, если б не умер последний дисковод тех времен. Правда, это уже не самая первая версия функции из примерно 1988г, а скорее последняя - из 1996. Но разница там минимальная. Кстати, в "продакте" этот код работал чуть ли не до 2010г, когда последние юзеры нашей проги перешли с DOS-версии на виндовую (в которой мы уже отказались от "детских болезней" с ключами и пр.).

    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    C Идентификация ключевой дискеты: C
    C.......................................................................C
    logical1 function readtest_set(ndrv) integer4 readtest,i,err,ntest, count
    parameter (ntest=3)
    integer2 ndrv2, good(ntest), bad(ntest)
    c
    c Чтобы настроить программу на работу с конкретной дискетой, надо
    c тут указать номера хороших и плохих секторов
    data bad/ 2361,2541,2685 /, good / 2362,2542,2686 /
    c
    c !Параметры дискетки
    c
    c За 10+ ошибок в хорошем секторе -1 очко
    c За 0 ошибок в хорошем секторе +1 очко
    c За 100+ ошибок в плохом секторе +3 очка
    c За 10+ ошибок в плохом секторе +2 очка
    c За >1 ошибок в плохом секторе +1 очко
    c За 0 ошибок в плохом секторе -1 очко
    c Каждая пара bad+good дает максимум +4 очка, минимум -2 очка.
    c В процессе проверки надо набрать +4 очка из 9 возможных
    c Если достаточно окажется 1-2-х проверок, третью не проводим:
    c
    count=0

        do i=1,ntest
           err=readtest(good(i),ndrv)
           if (err.gt.9)  count=count-1
           if (err.eq.0)  count=count+1
           if (count.ge.4) exit
    

    c
    err=readtest(bad(i),ndrv)
    if (err.eq.0) count=count-1
    if (err.gt.1) count=count+1
    if (err.gt.9) count=count+2
    if (err.gt.99) count=count+3
    if (count.ge.4) exit
    end do
    c
    c
    readtest_set=(count.ge.4)
    return
    end

    Будучи скопированным на другую дискету, такой exe-шник, разумеется, не работал ;-) Точнее, он запускался, и даже делал вид, что работает, но код с результатом проверки, который он возвращал основной программе, был "паленым". Впрочем, юзеру она ничего об этом не сообщала, а просто уменьшала вероятное время ожидания следующей проверки ключа вдвое. То есть, при получении правильного кода программа запрашивала ключевую дискету в следующий раз через несколько месяцев (сам момент запроса, естественно, выбирался случайно), но если она получала неправильный код 2-3 раза подряд, то запросы ключевой дискеты становились все чаще, вплоть до нескольких раз в день. А поскольку тестирование секторов на такой дискете требовало времени (до 5 минут) и сопровождалось жуткими звуками ;-), то это начинало ощутимо мешать, так как продолжить работу можно только после окончания проверки. В результате у нас даже не было необходимости придумывать какие-то санкции для пиратов: программа продолжала работать при любом исходе проверки. Но сам по себе факт запроса дискеты несколько раз в день уже был достаточной санкцией ;-)

    А стохастичность проверок плюс невозможность простым способом определить, "паленый" или корректный код возвращает этот exe-шник в основную программу, здорово затрудняли взлом. Конечно, трюки совсем простые и доморощенные, но именно в силу этого очень трудно вскрываемые ;-) Хотя если честно, мы сделали это все больше из развлечения и для собственного развития, чем по необходимости. Так как взлом нашей защиты был тогда почти настолько же актуален, как

    ловля неуловимого Джо

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

    Однако, наличие ключевой дискеты собственного дизайна придавало нам некоторую уверенность, а программе солидность ;-) Да, интересное время было...


    1. adeshere
      24.03.2024 15:13
      +3

      Время на редактирование вышло уже, поэтому добавлю картинку (которая должна была быть в прошлом сообщении) ответом на свой же пост. В общем, приведенный чуть выше исходный код на самом деле (в редакторе) должен

      вот так выглядеть (скриншот)
      Некорректно вставляющийся код
      Некорректно вставляющийся код

      Кстати, только сейчас заметил несоответствие комментариев коду: максимально одна пара bad+good дает не +4 очка, а +7: +1 за good и еще +1+2+3=6 за bad. Так что потенциально даже одной итерации цикла должно хватить, а не двух, если в bad-сектрое ошибок достаточно.

      Судя по всему, код функции я менял для "облегчения" прохождения проверки (это точно было), а вот комментарий привести в соответствие позабыл. Стандартный баг ;-)

      P.S. Я понимаю, что тут сайт рассчитан прежде всего на крутых перцев, которые на лету (пока фотоны движутся от монитора к глазам), автоформатируют любой код на любом языке, вставляя в нужные места недостающие символы), а все ошибки и опечатки (типа пропавших звездочек) нейросеть корректирует прямо в ганглиозных пластинках сетчатки. Но, сейчас во всем мире тренд на доступную среду. Не пора ли и администрации хабра

      сделать небольшой шажок в эту сторону?

      Я имею в виду всяких чайников, у которых упомянутые выше навыки пока что недостаточно развиты? Или отсутствуют вовсе в зародыше, как в моем случае? Нельзя ли все-таки дать возможность таким товарищам с ограниченными возможностями, то есть нам, просто копировать свой исходный код из обычного текстового редактора в редактор хабра через буфер обмена as is, то есть не подвергая его высокохудожественным преобразованиям? Ну вот нет у меня правильного творческого вкуса, не понимаю я некоторые формы "современного искусства" (и уже видимо не пойму).

      Можно, я просто нажму Ctrl+V и код вставлю?


      1. nick758
        24.03.2024 15:13
        +1

        Fortran можно вставить как код без указания языка, подсвечен он не будет, но по крайней мере не поедет.

        Пример кода
        C AREA OF A TRIANGLE - HERON'S FORMULA
        C INPUT - CARD READER UNIT 5, INTEGER INPUT, NO BLANK CARD FOR END OF DATA
        C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
        C INPUT ERROR DISPAYS ERROR MESSAGE ON OUTPUT
          501 FORMAT(3I5)
          601 FORMAT(" A= ",I5,"  B= ",I5,"  C= ",I5,"  AREA= ",F10.2,
             $"SQUARE UNITS")
          602 FORMAT("NORMAL END")
          603 FORMAT("INPUT ERROR OR ZERO VALUE ERROR")
              INTEGER A,B,C
           10 READ(5,501,END=50,ERR=90) A,B,C
              IF(A=0 .OR. B=0 .OR. C=0) GO TO 90
              S = (A + B + C) / 2.0
              AREA = SQRT( S * (S - A) * (S - B) * (S - C) )  
              WRITE(6,601) A,B,C,AREA
              GO TO 10
           50 WRITE(6,602)
              STOP
           90 WRITE(6,603)
              STOP
              END


        1. adeshere
          24.03.2024 15:13

          @nick758, спасибо за пример, но у меня так не получается. Проблема не в выборе языка, а в том, что код у меня портится в момент вставки из буфера обмена. То есть еще до того, как я могу щелкнуть по кнопке "<>" и что-то там выбрать.

          Возможно, у меня с буфером обмена что-то не то? Он как-то неправильно с хабраредактором взаимодействует? Вот для примера я скопировал Ваш код из поста, и попробовал вставить.

          Просто копипаста:

          C AREA OF A TRIANGLE - HERON'S FORMULA C INPUT - CARD READER UNIT 5, INTEGER INPUT, NO BLANK CARD FOR END OF DATA C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT C INPUT ERROR DISPAYS ERROR MESSAGE ON OUTPUT 501 FORMAT(3I5) 601 FORMAT(" A= ",I5," B= ",I5," C= ",I5," AREA= ",F10.2, $"SQUARE UNITS") 602 FORMAT("NORMAL END") 603 FORMAT("INPUT ERROR OR ZERO VALUE ERROR") INTEGER A,B,C 10 READ(5,501,END=50,ERR=90) A,B,C IF(A=0 .OR. B=0 .OR. C=0) GO TO 90 S = (A + B + C) / 2.0 AREA = SQRT( S * (S - A) * (S - B) * (S - C) ) WRITE(6,601) A,B,C,AREA GO TO 10 50 WRITE(6,602) STOP 90 WRITE(6,603) STOP END

          Уточню, что немедленно после вставки весь этот фрагмент у меня уже автоматически помечен, как код, причем без указания языка. То есть, предположительно схема глюка такая:

          1) Я копирую фрагмент текста из буфера обмена в хабраредактор

          2) Храбро-редактор автоматически распознает вставляемый фрагмент, как код на неизвестном языке,

          3) Редактирует (удаляя лишнее), затем форматирует его в соответствии со своими представлением о прекрасном

          4) Вставляет отредактированный и отформатированный код

          Наверно, я правда чего-то совсем простое не догоняю.

          Но что именно?!

          UPD: Или, может, мне в браузере какие-то настройки подкрутить надо? У меня просто стандартный Хром, обновляемый, с Ad-блоком. Больше

          ничего особенного нет.

          Винда - десятка...

          UPD2:

          Черт возьми, еще одна мысль!

          А вдруг это то самое, которое уже началось?! Только совершенно иначе? Мы ждали от ИИ какую-то жесть, а вместо этого зарождающийся новый разум пытается, в меру своего развития, создать нечто прекрасное?


    1. adeshere
      24.03.2024 15:13
      +1

      Покопался в своих архивах - и там, неожиданно, нашлась такая ключевая дискета с царапкой! Я их в свое время наделал с большим запасом, потом истрачены были не все. Это уже одна из последних партий, "наиболее современный" форм-фактор, 2002 год ;-)

      Царапка на дискете не кажется прозрачной - она действительно просвечивает ;-)
      Царапка на дискете не кажется прозрачной - она действительно просвечивает ;-)

      ;-)

      А вот "протокол тестирования" той самой дискеты на нескольких дисководах

      Disk 344202.

      Selected bad: 2113, 2437, 2725
      Selected ok: 2112, 2436, 2727

      2077+ 2113+ 2149+ 2167+ 2185+
      2203+ 2221+ 2239+ 2257+ 2275+
      2293+ 2311+ 2329+ 2347+ 2365+
      2383+ 2401+ 2419+ 2437+ 2455+
      2473+ 2491+ 2509+ 2527+ 2545+
      2563+ 2581+ 2599+ 2617+ 2635+
      2653+ 2671+ 2689+ 2707+ 2725+
      2743,

      ****>>>> Testing Sectors From 0 to 2880
      sect: read_err: write_err: total: 386

      2041 0 1 1 386A

      2077 145 438 583 486
      2077 178 453 631 386
      2077 431 459 890 386A
      2077 443 436 879 486A
      2077 512 0 512 486MAIL
      2077 512 0 512 5CARE
      2077 512 0 512 5HOME
      2077 512 0 512 5HOMEA

      2095 0 261 261 486
      2095 512 0 512 5HOME

      2113 441 330 771 486A
      2113 466 490 956 386A
      2113 467 325 792 486
      2113 474 493 967 386
      2113 512 0 512 486MAIL
      2113 512 0 512 5CARE
      2113 512 0 512 5HOME
      2113 512 0 512 5HOMEA

      2131 83 189 272 486A
      2131 303 364 667 486
      2131 512 0 512 5HOME
      2131 512 0 512 5HOMEA

      2149 445 503 948 386A
      2149 457 401 858 486A
      2149 466 407 873 486
      2149 470 504 974 386
      2149 512 0 512 486MAIL
      2149 512 0 512 5CARE
      2149 512 0 512 5HOME
      2149 512 0 512 5HOMEA

      2167 185 0 185 386A
      2167 200 0 200 386
      2167 222 245 467 486A
      2167 328 400 728 486
      2167 512 0 512 486MAIL
      2167 512 0 512 5CARE
      2167 512 0 512 5HOME
      2167 512 0 512 5HOMEA

      2185 215 508 723 386A
      2185 226 508 734 386
      2185 446 363 809 486A
      2185 460 399 859 486
      2185 512 0 512 486MAIL
      2185 512 0 512 5CARE
      2185 512 0 512 5HOME
      2185 512 0 512 5HOMEA

      2203 249 193 442 386
      2203 265 196 461 386A
      2203 334 412 746 486
      2203 366 280 646 486A
      2203 512 0 512 486MAIL
      2203 512 0 512 5CARE
      2203 512 0 512 5HOME
      2203 512 0 512 5HOMEA

      2221 439 417 856 486A
      2221 465 454 919 486
      2221 503 508 1011 386A
      2221 512 0 512 486MAIL
      2221 512 0 512 5CARE
      2221 512 0 512 5HOME
      2221 512 0 512 5HOMEA
      2221 512 508 1020 386

      2239 249 501 750 386A
      2239 379 401 780 386
      2239 407 434 841 486
      2239 418 412 830 486A
      2239 512 0 512 486MAIL
      2239 512 0 512 5CARE
      2239 512 0 512 5HOME
      2239 512 0 512 5HOMEA

      2257 408 415 823 486A
      2257 512 0 512 486MAIL
      2257 512 0 512 5CARE
      2257 512 0 512 5HOME
      2257 512 0 512 5HOMEA
      2257 512 436 948 486
      2257 512 508 1020 386
      2257 512 508 1020 386A

      2275 410 441 851 486A
      2275 415 449 864 486
      2275 418 358 776 386A
      2275 420 331 751 386
      2275 512 0 512 486MAIL
      2275 512 0 512 5CARE
      2275 512 0 512 5HOME
      2275 512 0 512 5HOMEA

      2293 452 457 909 486A
      2293 512 0 512 486MAIL
      2293 512 0 512 5CARE
      2293 512 0 512 5HOME
      2293 512 0 512 5HOMEA
      2293 512 460 972 486
      2293 512 508 1020 386
      2293 512 508 1020 386A

      2311 416 464 880 386A
      2311 425 452 877 486A
      2311 430 458 888 486
      2311 432 427 859 386
      2311 512 0 512 486MAIL
      2311 512 0 512 5CARE
      2311 512 0 512 5HOME
      2311 512 0 512 5HOMEA

      2329 186 508 694 386A
      2329 448 462 910 486A
      2329 506 464 970 486
      2329 512 0 512 486MAIL
      2329 512 0 512 5CARE
      2329 512 0 512 5HOME
      2329 512 0 512 5HOMEA
      2329 512 508 1020 386

      2347 403 429 832 486A
      2347 413 474 887 386
      2347 442 433 875 486
      2347 444 478 922 386A
      2347 512 0 512 486MAIL
      2347 512 0 512 5CARE
      2347 512 0 512 5HOME
      2347 512 0 512 5HOMEA

      2365 493 431 924 486A
      2365 497 465 962 486
      2365 511 508 1019 386A
      2365 512 0 512 486MAIL
      2365 512 0 512 5CARE
      2365 512 0 512 5HOME
      2365 512 0 512 5HOMEA
      2365 512 508 1020 386

      2383 409 463 872 486A
      2383 426 500 926 386
      2383 466 503 969 386A
      2383 467 468 935 486
      2383 512 0 512 486MAIL
      2383 512 0 512 5CARE
      2383 512 0 512 5HOME
      2383 512 0 512 5HOMEA

      2401 253 497 750 386A
      2401 283 508 791 386
      2401 408 438 846 486A
      2401 487 412 899 486
      2401 512 0 512 486MAIL
      2401 512 0 512 5CARE
      2401 512 0 512 5HOME
      2401 512 0 512 5HOMEA

      2419 434 478 912 486A
      2419 457 509 966 386
      2419 459 508 967 386A
      2419 470 481 951 486
      2419 512 0 512 486MAIL
      2419 512 0 512 5CARE
      2419 512 0 512 5HOME
      2419 512 0 512 5HOMEA

      2437 283 501 784 386
      2437 300 295 595 386A
      2437 311 306 617 486A
      2437 376 308 684 486
      2437 512 0 512 486MAIL
      2437 512 0 512 5CARE
      2437 512 0 512 5HOME
      2437 512 0 512 5HOMEA

      2455 426 494 920 486A
      2455 454 508 962 386
      2455 459 489 948 486
      2455 511 509 1020 386A
      2455 512 0 512 486MAIL
      2455 512 0 512 5CARE
      2455 512 0 512 5HOME
      2455 512 0 512 5HOMEA

      2473 129 116 245 486A
      2473 138 306 444 386A
      2473 182 373 555 386
      2473 280 0 280 486
      2473 512 0 512 486MAIL
      2473 512 0 512 5CARE
      2473 512 0 512 5HOME
      2473 512 0 512 5HOMEA

      2491 412 500 912 486A
      2491 428 499 927 486
      2491 512 0 512 486MAIL
      2491 512 0 512 5CARE
      2491 512 0 512 5HOME
      2491 512 0 512 5HOMEA
      2491 512 508 1020 386
      2491 512 508 1020 386A

      2509 233 493 726 386A
      2509 273 321 594 486A
      2509 281 311 592 486
      2509 289 498 787 386
      2509 512 0 512 486MAIL
      2509 512 0 512 5CARE
      2509 512 0 512 5HOME
      2509 512 0 512 5HOMEA

      2527 439 500 939 486A
      2527 442 503 945 486
      2527 456 508 964 386A
      2527 488 508 996 386
      2527 512 0 512 486MAIL
      2527 512 0 512 5CARE
      2527 512 0 512 5HOME
      2527 512 0 512 5HOMEA

      2545 243 496 739 386
      2545 259 497 756 386A
      2545 300 340 640 486A
      2545 309 304 613 486
      2545 512 0 512 486MAIL
      2545 512 0 512 5CARE
      2545 512 0 512 5HOME
      2545 512 0 512 5HOMEA

      2563 424 508 932 486
      2563 512 0 512 486MAIL
      2563 512 0 512 5CARE
      2563 512 0 512 5HOME
      2563 512 0 512 5HOMEA
      2563 512 506 1018 486A
      2563 512 508 1020 386
      2563 512 508 1020 386A

      2581 238 485 723 386A
      2581 273 489 762 386
      2581 402 412 814 486A
      2581 422 337 759 486
      2581 512 0 512 486MAIL
      2581 512 0 512 5CARE
      2581 512 0 512 5HOME
      2581 512 0 512 5HOMEA

      2599 412 496 908 486A
      2599 441 502 943 486
      2599 467 508 975 386A
      2599 494 508 1002 386
      2599 512 0 512 486MAIL
      2599 512 0 512 5CARE
      2599 512 0 512 5HOME
      2599 512 0 512 5HOMEA

      2617 259 479 738 386
      2617 281 475 756 386A
      2617 381 339 720 486
      2617 415 426 841 486A
      2617 512 0 512 486MAIL
      2617 512 0 512 5CARE
      2617 512 0 512 5HOME
      2617 512 0 512 5HOMEA

      2635 428 491 919 486
      2635 430 487 917 486A
      2635 448 508 956 386A
      2635 456 508 964 386
      2635 512 0 512 486MAIL
      2635 512 0 512 5CARE
      2635 512 0 512 5HOME
      2635 512 0 512 5HOMEA

      2653 338 443 781 386
      2653 355 454 809 386A
      2653 363 288 651 486
      2653 397 404 801 486A
      2653 512 0 512 486MAIL
      2653 512 0 512 5CARE
      2653 512 0 512 5HOME
      2653 512 0 512 5HOMEA

      2671 416 450 866 486A
      2671 447 461 908 486
      2671 478 501 979 386A
      2671 485 508 993 386
      2671 512 0 512 486MAIL
      2671 512 0 512 5CARE
      2671 512 0 512 5HOME
      2671 512 0 512 5HOMEA

      2689 365 392 757 486A
      2689 380 375 755 486
      2689 380 428 808 386A
      2689 390 431 821 386
      2689 510 0 510 5HOME
      2689 512 0 512 486MAIL
      2689 512 0 512 5CARE
      2689 512 0 512 5HOMEA

      2707 406 408 814 486A
      2707 429 491 920 386
      2707 432 502 934 386A
      2707 450 419 869 486
      2707 512 0 512 486MAIL
      2707 512 0 512 5CARE
      2707 512 0 512 5HOME
      2707 512 0 512 5HOMEA

      2725 209 401 610 386
      2725 332 408 740 386A
      2725 349 344 693 486
      2725 351 361 712 486A
      2725 512 0 512 486MAIL
      2725 512 0 512 5CARE
      2725 512 0 512 5HOME
      2725 512 0 512 5HOMEA

      2743 0 333 333 486A
      2743 0 391 391 386
      2743 0 417 417 386A
      2743 341 319 660 486
      2743 512 0 512 486MAIL
      2743 512 0 512 5CARE
      2743 512 0 512 5HOME
      2743 512 0 512 5HOMEA

      2761 221 143 364 486

      Черт, и здесь форматирование (выравнивание столбцов) при вставке поехало...

      Как видно из протокола, это уже была эпоха 486-х машин... DOS уже фактически умирал, но "программы-зомби" еще встречались на каждом углу ;-)


  1. NutsUnderline
    24.03.2024 15:13
    +2

    покупателям предлагался удешевлённый вариант в виде отдельных комплектующих

    Это когда это такой фирменный спектрум был??


  1. Joysi
    24.03.2024 15:13
    +4

    Во время чтения статьи в ушах зазвучали звуки от магнитофонной кассеты с программами БК-0010. На слух можно было определить участки данных где грузился шрифт, код или спрайты =). Еще помню модифицированные загрузчики - которые записывали данные на кассету на более высокой частоте (профит - на кассету влезало больше данных). При перезаписи с кассету на кассету необходимо было отключать АРУЗ (авто регулировку уровня записи) . Еще был популярна легендарная дека МАЯК (вроде правильно) 2 класса: 2х кассетный, отключаемый АРУЗ, реверс, счетчик позиции на ленте, умеющий отматывать пленку до очередной паузы между записями, что сильно упрощало загрузку нужной программы - просто ИМБА.


    1. NutsUnderline
      24.03.2024 15:13
      +1

      для пущей ностальгии могу подсказать более современные видео, правда там для спектрума. Один раз сделали мелодию, которая игралась теми звуками что на кассете, а потом как то сделали видеоклип в начале которого играла запись с кассеты, а все видео было стилизированно под 8bit графику


  1. ImagineTables
    24.03.2024 15:13

    Я в детстве долго не понимал отличие цифрового от аналогового. Проблема в том, что это отличие вообще мало кто понимает (но все думают, что понимают). Помню, как-то спросил на форуме, и до ответа снизошёл тогдашний главред «Компьютерры», который во-первых, намекнул, что стыдно спрашивать такие глупости, а, во-вторых, это человеческая выдумка, в природе есть только аналоговое.

    Уже во взрослом возрасте я прочитал объяснение блестящего физика, который занимался теорией вычислений. Он видит разницу в том, что цифровые системы имеют способность к корректировке ошибок, что, во-первых, делает хранение информации возможным в принципе, и, во-вторых, даёт способность к улучшению и эволюции.

    В качестве примера приводился механический компьютер Бэббиджа. Он оперировал децитами — битами с 10 состояниями (понятно, почему: у человека 10 щупальцев). В качестве ячейки памяти использовалась шестерёнка. Поскольку плоскость равна, как известно, 360°, то поворот вокруг оси относительно первоначального положения кодировал значение децита: 0° — 0, 36° — 1, 72° — 2 и т.д. Возникает вопрос: а что делать, если угол поворота равен 70°? На первый взгляд кажется, что мы открыли новые и поистине неисчерпаемые запасы ёмкости в нашей ячейке памяти («и побольше, побольше!» ©). Но при пристальном рассмотрении оказывается, что задолго до планковских масштабов система утрачивает способность запоминать точное значение и давать его считывать. Тем самым, мы вообще лишаемся хранения информации.

    Бэббидж же мыслил прямо противоположно, и организовал доводчик, который при малых отклонениях угла корректировал его так, чтобы луч «указателя угла» центрировался в своём секторе. Его дециты обладали способностью к самокоррекции. Тем самым, он спроектировал настоящий цифровой компьютер. (Нынешние компьютеры устроены так же, но вместо угла у них в ячейках памяти гуляет напряжение).

    Вот поэтому спектрумовскую кассету и нельзя было переписывать на обычном двухкассетном магнитофоне, особенно несколько раз, а требовалось считывание в память. Это аналог бэббиджевского доводчика шестерни.


    1. Tagar
      24.03.2024 15:13
      +1

      Можно было. По крайней мере, один раз - точно можно было, а то и несколько, если магнитофоны хорошие, и нет защиты - но какая на территории СНГ была защита... На первой-второй копии люфт шестеренок мог не сказаться. Лично я понимал, что так неправильно, и так никогда не делал, но знакомые делали, и работало.


      1. ImagineTables
        24.03.2024 15:13

        если магнитофоны хорошие

        Если брать большой технологический запас, то, конечно, это сработает… пару раз ))

        Я просто очень удивлялся в детстве, зачем такой класс программ — копирование с буферизацией в RAM — вообще нужен. Есть же двухкассетник…


      1. jar_ohty
        24.03.2024 15:13
        +3

        Можно было сделать (и делали) "кондиционер": фильтрующую цепочку и триггер Шмитта, как на ленточном входе "Спектрума", а после него -- сразу фильтрующую цепочку, как на выходе. У меня в "Спектруме" был тумблер, просто отключавший ленточный выход от порта и соединявший его с входным портом. При его включении при загрузке с кассеты на выходе оказывался уже обработанный сигнал, который можно было использовать для контроля, а можно было записать на второй магнитофон.


    1. NutsUnderline
      24.03.2024 15:13
      +1

      Глубоко, я уж не думал что увижу вывод. Смутно помню что тиражировщики кассет для спектрума пользовались именно одно/многокассетниками, такими же как для обычных кассет. Избыточность заложена в принципе кодирования. Ладно если мелкие ларечники, они, может, ночами сидели и втапливали в COPYCOPY, это надо считать один файл и отписать на другие кассеты, ну может и многократно, и так повторять со всей кассетой, кассетами ... были времена.


      1. ImagineTables
        24.03.2024 15:13
        +1

        Ну, наверно там был какой-то запас. Принципиальная разница в том, что в одном случае он исчерпывается (ошибки накапливаются), а в другом — нет.

        были времена

        О да. По Спектруму были две популярные книжки (кажется). (Забавно, что по всем продуктах из детства я помню две книжки. По МК-52 — жёлтая и голубая. Спектрумовские обе были чёрные). Я всё более-менее понимал. Но не то, зачем сделан COPYCOPY. Позже оказалось, что вопрос, действительно, глубок.


        1. Tagar
          24.03.2024 15:13
          +1

          Ну это Родионов и Ларченко - "ZX-Spectrum для пользователей и программистов", и вторая, где описывался TR-DOS.


      1. jar_ohty
        24.03.2024 15:13

        Не было там никакой избыточности. Там была обычная побитная FSK, с единственным средством контроля целостности -- контрольной суммой всего файла. Никаких тебе кодов Соломона-Рида.


        1. NutsUnderline
          24.03.2024 15:13

          так там же не один импульс а несколько?


          1. jar_ohty
            24.03.2024 15:13
            +2

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


      1. qw1
        24.03.2024 15:13
        +1

        ночами сидели и втапливали в COPYCOPY, это надо считать один файл и отписать на другие кассеты

        Ларёчники писали кассеты со спектрума с дисководом.


        1. NutsUnderline
          24.03.2024 15:13

          а когда его не было? были же и такие времена


          1. qw1
            24.03.2024 15:13

            Может, писали с PC? Всё-таки, год 91-97й, уже были писишки с дисководами.


            1. Javian
              24.03.2024 15:13

              Скорпион, ATM были более доступны, чем x86 даже если это "Поиск"


            1. NutsUnderline
              24.03.2024 15:13

              С кассетами все началось гораздо раньше чем в 91, PC тогда не особо отличались от спектрумов. у PC дисководами вроде уже не было выходов на магнитофон, а если и было то не в совместимом же формате писали.

              реально проще через формирователь было как тут описали в комментах


              1. qw1
                24.03.2024 15:13
                +1

                С PC можно писать на магнитофон через LPT-порт.
                В середине 90-х была услуга "запись кассеты на заказ" из каталога. Приходишь через 90 минут, и всё готово. Вот это офигенно, не то что сборники.


                1. NutsUnderline
                  24.03.2024 15:13
                  +1

                  Ну это где была такая роскошь то.. Именно софт писали? значит уже был какой то софт для имитации нужного битового потока.. думаю тоже далеко не сразу все это наработалось


                  1. qw1
                    24.03.2024 15:13
                    +1

                    Писали игры 48K из каталога. Столик на 2-м этаже универмага, сейчас бы его назвали торговым центром )) Точка на заказ работала на Scorpion ZS-256.

                    А про какой-то пк-шный софт я слышал, но не сталкивался. Мощности i386 с избытком хватит, чтобы програмно дергать pin порта с частотой 4 KHz, там стандартная скорость обмена с принтером - 115кб/с (без каких-либо разгонов)


                    1. NutsUnderline
                      24.03.2024 15:13

                      Да всякий софт был и есть, но попозже.  Scorpion тоже не сразу разработали


                      1. qw1
                        24.03.2024 15:13
                        +1

                        Ну, развалы с кассетами тоже не сразу набрали популярность. Эх, помню в нулевых, когда интернет-каналы были тощими, популярностью пользовались DVD-по-почте. Через интернет скачиваешь только каталог, а контент приходит почтой, довольно дёшево. Я тогда в приступах плюшкинства заказывал по 50 дисков в посылке. Если бы в 90-е был канал распространения каталогов, можно было ожидать и аналогичный сервис для кассет.


                      1. NutsUnderline
                        24.03.2024 15:13
                        +1

                        так инфоком распространял бумажные каталоги гдето в 1991 с ценами и рассылал диски


  1. Javian
    24.03.2024 15:13
    +4

    Программа VV50
    Программа VV50

    Недавно изучал содержимое жесткого диска от 286-машины, емкость которого 80 мегабайт. Одна из программ завыла сиреной на спикер и выдала такую грозную надпись.


  1. Dimsml
    24.03.2024 15:13
    +1

    Один из известных примеров "плавающего" бита - защита на дискетах с игрой Dungeon Master.

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

    Если при последующих циклах чтения там всегда было одно и то же неслучайное значение, значит дискету скопировали на обычном дисководе, который один раз прочитал определённое значение бита и записал его в копию, а это значит что внутри игры включались разные подлянки, вроде неубиваемых врагов и прочих псевдоглюков.

    Таких битов и проверок в коде было много и все они были неочевидны и разбросаны по ходу игры, поэтому на полноценный взлом Dungeon Master ушло много времени.

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

    Чем-то всё это напоминает современные потуги разработчиков DRM-систем вроде Denuvo.


  1. Sluchainik
    24.03.2024 15:13
    +3

    Мне очень нравилась "защита" на спектруме, когда программа специально ставила цвет текста и фона белыми, чтоб, при нажатии на Break ты не увидел листинг. Это был мой первый в жизни взлом через INK 0


  1. Quqas
    24.03.2024 15:13

    помню уже на излёте спектрума была "ufo враг неизвестен" которую даже на Юноне на 2х дискетах продавали, а в родном городе взломали, что легко копировалась на одну. до кучи с бесконечными деньгами (по выбору) и "точкой" на мировой карте и названием города