世界を動かす技術を、日本語で。

40年物のコピー防止ドングルを打破する

概要

  • レガシーなRPG II会計ソフト の動作に必要な ハードウェアドングル の解析記録
  • Windows 98環境 で稼働する DOS版RPG IIコンパイラ の仕組み調査
  • パラレルポート経由のコピーガード 実装の詳細分析
  • バイナリパッチ によるプロテクト解除と自動化手順
  • 歴史的価値のあるソフトウェア資産 の保存・公開計画

40年物RPG II会計ソフトとドングルの発見

  • 友人の会計事務所 のレガシーシステム移行支援
  • RPG(Report Program Generator) による会計ソフト利用実態
  • IBM System/3~AS/400 で使われたRPGが MS-DOSに移植 された経緯
  • Windows 98上のDOSコンソール で稼働する現役ソフト
  • ソフト実行に パラレルポート用ハードウェアドングル 必須

ドングルの調査と企業の手がかり

  • ドングルラベルに「 Stamford, CT」「 Software Security Inc」の記載
  • SIGGRAPH 1990年代出展記録ソフトウェア保護関連特許 の存在
  • RUNTIME」との表記が意味するもの

ディスクイメージ取得と解析

  • Windows 98 PCのディスクイメージ をエミュレータで再現
  • RPG IIコンパイラ(Software West Inc製) の複数バージョン発見
  • 会計ソフトの完全なRPGソースコードDOSバッチによるメニュー構成
  • IBMメインフレーム流の設計思想 が色濃く残るシステム

コピーガードの実態と逆アセンブル

  • RPGコンパイラ自体がドングルチェックロジック を内包
  • コンパイルされた実行ファイルにも 同じ保護ルーチン を自動挿入
  • SEU.EXE 起動時にドングル未検出で即終了する挙動
  • Reko による16ビット実行ファイルの逆アセンブル・デコンパイル
  • in/out命令によるパラレルポート通信 の発見とコードセグメント分割

保護ルーチンの構造とバイパス

  • BXレジスタに定数値を格納して終了 する単純なルーチン
  • 入力値不要・出力値が常に一定 という仕様
  • BX=7606h が“マジックナンバー”であることを ブルートフォース で特定
    • 256通りを自動試行して正解値を発見
  • 4バイトのバイナリパッチ でドングルチェックを完全回避

コンパイラ全体への影響と評価

  • 全実行ファイルに共通のコピープロテクトロジック 採用
  • パッチ済みコンパイラで生成した実行ファイル もプロテクト解除済み
  • 極めて単純な保護機構 であり、容易にバイパス可能
  • Software West Incによる設計の限界 と特許価値への疑問

今後の展望と呼びかけ

  • RPG IIコンパイラ&ソースコードの歴史的保存・公開 準備
  • PII削除後にアーカイブ化 を計画
  • Software West Inc関係者への情報提供呼びかけ

要点まとめ

  • パラレルポートドングルによるコピーガードは BX=7606h の返却のみを要求
  • 4バイトパッチで全保護解除 が可能
  • RPG II会計ソフト資産のデジタル保存・公開 に向けた第一歩

Hackerたちの意見

いや、これってコピー保護の仕組みがちょっと…単純すぎる気がするな?ハードウェアのドングルが一定の数字を返すだけって。もうちょっと工夫が必要だったんじゃないかな。エミュレーターとデコンパイラーを使えば、午後から1週間くらいでできちゃう感じだし。昔はそんなツールなしでやろうとしたら大変だっただろうね。

うちのIT会社は、怪しいファイルをビットシフトしてマジックナンバーを提供してるよ。保護はもっと複雑である必要があるね。

そういえば、ブエノスアイレスの小さなテレコム会社で、まさにこういうハックをやったことがあるな。エクステルって会社で、2000年頃の話。大体、OPが言ってるほど難しくはなかったよ。

見る相手によるよね。非テクノロジー業界の正当なビジネス消費者を止めるためのものは、プロのリバースエンジニアに耐えうるものよりも、ずっと複雑さが必要ない。

確かに、デコンパイラーは保護方法には効かなかったね :) 著者の論文の両方が正しいと思う。もっと複雑な使い方ができるだろうけど、プログラムの作者はこれで十分だと判断したんだろうね。あの時代のソフトウェアをたくさんリバースしたけど、90%以上は本当に「そんなに簡単」だと思うから、何も見逃してないよ!

昔のクラックはもっとシンプルだったよ。正しいJEやJNEをJMPに変えるだけで、すぐに突破できたからね。著者が言ってたように、難しいのは保護がどこでどう実装されているかを見つけて解釈すること。exeをヘックスエディタに突っ込んで文字列データ参照にアクセスできたら(そうなることはあまりないけど、結構一般的)、スキップしようとしてたチェックに失敗して、その文字列を見つけて、アセンブリに飛んでそれを読み込むトリガーを確認して、タイミングが来たらそのロジックを飛ばすように変更するだけだよ。

