image
image

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

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

Это ПО было написано на языке программирования RPG (Report Program Generator), который старше Кобола (!); он использовался в компьютерах IBM среднего ценового диапазона наподобие System/3, System/32 и вплоть до AS/400. Похоже, позже RPG портировали в MS-DOS, поэтому те же программные инструменты, написанные на RPG, могут работать на персональных компьютерах. Так фирма и оказалась в этой ситуации.

Эта бухгалтерская фирма работала на компьютере с Windows 98 (да, в 2026 году) и запускала написанное на RPG ПО в консольном окне DOS. Оказалось, что для работы ПО требовалось подключить к параллельному порту компьютера специальный аппаратный донгл защиты от копирования! В те времена это было достаточно распространённой практикой, особенно у поставщиков «корпоративного» ПО, защищавшего свои очень важные™ программы от неавторизованного применения.

image

К сожалению, большинство текста и маркировок на этикетке донгла уже стёрлось, но у нас есть несколько зацепок:

  • Слова «Stamford, CT» и, с большой долей вероятности, логотип компании «Software Security Inc». Единственное свидетельство существования этой компании — статья о демонстрации её продуктов на конференциях SIGGRAPH в начале 1990-х, а также множество патентов, связанных с защитой ПО.

  • Слово, похожее на «RUNTIME», которое можно едва разглядеть.

Первым делом я создал образ диска PC c Windows 98, на котором работало это ПО, и запустил его в эмуляторе, чтобы можно было увидеть, что делает ПО, и, вероятно, экспортировать данные из ПО в более современный формат для использования в современных бухгалтерских программах. Но, разумеется, для всего этого требуется аппаратный донгл; похоже, ни один из бухгалтерских инструментов без его подключения не работал.

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

image
  • У нас есть компилятор языка RPG II (отлично!), созданный компанией Software West Inc.

  • Более того, на диске есть две версии компилятора RPG II, выпущенные в 1990-х той же Software West.

  • Есть полный исходный код бухгалтерского ПО, написанный на RPG. Похоже, полный бухгалтерский пакет состоит из множества модулей RPG, управляемых bat-файлами DOS; всё это выстроено в систему «меню», по которым пользователь перемещается, вводя числовые комбинации. Очевидно, что автор этой бухгалтерской системы изначально программировал мейнфреймы IBM и твёрдо решил перенести свои навыки в DOS, но результат оказался спорным.

Я начал изолированные эксперименты с компилятором RPG и очень быстро осознал, что аппаратный донгл требуется самому компилятору RPG, который автоматически инъецирует ту же логику защиты от копирования во все генерируемые им исполняемые файлы. Это объясняет надпись (предположительную) «RUNTIME» на донгле.

Компилятор состоит из нескольких исполняемых файлов, в частности, из RPGC.EXE, (компилятора) и SEU.EXE (редактора исходников, Source Entry Utility). Вот, что мы получаем спустя несколько секунд после запуска SEU без донгла:

image

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

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

image

Изучая декомпилированный/дизассемблированный код в Reko, я ожидал найти команды in и out, которые стали бы признаками того, что программа пытается коммуницировать с параллельным портом через порты ввода-вывода PC. Однако… я нигде не смог найти этих команд! Но затем я кое-что заметил: Reko дизассемблировал исполняемый файл в два «сегмента»: 0800 и 0809, а я исследовал только сегмент 0809.

image

При изучении сегмента 0800 мы находим улику: команды in и out, означающие, что подпрограмма защиты от записи определённо находится здесь; более того, весь сегмент кода имеет размер всего 0x90 байт, а значит, подпрограмму достаточно легко будет разобрать и понять. По какой-то причине Reko не смог декомпилировать этот код в код на C, но всё равно создал дизассемблированный код, которого нам вполне хватит. Возможно, это был примитивный вид обфускации той эпохи, который запутал Reko и не позволил ему ассоциировать этот блок кода с остальной частью программы... кто знает.

