SSブログ

ちょっとしたプログラムプロテクトの話 #1 【追記あり】 [プログラム]

2010/02/22 初期のプロテクト例を追記

日参している「何とか庵日誌」。
MSX の投稿雑誌打ち込みプログラムでの「ささやかな暗号化の話」が取り上げられていたので、便乗記事です^^;



アドベンチャーやロールプレイングのネタバレやシミュレーションでの「ズル」を防ぐにはプログラムテキストの「不可視化」、表示されるメッセージの「暗号化」が必要ですが、黎明期のゲームでは全く対処していないモノも多くありました。 BASIC でメインプログラムが組まれていた頃は、リストを表示すれば全部バレてしまうモノがほとんどでした。




FM-8/7 の F-BASIC には「UNLIST」命令があり、これを実行すると「LIST」命令を実行しても表示されなくなります。
そのうち、この機能を使ってリスト表示を「阻止」するモノが現れてきました。
しかし、「MON」命令を無効にしなかったため、直接メモリ内に値を書き込んで「UNLIST」を無効にしてしまえば、表示できてしまいました。

F-BASIC の DISK VERSION には「SAVE」命令に 'P' オプションが用意されており、オプション付きでセーブされた BASIC プログラムだと「LIST」命令を実行しても 'Protected Program' と表示され、リストが表示できません。 この場合「POKE」命令も無効にされていますが、「MON」命令は使えるので「UNLIST」と同様に解除できてしまいました。
'P' オプションを付ける事でセーブされたプログラム自体は暗号化されて保存されますが、これでは何も役に立ちません。

ゲームを作る側も、何とか「プロテクト外し」を阻止しようと「技術の向上」で対処します。
「POKE」「MON」命令を無効にしてワークエリアを書き換えられないようにしてしまいました。
しかし、これもあらかじめ 'P' オプションのワークエリアをクリアしたものを「SAVEM」命令でセーブしておき、BASIC プログラムをロードした後に「LOADM」命令でロードする事で、簡単に突破されてしまいました。

2010/02/22 追記ここから

BASIC の内部が解析され色々な情報が明らかになってくると、Disk-BASIC を使用しないテープ版のプログラムでも凝ったプロテクトの物が登場してきました。
LIST 命令処理ルーチン内の「未処理トラップ」を操作して、LIST 命令を実行しても「Ok」だけが表示されるようにして「不可視化」を実現していました。
このプロテクトも上記の方法で「MON」命令の無効化を解除した後、通常は使われていない未処理トラップの中から書き換えられているトラップを探して元に戻す事で、破られてしまいました。

2010/02/22 追記ここまで




FM-8 の後に発売された PC-8801 の N88-Disk BASIC にも F-BASIC と同等の機能が装備されていました。
Disk-BASIC では 'P' オプション付きでセーブされた BASIC のプログラムをロードすると、スクリーンエディタでのプログラムの追加/変更/削除ができません(「DELETE」だけは可能ですが、意味がありませんね)。
また、ダイレクトモードから「LIST」「MON」「POKE」「BLOAD」「CALL」「USR()」が実行できなくなります。
この辺りには、F-BASIC での教訓が生かされているのでしょう。

FM-8 では通用した『あらかじめ 'P' オプションをクリアした状態を「BSAVE」命令でセーブしておき「BLOAD」命令でロードする』もブロックされてしまいます。

そこで考え出されたのが、「コマンド拡張法」です。
将来の拡張用に用意された命令(例えば「IRESET」)を拡張し、'P' オプションのワークエリアをクリアするようにアセンブラでマシン語を組みます(真のプログラマは、直接メモリに16進コードで打ち込みます)。
例えば F320 番地から、21 AD EE 11 30 F3 3E C3 77 23 …(以下は自重)
これを実行すると「IRESET」命令が 'P' オプションのワークエリアをクリアできるように設定されます。
あらかじめ通常の BASIC で起動して「IRESET」命令を使用できるようにしておきます。
プロテクトを解除したいプログラムをロードし「IRESET」命令を実行します。後は同じファイル名で通常('P' オプションをつけない)のセーブをすれば BASIC プログラムのプロテクトは解除されます。
「IRESET」はダイレクトモードから実行してもブロックされない命令だというのがミソです。




コード内のメッセージを見たい VS メッセージを覗かれたくない

この戦いに決着をつけるためのアプローチとしては、大きく分けて2つの方法が採られました。

つづく

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。