昔のクラックはもっとシンプルだったよ。正しいJEやJNEをJMPに変えるだけで、すぐに使えるようになった。dBASE IIIでそれをやったことがあるんだけど、Vault CorporationのProLok「レーザー保護」を使ってたんだ。ディスケットにレーザーで焼き付けた署名ね。当時、アシュトン・テイトがこんな簡単に破られるもののためにコピー保護会社と契約するためにお金を使ったのは驚きだった。彼らは自分たちで同じようなコードを書けたはずなのに。マーケティングが実質よりも力を持つ例だね。私はピンでディスケットを傷つけるだけで、その保護メカニズムを再現できた。あの「レーザー」は、ディスケットを傷つける他の手段と比べて何の価値もない、意味のない先進的な響きの解決策だった。

これにはいろんな要因があるんだよね。一つ目は、開発者たちがこのコードを動かすのに僕たちよりもずっと時間をかけてるってこと。彼らがプログラムを使える状態にしないと、僕たちも使えないからね。だから、開発者にとって敵対的な部分があると、プロジェクト全体が危うくなる。コピー保護を難解にすることで、バグ修正が難しくなることもあるし。二つ目は、トレーニング不足。君も僕もスティーブも、ゲームをクラックするためのトリックを持ってるけど、誰かがそれを見つけたら自慢できるけど、ゲーム自体はクラックされたまま。開発者のダンは、僕たち三人を排除するために、みんなのトリックを把握しておかないといけない。でも、実際には300人いるか、今ならもっと3万人くらいかな。三つ目は、モチベーションの欠如。これもいろんな状況がある。あまりやりたくない機能に対して、消極的な攻撃性を持ち込むことができる。コードがクラックからあまり守れなかった理由を他の説明にすり替えることもできるけど、それは否定を証明しようとするチェックボックスみたいなもので、QAの人たちが文句を言ってるコーナーのバグを直したときのように、誰もそのコードがちゃんと動くことに対して評価してくれないんだ。

デモソフトがあって、コードで有効化できるやつを持ってたのを覚えてる。好奇心から、コードプロンプトでデバッガーに入ってみたんだ。プロセススペースをダンプしたら、ヌル終端の文字列が出てきた。プロセスを再起動して、その文字列をプロンプトに入力したら、あっさり有効化できちゃった。(その後、ちゃんとソフトウェアにはお金を払ったよ)

Windows 95がまだ現役で使われてるって記事を読むのはすごく面白いね。無限のAIブームとはいい対比だ。テクノロジーは派手な分野では早く進むけど、もっと「退屈な」業界の部分ではそうでもないんだよね。

スクリーンショットを見る限り、プログラムはDOS用に作られてるね。ネットワークファイル共有にはWindowsが使われてた可能性が高い。

2014年頃まで、企業環境で仮想化されたWindows 95のホストがあったのを知ってる。意外と頑丈で、古いソフトが何かでフリーズしたときにリモートで入るのは1、2回だけだった。古い医療ソフトで、まだいくつかのクライアントがそれに接続していたみたい。

Win95はもう30年経ってるけど、現代のハードウェアでもネイティブで動くんだって。エミュレートされたPDP-11でも重要なものが動いてるらしく、そっちはほぼ倍の年齢だよ。

80年代の子供の頃、ウルティマのゲームをクラックしたことがあるんだ。ハードドライブに入れておいて、毎回フロッピーを入れるのが面倒だったからね。コードが自動で復号化されるからデバッガーが混乱して、その後にディスクから特別なセクターを読み込む仕組みだった。大きなセクターのペイロードに埋もれた小さなセクターで、標準のツールではコピーできないくらいトラックが大きかったんだ。そのセクターのデータはプログラムの開始アドレスだけだった。俺の修正は、実行可能なヘッダーを正しい開始アドレスにポイントするように変えることだった。

私は土木工学のソフトウェアを作っていて、こういうドングルには慣れてる。今でも、クラウドベースの認証よりもこういうドングルを求めるユーザーがいるんだ。手元に何か具体的なものがないと安心できないみたい。私たちは永続ライセンスを売っているから、ドングルが壊れたときに交換部品が手に入らないのは問題になる。全てのユーザーがアップグレードしたいわけじゃないし、クラウドライセンスが嫌いだとしても、実際にはクラウドライセンスがサブスクリプションを可能にして、定期的な収益を生んでいるんだ。ビジネス的には特に重要で、規制があまり変わらない分野では、ユーザーがアップグレードするインセンティブが少ないからね。それに、ドングルのプログラミングに多くの努力を注いでも、正規のプラットフォームでさえもクラック版が流通していることが多い。ドングルのクラックが楽しいと思うかもしれないけど、保護がなければ私たちの生計に影響が出る。海賊行為を追求するための法的リソースがあるわけじゃないし。