Дизассемблированный код вместе с моими аннотациями и примечаниями можно посмотреть в GitHub Gist. Я уже подзабыл ассемблер x86, но вкратце опишу, что делает этот код:

  • Это совершенно точно единая автономная подпрограмма, предназначенная для вызова при помощи «дальней» команды CALL, потому что она выполняет возврат командой RETF.

  • Сначала она определяет адрес параллельного порта считыванием области данных BIOS. Если у компьютера несколько параллельных портов. то донгл должен быть подключён к первому (LPT1).

  • Подпрограмма выполняет цикл, в котором записывает значения в регистр данных параллельного порта, а затем считывает регистр статуса и накапливает ответы в регистрах BH и BL.

  • К концу подпрограммы «результат» всей процедуры сохраняется в регистр BX (BH и BL вместе), который, предположительно, будет «проверяться» стороной, вызвавшей подпрограмму.

  • Очень важно, что в эту подпрограмму, похоже, не выполняется никакого «ввода». Она не извлекает ничего из стека и её не волнует, какие значения регистров ей передаются. И это может значить только, что результат этой подпрограммы полностью константный! Какой бы сложный обмен данными она ни выполняла с донглом, результат всегда должен оставаться одинаковым.

Зная, что эта подпрограмма должна выполнить выход с неким магическим значением, сохранённым в BX, мы можем пропатчить первые несколько байт подпрограммы, чтобы именно это и сделать! Не зная пока, какое значение нужно поместить в BX, давайте начнём с 1234:

BB 34 12       MOV BX, 1234h
CB             RETF

Пропатчить нужно всего четыре первых байта — присвоить BX нужное нам значение и выполнить выход (RETF). Если запустить пропатченный исполняемый файл с этими новыми байтами, то он всё равно прекратит выполнение с тем же сообщением (что ожидаемо), но выполнение прекращается сразу, а не через несколько секунд общения с параллельным портом. Прогресс!

Пошагово исследуя дизассемблированный код, мы получим ещё одну важную улику: единственное значение, которое может иметь BH к концу подпрограммы, равно 76h (оно жёстко прописано в подпрограмме). То есть суммарное значение магического числа в BX должно иметь вид 76xx. Иными словами, неизвестным остаётся только значение BL:

BB __ 76       MOV BX, 76__h
CB             RETF

Так как BL — это 8-битный регистр, у нас есть всего 256 возможных значений. А что мы делаем, если проверить нужно всего 256 комбинаций? Брутфорсим их! Я написал скрипт, который подставляет значение в этот конкретный байт (от 0 до 255), программно запускает исполняемый файл в DosBox и наблюдает за выводом. Сработало! Брутфорс не занял много времени, потому что нужным числом оказалось… 6. То есть итоговое магическое число в BX должно быть равно 7606h:

BB 06 76       MOV BX, 7606h
CB             RETF
image

Бинго!

После изучения других исполняемых файлов в пакете компилятора выяснилось, что подпрограмма параллельного порта одинакова. У всех исполняемых файлов одна и та же логика защиты от копирования. Когда компилятор (RPGC.EXE) компилирует исходный код на RPG, он, похоже, копирует подпрограмму параллельного порта из себя в компилируемую программу. И да, пропатченная версия компилятора будет генерировать ту же самую пропатченную подпрограмму защиты от копирования! Очень удобно.

Должен сказать, что этот механизм защиты от копирования выглядит немного... упрощённым. Аппаратный донгл, который просто возвращает постоянное число? И защита, которую можно обойти четырёхбайтным патчем? Действительно ли оно стоит патента? Но кто я такой, чтобы судить. Возможно, я не полностью разобрался в логике, и защита от копирования снова всплывёт каким-то иным образом. Также возможно, что создатели компилятора RPG (Software West, Inc) не в полной мере воспользовались преимуществами аппаратного донгла и использовали его легко обходимым способом.

