- 1990年代の会計向け RPG IIコンパイラ が要求していた パラレルポートドングル を解析し、動作を復元した事例
- 元のソフトウェアは Windows 98環境のDOSコンソール で動作し、ドングルがなければ起動しない
- ディスクイメージをエミュレータへ移して解析した結果、RPGC.EXE や SEU.EXE などの実行ファイル内部に同一のコピー防止ルーチンが挿入されていることが判明
- アセンブリ解析により、そのルーチンが 常に一定の定数値(7606h) を返すことを確認し、4バイトのパッチでドングル検証を回避
- これにより Software West社のRPG IIコンパイラ はドングルなしでも実行可能となり、クラシックソフトウェア保存の観点からも意義ある成果となった
古い会計ソフトウェアとドングルの発見
- 40年間使われてきた会計向け RPGベースのソフトウェア が、Windows 98 PC上で今なお運用されていた
- RPGはIBM System/3、System/32、AS/400などの中型コンピュータ向け言語で、その後MS-DOSへ移植された
- このプログラムは起動時にパラレルポート上の ハードウェア式コピー防止ドングル を要求した
- ドングルには「Stamford, CT」と「Software Security Inc.」のロゴがかすかに残っていた
- 「RUNTIME」という語が表示されており、その意味は後の解析で明らかになった
ディスクイメージ解析とRPGコンパイラの構造
- Windows 98システムのディスクイメージを抽出し、エミュレータ上で実行
- RPG IIコンパイラ(Software West Inc.製)の2つのバージョンと、会計ソフトウェアの 完全なRPGソースコード を発見
- 複数のRPGモジュールとDOSバッチファイルで構成されたメニューシステムの形を取っていた
- コンパイラ自身がドングル検証を行い、生成された実行ファイルにも同じ保護ルーチンを挿入していた
パラレルポート通信ルーチンのリバースエンジニアリング
- Reko逆アセンブラ を用いて SEU.EXE を解析
- 当初は
in / out 命令が見当たらなかったが、別のセグメント(0800h)で発見
- そのルーチンはBIOSデータ領域からパラレルポートアドレスを読み取り、LPT1ポート経由でデータを送受信していた
- 結果値は
BX レジスタに保存され、入力値はなく、常に同じ結果を返していた
定数値の推定とパッチ
- ルーチンの最後で
BH の値が 76h に固定されていることを確認
BL の値だけが未知数として残り、0〜255の範囲を ブルートフォース で探索
- 正しい組み合わせは
BL=06h、すなわち BX=7606h であることが確認された
- ルーチン先頭の4バイトを
MOV BX,7606h と RETF に置き換え、ドングル検証を回避
- その後プログラムは即座に起動し、同じルーチンを持つ他の実行ファイルにも同様の修正を適用できた
結果と意義
- RPG IIコンパイラのすべての構成要素で 同一のコピー防止コード が見つかり、一括修正が可能だった
- ドングルは単に定数値を返す構造で、4バイトのパッチだけで無効化可能 だった
- 修正済みコンパイラはドングルなしでも正常に動作し、今後は個人情報を除去したうえで 歴史的ソフトウェアアーカイブとして公開予定
- Software West Inc. に関する資料はオンライン上にほとんど残っておらず、作者とのさらなる接触が望まれている
1件のコメント
Hacker Newsのコメント
初期のソフトウェア保護は本当に単純だった
昔、Windows 3.11のアップグレードディスクを持っていたが、以前のバージョンがインストールされていないとセットアップが失敗した
解決策は、空のテキストファイルを作って名前を
win.comで保存するだけだった。セットアッププログラムがディスク全体をスキャンして、そのファイルだけを探していたからだ実際にはアップグレードディスクには完全なインストール一式が入っていた。当時は本当に単純だった
結局、友人から3.x版を借りてインストールしたが、宣伝内容と違っていたので道義的には問題ないと感じた
関連製品の写真はeBayのリンクで見られる
私は土木工学向けソフトウェアを開発している(mes100.com)
今でもハードウェアドングルを好むユーザーがいる。手で触れられる物理デバイスがないと安心できないらしい
永続ライセンスを販売しているので、ドングルが壊れると代替部品がなくて困る。クラウドライセンスは嫌われるが、サブスクリプション収益を可能にしてくれる
しかし、どれだけ努力してもクラック版はオンラインに出回っている。法的に対抗する余力もないので、保護は必須だ
また、一部の人は単にサードパーティのサーバーに依存しない自律性を好む
たまに認識されず、本当にいらいらした記憶がある
だからSaaSモデルはユーザーにとって災厄のようなものだ。違法コピーも嫌だが、SaaSも同じくらい嫌いだ
昔はクラックもずっと単純だった
単にJEやJNEをJMPに変えることだけで保護を回避できた
要点は、保護コードがどこにあり、どう動くかを把握することだった
第一に、開発者は私たちよりはるかに長くそのコードを扱うので、保護を複雑にしすぎるとバグ修正が難しくなる
第二に、ハッカーは各自いくつかのトリックを知っていればよいが、開発者はそれら全部を防がなければならない
第三に、保護機能は面白くもなく評価もされにくい仕事なので、モチベーション不足が大きい
それを入力したらすぐ有効化された。その後で正式に購入した
ディスケットにレーザーで署名する方式だったが、アセンブリが読める10代の少年でも簡単に突破できた
しかもピンでディスケットを引っかくだけでもコピー可能だった。結局、マーケティングが技術を先行していた例だった
80年代にRPG IIのコードを書き、90年代にはS/36エミュレーション環境への移行を手伝った
California Software Productsという会社の製品を使ったが、かなりうまく動いていて、会社は創業者が引退するまで存続した
「このコピー防止方式、単純すぎないか?」という話に対して、当時としては適切なレベルのエンジニアリングだったと思う
エミュレーターやデコンパイラのおかげで今なら数日で解けるが、当時はそうしたツールすらなかった
当時のソフトウェアの90%は本当にそれくらい単純だった。複雑なものを見落としていたわけではない
子どもの頃、Ultimaゲームをクラックしたことがある
毎回フロッピーを入れるのが面倒だったからだ。コードは自己復号し、ディスクの特定セクタから開始アドレスを読み込んでいた
そのセクタは普通のコピーツールでは複製できなかったが、実行ファイルヘッダーを修正して解決した
90年代初頭、フランチャイズ本部が自社開発したライセンス更新システムの保守をしていた
毎月フロッピーで更新する必要があったが、本部が気に入らない店舗を恣意的に遮断することもあった
結局、複数の店舗が集まって訴訟を起こし、私はDOSベースのライセンス生成器を作って、各店舗が電話でコードを受け取って更新できるようにした
訴訟が終わった後は、ライセンスチェックを完全に削除するパッチを配布した。いつかDOSBoxでまた動かしてみたい
Windows 95が今でも現場で使われているという話を見て興味深かった
派手なAIトレンドとは違い、産業の地味な領域では技術の変化が遅い
しかもPDP-11エミュレーター上で動いているシステムすらまだ存在する
このソフトウェアとハードウェアが今なお一部の企業で使われている点が印象的だ
だからクラック版を公開するのは法的リスクがありうる
企業は古いシステムを維持するためなら大金を払うので、こうしたベンダーロックインが続いている
もし特許や知的財産権がまだ有効なら、公開前に必ず確認すべきだ
単に一定の数字を返すだけのハードウェアドングルとは、実に単純な保護方式だ
しかし当時はそれで十分だった。今日の業務用ソフトウェアでも、似たようにライセンスキー程度しか使っていないことがある
結局、80年代版の「請求書が存在するという合図さえあれば金を払う」という発想だった