ビジネス的には特に重要で、規制があまり変わらない分野では、ユーザーがアップグレードするインセンティブが少ない。これはエンドユーザーが必要とすることとは真逆の意見だね。「壊れてないなら直さない」という考え方がエンドユーザーには全く問題ない世界で、ソフトウェアの一回限りのライセンスを買う方がSaaSよりもずっと理にかなってる。SaaSはエンドユーザーにとって疫病みたいなものだ。海賊行為を容認するわけじゃないけど、SaaSも容認しないよ。

ビジネス的には特に重要で、規制があまり変わらない分野では、ユーザーがアップグレードするインセンティブが少ない。ユーザーがすでに必要なものを買っていて、他に何も必要ないのに、なぜアップグレードしたり、あなたに支払い続けたりする必要があるの?

そうそう、今でもクラウドベースの認証じゃなくて、こういうドングルを欲しがるユーザーがいるんだよね。手元に何か具体的なものがないと安心できないって感じ。僕の経験では、空間が隔離されたコンピュータで作業する人たちがいるから、今でもこういうのが続いてる。彼らが扱ってる図面やシミュレーションはすごく機密性が高い(核や軍事、その他の重要なインフラ)。でも、君が言うように、サードパーティのライセンスサーバーに頼らなくて済むポータビリティや主権を好む昔ながらの人たちもいるんだろうね。

うちの父は「コスモス」っていう土木工学のプログラム用にこういうドングルを使ってたな。懐かしいけど、80386で全然認識されないことがあって、ほんとイライラした。

このコピー保護メカニズムはちょっと…単純すぎる気がする? 定数を返すだけのハードウェアドングル? 4バイトのパッチで突破できる? 今はライセンスキー以外の著作権保護には手をかけないよ。企業は請求書が必要だって示せば、ちゃんと支払ってくれるからね。これは基本的に80年代のバージョンだね。

40年前のコピー保護メカニズムを破るのって、DMCAの第1201条の下でまだ違法なの?それとも「非常に古い」ソフトウェアに対して例外が設けられたのかな?

うん、ソフトウェアの保護は最初はすごくナイーブだったよね。面白い事実:僕はWindows 3.11のアップグレードディスクのコレクションを持ってたんだけど、インストーラーからはっきり説明されてて、強制もされてた。だから、以前にインストールされたWindows 3.0がないと、アップグレードインストーラーは失敗する。解決策は、どこかにwin.comって名前の空のテキストファイルを作ること。インストーラーはそのファイル名が存在するかどうかをディスク全体でスキャンするだけなんだ。次の面白い事実:実際には、アップグレードにはフルインストールが含まれていて、デルタだけじゃなかった。あの頃のソフトウェアは本当にシンプルだったな。

子供の頃の思い出なんだけど、父がWindows 3.1のアップグレード版を買ってきたんだ。これで2.x以降のどのインストールもWin 3.1にできるって言われてたんだけど、実際に試してみたら3.xしか受け付けなかったんだよね。結局、友達から3.xのインストールを盗んで、それにアップグレードをかけたみたい。箱に書いてあったことを考えると、まあ道徳的には問題ないかなって感じだった。

そのソフトウェアやハードウェアがまだいくつかの企業で使われているってことは、個人のウェブサイトで公開した後にクラック版をリリースするのがいいアイデアかどうか、ちょっと考えさせられるよね。ソフトウェア会社は、企業からできるだけお金を搾り取るのが大好きだから、彼らが使っているソフトウェアがまだ動くってことが最もお金を払う理由になる。これを実現するための大きな部分は、ベンダーロックインなんだ。この会社がまだWindows 98を使っているって記事にあるけど、明らかにロックインされてるよね!つまり、この知的財産は実際には訴えることができる会社が所有しているかもしれないってこと。もしまだ特許や他の知的財産がどの会社に所有されているか確認していないなら、OP、まずそれを確認することを強く勧めるよ。

90年代初頭に、ホームケア会社のフランチャイズの集まりに雇われたことがある。プライベートオーナーの本社が、自社開発したソフトウェアのために必要な月次アップデートを配布してた。月次アップデート(フロッピー)は、各拠点でライセンスをもう一ヶ月リセットするためのものだった。何年も問題が続いて、サポートも悪くて、いくつかのオフィスは本社が「もう好きじゃない」と言って閉鎖されることもあった。そこで、オーナーたちが団結して訴訟を起こしたんだ(そのうちの一人がソフトウェアを開発した)。僕は数か所のオフィスでITの仕事をしていて、そのソフトウェアやシステムの維持管理にはすでに慣れてた。彼らはライセンスコードをバイパスするために僕を雇ったんだけど、これはすごく楽しかった。結局、各オフィスが電話でコードを取得するだけでソフトウェアを更新できるDOSベースのライセンスジェネレーターを作ったんだ(次の月のために、または365日分の任意の日付のために)。数年後、訴訟が解決して会社が分裂した後、ライセンスチェックを完全に削除するパッチをソフトウェアに発行した。今度DOSBoxを起動して、その古いソフトウェアで遊んでみようかな。