Как бы то ни было, теперь компилятор RPG II компании Software West свободен от привязки к донглу параллельного порта! Вскоре я собираюсь заняться удалением из папок компилятора всей личной информации, чтобы выложить этот компилятор как артефакт компьютерной истории. Похоже, в вебе его больше нигде нет. Если кто-то из читателей статьи связан с Software West Inc, то напишите мне, у меня есть много вопросов!

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


  1. hardegor
    02.02.2026 11:44

    Надо еще было вскрыть донгл и посмотреть что в нём)


    1. nochkin
      02.02.2026 11:44

      Там внутри лежит игральная кость, у которой на каждой грани написано "6".


  1. SeregaSA73
    02.02.2026 11:44

    Работает не трогай! :)


  1. Zara6502
    02.02.2026 11:44

    1. мне кажется автор, даже в таком археологическом угаре, но нарушил закон?

    2. желанием выложить взломанное ПО он вероятно добавит к сроку еще

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

    4. как правило защита от дурака уже достаточна, особенно в узком сегменте софта, когда потребности ломать её просто нет

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


    1. sdramare
      02.02.2026 11:44

      мне кажется автор, даже в таком археологическом угаре, но нарушил закон?

      какой?


      1. Zara6502
        02.02.2026 11:44

        ну например УК РФ Статья 272, Статья 273


        1. masterthemac
          02.02.2026 11:44

          Автор из Бостона, вряд ли местный суд волнует УК РФ.


          1. Zara6502
            02.02.2026 11:44

            во-первых, я задал вопрос - не нарушил ли он закон?

            во-вторых, я не получил ответа, но мне задали вопрос - какой?

            в-третьих, я указал ПРИМЕР такого закона.

            где в данном случае появляется момент претензии ко мне? )

            Вот что говорит ИИ (если есть желание можете проверять) по Бостону:

            Да, в штате Массачусетс, где находится Бостон, действуют строгие законы, которые могут привести к уголовной и гражданской ответственности за взлом и распространение программного обеспечения. Вот ключевые аспекты:

            1. Федеральное законодательство (действует на всей территории США)

            • Computer Fraud and Abuse Act (CFAA), 18 U.S.C. § 1030 — главный федеральный закон о компьютерных преступлениях. Запрещает несанкционированный доступ к компьютерам, кражу данных, распространение вредоносного ПО. Наказания: крупные штрафы и тюремное заключение до 10–20 лет (в зависимости от тяжести).

            • Digital Millennium Copyright Act (DMCA) — криминализует обход систем защиты авторских прав (DRM) и распространение пиратского ПО. Гражданские иски могут достигать $150,000 за каждый случай нарушения.

            2. Законы штата Массачусетс

            • Глава 266, раздел 30 Массачусетского общего права (Mass. Gen. Laws ch. 266, § 30) — закон о краже интеллектуальной собственности. Прямо запрещает незаконное копирование, распространение или получение коммерческой выгоды от проприетарного ПО без разрешения правообладателя. Наказание: до 5 лет тюрьмы и штраф до $25,000.

            • Глава 93H, 93I (Законы о защите данных) — требуют защиты конфиденциальной информации. Утечка данных из-за взлома может привести к дополнительным штрафам и искам.

            • Глава 266, раздел 33A — о втором вторжении (computer trespass). Запрещает несанкционированный доступ к компьютерным системам. Наказание: до 2 лет тюрьмы.

            3. Что считается нарушением?

            Конкретно в Массачусетсе под ответственность подпадают:

            • Взлом (хакерство) — несанкционированный доступ к серверам, базам данных, облачным аккаунтам.

            • Кража ПО — установка или распространение программ без лицензии (пиратство).

            • Создание/распространение вредоносного ПО — вирусы, трояны, программы-вымогатели.

            • Обход лицензионных защит (взлом активации, кейгены, патчи).

            • Промышленный шпионаж — кража исходного кода или алгоритмов.

            4. Реальные последствия

            • Уголовное дело от прокуратуры штата или федеральных органов (FBI).

            • Гражданские иски от компаний-правообладателей на миллионы долларов.

            • Конфискация оборудования (компьютеров, серверов), использованного для преступления.

            • Запрет на работу в IT-сфере и депортация (для неграждан).

            5. Известные прецеденты в Массачусетсе

            • В Бостоне находится Окружная прокуратура Массачусетса — одна из самых активных в стране по киберпреступлениям.

            • Университеты (MIT, Гарвард) и IT-компании штата (например, в сфере биотеха и fintech) активно защищают свою интеллектуальную собственность.

            6. Исключения и серая зона

            • Ответственное раскрытие уязвимостей (ethical hacking) — если исследователь взламывает систему с явного разрешения владельца и по согласованным правилам (программы bug bounty).

            • Академические исследования (например, в MIT) могут иметь особые разрешения, но всё равно в рамках закона.

            • Использование ПО с открытым исходным кодом (open-source) — если соблюдена его лицензия (GPL, MIT License).

            Вывод:

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


            1. masterthemac
              02.02.2026 11:44

              где в данном случае появляется момент претензии ко мне? )

              Понятия не имею. А была претензия?


              1. Zara6502
                02.02.2026 11:44

                ну вы же пишете о том что автор из Бостона и что закон РФ там не работает, это претензия к моему примеру, если бы не было претензии, то вы бы ничего не написали так как мой ответ бы вас устроил, а вот почему он вас не устроил мне не ясно, выше я вам написал три пункта того как именно развивалась беседа, вам там что-то непонятно?


            1. vvzvlad
              02.02.2026 11:44

              О, просто написать глупые претенциозные вопросамы вам показалось мало, вы еще решили ллмку на помощь позвать, чтобы еще и копированием слопа попозориться


    1. NutsUnderline
      02.02.2026 11:44

      В некоторых странах сколь я помню Закон прямо допускает модификацию законно приобретенного софта. Но он же нарушил Лицензию. Там же наверняка есть - "не дизасьмь кода моего". А если эта бух.фирма еще и заплатила ему за это - корыстно нажился на чужой интеллектуальной собственности. Может дети/внуки владельцев Software West нонче безработные (кончено же иза внедрения ИИ), голодают , не дополучая прибыли от людей о которых они скорее всего даже не знают.

      Скорее за продажи может и влететь и доказывай потом что это abandonware


      1. Zara6502
        02.02.2026 11:44

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

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


        1. theult
          02.02.2026 11:44

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

          Кстати, в продаже существуют pci и pci-e карты для lpt портов, и dosbox на 20 Винде работает точно. На 11 не проверял.


          1. AlexGfr
            02.02.2026 11:44

            Видимо, ему нужен был компилятор RPG


      1. TwoSpikes
        02.02.2026 11:44

        То есть если не использовать дизассемблер, а выучить опкоды, то это будет законно?


        1. NutsUnderline
          02.02.2026 11:44

          кстати да, правда в этом надо будет убедить судью/присяжных или кого там :) поэтому в лицензию сразу добавляют еще и анализ работы


    1. maximnik0q
      02.02.2026 11:44

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


      1. Zara6502
        02.02.2026 11:44

        спасибо за понятный и развернутый ответ!


  1. Sfinx88
    02.02.2026 11:44

    Наивные были времена.
    Все было как-то попроще, что ли?


    1. Wesha
      02.02.2026 11:44

      Security through obscurity.


    1. qvvah
      02.02.2026 11:44

      Тогда мало кто знал, что значит Ctrl+Alt+Del...


  1. vvbob
    02.02.2026 11:44

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

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

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


  1. longtolik
    02.02.2026 11:44

    Ради интереса (!) я делал по-другому. Если донгл вставляется в порт принтера, то там надо его и ловить. Написал небольшую резидентную программу в памяти. Она делала останов по T биту (отладка). И, как только в регистре DX появлялось число 0x378, ( это адрес LPT1) происходил останов программы и выводился PC. По этому PC смотрел программой hiew.exe (hacker view), что там содержится, заменял кодом NOP (0x90 насколько помню). Программа игнорировала заглушку и работала. Начал было дизассемблер свой писать, но дошел до кодов команд без операндов Дальше не было времени.

    Что интересно, 386sx 33MHz работал под отладчиком довольно шустро.

    Но, кстати, были и такие защиты, которые по времени исполнения кода понимали, что работают под отладкой. А ещё и меняли код в кеше команд на лету и т.д. и т.п.


    1. Wesha
      02.02.2026 11:44

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

      Так это на оргинальной системе. А на современных за это время код может ещё и кофе сходить попить.


  1. VBKesha
    02.02.2026 11:44

    Спасибо за перевод, было интересно.


  1. Veska
    02.02.2026 11:44

    Если донгл в наличии, то зачем было брутфорсить? Просто сделать останов на выходе из процедуры и посмотреть что в регистрах.


  1. kolganoff
    02.02.2026 11:44

    Эх! Сразу вспомнил 1С и саблю)


    1. YuSV
      02.02.2026 11:44

      Как-то вспомнился "разговор" немного по такой теме: "Вот твои контакты в открытом доступе. А к тебе не приходят?"
      - Да, приходят.
      - И как?
      - И уходят)
      - Понятно.


  1. NutsUnderline
    02.02.2026 11:44

    кстати а почему бы коду защиты не быть написаны вставкой на asm, причем готовой, просто sdk уже не найти... и че там декомпилировать тогда..


  1. action5
    02.02.2026 11:44

    Мне понравилась статья. Но мое мнение что заголовок не отражает сути. Пу сути выполнен патч для ПО. Причем как я понял, даже без самомго физического ключа! Т.к. п.о считывало константу. (кстати интересно это именно конкретные экземпляры этого ПО просили эту цифру? Или каждый экземпляр по был уникальным и требовал своего ключа?)


    1. VADemon
      02.02.2026 11:44

      I forwarded this to my dad who still works on RPG. This product is called "Software Sentinel":

      It required an input key that was unique to our dongle series & our own code that was whatever we wanted. The reply was a hash of both values.

      The last version we used was USB. They retired the parallel style long ago.

      https://news.ycombinator.com/item?id=46857168


  1. ifap
    02.02.2026 11:44

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


    1. AlexGfr
      02.02.2026 11:44

      И 30 лет далеко не предел, попадалась заметка где "копмпьтеру" и "ПО" было около 70.


    1. CitizenOfDreams
      02.02.2026 11:44

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

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


      1. vanxant
        02.02.2026 11:44

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

        Другой вопрос, что в некоторых странах бухучёт часто ведёт директор в тетрадке, а не вот это вот всё.


      1. ifap
        02.02.2026 11:44

        А иронию там понимают? ;-)


  1. eungenue
    02.02.2026 11:44

    Неужто в 1С донглы были такие же тупые? Как будто с ними не было такого примитивного решения патчем.


    1. vanxant
      02.02.2026 11:44

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


  1. nixtonixto
    02.02.2026 11:44

    Скорее всего в донгле стоит чип EPROM, и при обращении по разным адресам он выдаёт заранее прописанные разные данные. Со временем эти данные начали портиться, т.к. в те годы гарантированный срок хранения у EPROM был в районе 10 лет, поэтому заказчику, имеющему донгл, пришлось обратиться к автору для взлома ПО.


  1. gazkom
    02.02.2026 11:44

    Можно было, конечно, пройти на одну инструкцию, куда попадает управление после retf и заменить cmp на nop, но это путь для слабаков.


    1. Assortie
      02.02.2026 11:44

      А кто сказал, что это в одном месте вызывается?!
      Все верно. Если менять, то перед возвратом. Инкапсуляция наше все :)


  1. MaFrance351
    02.02.2026 11:44

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

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

    Был ещё такой FlexLM. Ставился на очень дорогой софт (компиляторы, средства разработки, САПР, различный софт для управления каким-то хитрым оборудованием), при этом для обхода в некоторых версиях было достаточно заменить одну-единственную DLLку (lmgr325c.dll) на пропатченную. Вроде в ней была вся магия. А причина всё та же - для защиты домашних продуктов никто это не использовал. А те, для кого предназначалось защищённое ПО, и так были готовы платить за него адовые деньги.