先の思い出話の勢いで書いてしまおう。
コピープロテクトの話をいつか書きたいと思っていた。
かける側と、破る側の攻防が好きなのね。
実は、もう3年くらい前に書いて、詰めが甘いのでお蔵入りさせていたやつ。
というのも、技術を網羅できるほどには僕が詳しくなかったもので。
そのまま…出せる感じではないので、ある程度リライトしつつ。
プロテクトの話と言えばまずはフロッピーディスクなのだけど、仕組みを知らないとわからない部分も多いので、ざっと説明。
今では 3.5inch も使ったことがない、という人が多いのだけど、3.5inch は「入れれば読める」ので特に難しくはない。
裏表を間違えて入れようとしても入らないし、ドライブに入れる前は磁性体がシャッターで保護されるし、一番よくできたディスクだ。
5.25inch の場合、裏表逆にしても入ってしまう。
裏表逆でも入ってしまう、というのが面白くて、後で書くのだけどわざと逆に入れることもあった。
そして、ドライブに入れただけでは読めない。
入れた後に、「ノブ」を回してやる必要があった。
このノブは、物理的にディスクの抜き差しを禁止するのと、内部でディスクを上下から抑え込み、挟んで回転させる機構に密着させるのと、両方の意味合いがあった。
8bit コンピューターの時代…1980年代後半は、5.25inch が普通だった。
シャッターもついていないし、3.5inch よりもジャケット(外側の保護プラスチック)が柔らかいので、取り扱いに注意が必要だった。
もっと大きいと 8inch ディスク。実は、これが「標準ディスク」と呼ばれる。
1980年代のパソコンでは使われていない。その時代でも、オフィスコンピューターでは使われていたけど。
詳しくは、8inch ディスクの開発者、シュガートの話でも読んでくれ。
さて、ディスクというのは非常に複雑な機構を持つのだけど、あまりに複雑なので、ディスクドライブだけに専用の LSI を持たせるのが普通だった。
フロッピーディスクコントローラー (FDC) と呼ばれる。
ただし、Apple II では FDC を持たなかった。CPU で直接フロッピーディスクを制御するので、変なことがいろいろできた。
先に書いたけど、PC-8801 では、フロッピーディスクは当初は外付けだった。
外付けだと、CPU との通信にも時間がかかる。これを少しでも効率化するために、ドライブ内にも CPU を搭載した。
なので、メイン CPU とドライブの CPU を通信して、ドライブの CPU が FDC を制御して、FDC がフロッピーディスクを駆動した。
こちらも、変なことがいろいろできる。
プロテクトの基本は、「読めるけど書けない」だ。
ディスクをコピーするときは、読み込んで、同じ内容を書く。
でも、書けなければコピーできない。単純な理屈だ。
問題は、どういうデータが読めるけど書けないのか、だ。
僕もすべてを網羅するほど詳しくないのだけど、いくつか書いてみよう。
(詳しくないし、当然資料も持ち合わせていない。なので、書いてあることには間違いがあるかもしれない。
いろんな方法がある、という読み物として楽しんでもらい、詳細を知りたければ自分で調べてみてほしい)
▼セクタ数が違う
非常に初歩的なもの。
フロッピーディスクは、データを「セクタ」という単位で区切っている。
セクタはさらに集まってトラックを作る。
これらをいくつにするかは、ある程度融通が利く。
セクタやトラックの数を変えることだってできる。
当時は BASIC が OS みたいなものだったので、BASIC が使用する標準ディスクフォーマット、というものがあった。
そして、この標準ディスクをコピーするソフトも、BASIC のセットに付属していた。
「ユーザーは、このソフトでコピーを取ろうとするだろう」という前提で、BASIC のフォーマットとはセクタの数を変えてやる。
すると、全部のセクタをコピーしたつもりでも、実はコピーできてないセクタが生じる。
でも、すぐに「どのようなセクタ数でも、解析して全部をコピーするソフト」が登場する。
セクタ数を変える、というプロテクトは、短期間しか通用しなかった。
▼CRC プロテクト
ディスクには、セクタごとに CRC というデータがつけられている。
データが壊れていないか検出する、「チェックサム」と呼ばれるものの一種だ。
これを書き換えて、わざと「壊れている」ようなセクタを作るとどうなるか?
FDC は、一応データを読み込みはするのだけど、「壊れている」という報告を返す。
ソフトのほうでは、壊れているなら再読み込みをするのだけど、何度読んでも壊れている。
仕方がないので、何度目かのトライで読み込みを諦め、その時読み込めたデータを信用するしかない。
そして、コピーのためにそのデータを書き戻す際には「正しい」 CRC を再計算して、書き込む。
この CRC の書き込みは FDC の仕事なので、「正しくないものを書き込め」とは指示できない。
ソフト起動時に、このセクタを読み込んでエラーが出れば、正規品だ。
これを再現するには、何度読んでも CRC エラーが出るセクタを見つけたら、そのセクタのデータを書き込んでいる最中に「FDC をリセット」するように CPU から指示を送ればいい。
FDC は、セクタの途中で書き込みをやめてしまう。当然、CRC は計算されず、「それまで書き込まれていたもの」のままだ。
これでセクタはエラーとなる。
▼未フォーマット(コロコロプロテクト)
新品のディスクは、フォーマットしてから使う。
上に書いた、「セクタ」や「トラック」に、データ的な目印をつけてから使うのだ。
ところが、特定のセクタやトラックだけ、わざとこの「フォーマット」作業を行わない、という技法がある。
すると、磁気データが一切書き込まれない。
これは不安定な状態で、データを読もうとすると、読むたびに違う結果が返ってくる。
コピーソフトは、「読むたびに違う」なんて思わないから、1回読み取って書き込んでしまう。
すると、とにかくその時のデータで「確定」してしまう。
プログラムの起動時に、該当セクタを 3 回読み取り、すべてが内容が同じかチェックする。
正規品は、フォーマットが行われていないので、「内容が変わる」はず。
でも、コピーしたものは、常に同じ内容が返ってくる。
一度も使っていない生ディスクを使い、(もしくは、一度使ったディスクに磁石を近づけて内容を破壊し)、コピーする際に同じセクタを複数回読みながら、未フォーマットと思われる部分は飛ばしてコピーする、という手法が現れた。
▼時分秒プロテクト
FM-7 などで使用された FDC では、フォーマット時のコマンドとして F5 F6 F7 の3つの値が使われた。
それぞれ別の意味だが、ともかくフォーマットに必要な処理を行う。
もちろん、これらが意味を持つのはフォーマット時のみで、通常のデータとして書き込む際には、これらの数値は問題なく書き込める。
では、フォーマット時に書き込まないといけないデータ部分に、F5 F6 F7 の数値を利用したらどうなるか?
これは、「使えない」というのが、その FDC での仕様だった。
では、逆に、わざとこのデータを書き込んでしまえばプロテクトになる。
読み込みには問題は出ないが、書き込もうとしても絶対に書き込めない。
F5 F6 F7 は、FM-7 の文字コードでは「時分秒」の文字が入れられていたため、時分秒フォーマットと呼ばれた。
該当 FDC は、もともと「片面ディスク」用に作られたもので、両面ディスクで使用する際には、この FDC とは別に読み書き面を切り替える回路を設けるのが普通だった。
そして、この回路は FDC とは独立して動作する。
なので、時分秒フォーマットを見つけたら、F5 F6 F7 の代わりに、FD FE FF を書き込む。
FD と F5 は、1bit だけ値が違う。他の数値も同様だ。
そして、時間を正確に測り、この 1bit を書き込むタイミングで、書き込み面の裏表を逆にしてしまう。
これで F5 を書き込むことができる。他の値も同様。
#説明が難しいが、信号を逆の面に送ることで、1 のビットは必ず 0 になった。
また、保護機構があって、裏面が 1bit だけ破壊される、ということはなかったらしい。
▼ダブルインデックスホール
5inch ディスクには、小さな穴が1つ開いていた。
未フォーマット時のディスクを初めてフォーマットするときは、何も目印がない。
そこで、この「穴」を検出できるようになっていて、この穴を見つけたらディスクが1周した、と考えてフォーマットを行った。
逆に言えば、フォーマット時くらいしかこの穴は使用されない。
これを利用して、穴を2つ開けてしまう。
穴が特定の位置を通ったかどうかは検出できるので、穴の通る時間間隔を調べれば、穴が1個か2個か、程度はわかる。
穴が2個開いていれば正規品、と考える。
自分で穴を開けるにしても、それなりに正しく穴を開けないと、時間間隔の微妙な違いでコピー品と見抜かれてしまう。
物理的な工作が必要なので、コピーソフトだけでは対応ができなかった。
▼穴あきプロテクト
上と同じような感じなのだけど、ディスクのデータ領域に穴を開けてしまおう、というプロテクト。
その部分を読むと、コロコロプロテクトと同じようなことが起きるので確認できる。
じゃぁ、コロコロと同じようにコピーできる。物理的に変わったことをしても、それほど意味はなかったようだ。
ついでに、穴が開いているために、ディスクドライブのヘッドを傷つける恐れがある、というので、どこかの会社が考えたものの、ほとんど使われなかったらしいプロテクト方法。
▼回転速度プロテクト
ディスクドライブには個体差もあるので、ディスクの回転数は常に同じ、とはならない。
ディスクの回転が異なれば、データの読み出し速度も変わる。
そこで、FDC では、多少読み出し速度のムラがあっても対応できるようになっていた。
ただ、書き込み時には基本的に同じ速度で書き込みを行う。
これを利用して、特殊なドライブで、ゆっくり回転するディスクにデータを書き込む。
ディスクはゆっくり回るので、普通のディスクよりも多くのデータを書き込める。
読むときは、多少の速度の違いは許容されるので、普通にデータが読める。
ただ、ディスク1枚に入るデータ量が、普通より多いだけだ。
この方法でディスクを作られ、データを詰め込まれると、コピーすることができない。
どんなにコピーしようとしても、全データを書き込むことができないのだ。
▼Apple II のプロテクト
先に書いたが、Apple II は FDC を持たず、CPU がすべてを制御する。
そのためおかしなフォーマットがたくさんあった。
ディスクを逆回転させるとか、読み取りヘッドが、普通の 1.5 倍の速度で動く、なんてやり方もあったようだ。
Apple II のディスクドライブは片面だったので、途中で「裏返す」ようなゲームも存在した。
先に書いたが、5inch ディスクは裏返しても入ってしまう。
これを積極的に利用したのだ。
#実際には、裏返して入れることは出来るのだけど、それで読み書きするにはちょっと加工が必要。
市販ゲームの場合は、もちろん最初から加工してあったし、簡単に加工するための工具も売られていた。
▼パッチ
プロテクトというより、外す側の最後の手段が「パッチ」だ。
最後の手段というか、末期には常套手段になっていた。
ここまでに書いた話では、「コピーする」というのは「オリジナルと同じものを作り出す」ことだった。
しかし、パッチでは、コピーしようとしているのに、オリジナルと積極的に変えてしまう。
ほぼすべてのプロテクトで、「正規品かどうかを確かめる」プログラムが動くことになっている。
このプログラムを動かさないようにしてしまえば、プロテクトを再現できなくてもソフトは動くのだ。
究極の方法…だけど、特に面白さを感じない。
当時はコピーが法的に「認められたもの」から「違法」へと移行しつつある時代で、まだコピーは当然の権利、と捉えられていた。
でも、それは自分で買ったゲームを、万が一の事故に備えてコピーしておく、というような場合だ。
市販ソフトをただで遊ぶためにコピーする、というのは、褒められた行為ではない。
そして、悪い行為に「面白い」も「面白くない」もないのだけど、パッチ当てはあまりにも即物的だ。
コピー、と言っているのだから、元と同じものを再現してやろう、というテクニックには、チャレンジ精神を感じる。
ちなみに、この「パッチ」を禁止してやろうと試みるプロテクトも存在したようだ。
パッチを開発するコピーソフト製作者は、CPU の動作を特別な方法で確認しながら、プロテクトを確認している該当プログラムを探そうとする。
でも、プロテクトの確認を「CPU 以外」がやっていたら?
通常の方法では、プロテクト確認のプログラムを見つけ出せない。
PC-8801 は、ディスクドライブに CPU を搭載していた。
そこで、こちらの CPU にプロテクト確認をさせよう、というプロテクトもあったようだ。
こうなると、パッチを作るのが難しくなる。
人間のやることだから、最後にはばれてしまうのだけど、少しでも「パッチ」に抵抗しようという、防御側の工夫が面白い。
以上。
多分、もっとたくさんのプロテクトが考案されていたはず。
ついでに、ゲーム機のほうのプロテクトの話も…とおもったら、これはすでに過去に書いていた。
追記 2016.7.4
2016.6.30に、ハイドライド作者の内藤さんがこのページを見てくださり、思い出話をツイートしていました。
これは貴重な話だと思ったので、ご本人に許可を頂いたうえで引用いたします。
元々は、引用されることなど想定せずに思い出を語っただけです。
間違いなどあっても内藤さんへの問い合わせをしないようにお願いします。
記録が残ることを想定していない文章を引用した以上、文責は僕にあります。
https://t.co/AIgrOaHU4S
— 内藤時浩 (@tokihiro_naito) 2016年6月30日
ちょっと懐かしい。私はプロテクトをかける側だったけど、私が作ったのは以下の通り。
・FDのセクタ間(GAP3)に特定の文字を書き込んだ。本物なら書いてある
・1トラック16セクタのところを18セクタに拡張した
そのうち、NECのFDCコントローラでは物理的にコピー不能なフォーマットを、FM-7やX1のFDCで作ったりして、プロテクトに開発時間を割くようになりました。割と本末転倒でした。ゲーム作れよと…。なので、この辺りから、デュプリ業者にプロテクトを依存するようになります。
— 内藤時浩 (@tokihiro_naito) 2016年6月30日
「パソコン向けソフト」の黎明期は、プログラムを作成したメーカーが自分のところで複製を行っていました。
しかし、後にはデュプリケート(複製)業者が現れ、大量生産を請け負うようになります。
そして、業者がオプションサービスとして、プロテクトも請け負うようになります。
また、パッチに対抗するためFM音源とBEEPドライバの2箇所にチェックを組み込んだりしました。環境の違いで動く動かないを作り出すことで、コピー屋を混乱させようとしたんですね。そしたら、コピー屋はIPLを丸ごと乗っ取って、ローディングと起動を自分で行うという荒業に出ました(苦笑)。
— 内藤時浩 (@tokihiro_naito) 2016年6月30日
PC-9801の頃になるとFDCを直接弄れなくなり、INT 21Hのファンクションコールしか許されなくなりました。そのため、FDチェック部分が簡単に検索されるようになって、プロテクト側の敗北で終了。で、そのハードから撤退して、ソフト供給が止まり、ハードの息の根も止まるというね…
— 内藤時浩 (@tokihiro_naito) 2016年6月30日
上記ツイートは、本人より INT 21H と書いたのは 1BH の間違いです、との訂正情報もいただいています。
INT 21H は DOS の機能を呼び出す機械語命令で、1BH は DISK アクセスのための機能を呼び出す機械語命令。
記憶のみでさっと書いて、よく使う数値を取り間違えただけの些細な問題です。
プロテクトでご連絡いただいたので、もうちょっと書いておこう。FDは80トラックまであったのですが、それを81トラックまで拡張したフォーマットが存在していました。これ、某社が採用していたと思うのですが、NEC互換機のドライブがシークが物理的に出来ないようになっていて…。
— 内藤時浩 (@tokihiro_naito) 2016年7月4日
当然、製品でもコピーとみなされるという事態になってパニックしてました。同様にマイナストラックもありました。シーク制限は物理的に存在していたので、シーク速度最大でマイナストラック移動実験をしたら、カツンツカンツカンツカンと大変なことにwww
— 内藤時浩 (@tokihiro_naito) 2016年7月4日
引用許可をいただいたら、さらに思い出話をしていただけました。
「互換機」などは結構頭の痛い問題です。
こちらは僕の思い出ですが、知人が FM-7 の外付けドライブを購入する際、安い互換品を買ったところ、正規に購入したゲームがコピー品とみなされて遊べない、という事態が発生していました。
MSX なんかは「互換機」しか存在しない市場なわけで、事実上強いプロテクトはかけられなかったようです。
MSX の場合、ROM カートリッジにすることが何より強いプロテクトでもありましたが。
以上、当時現場でプロテクトをかけていた側の方に思い出話をいただけたのは、非常に貴重なことかと思います。
引用の許可をいただき、ありがとうございました。
追記 2016.7.5
上の追記をした翌日、たいにゃんさんが SeeNa で使われた技術と共に、プロテクトの話をしてくださいました。
許可を得た…のかな (^^; リンクさせてくださいと言ったら「にゃーん」と答えられたのだけど。
SeeNa は、たいにゃんさんが PC-8801mkII 用に作られた、迷路の中を駆け抜ける3Dゲームです。
レース+RPG風味…かな? 今でも似たゲームは見当たりません。
本文に書いたように、PC-8801 のディスクドライブは、CPU を搭載しており、任意のプログラムを実行できます。
これを使ってゲームの処理をするという超絶技巧を使い、ヒットしたゲームでした。
SeeNa の技術についてはとても興味深いですし、そちらが話の主体なのですが、togetterまとめが作られているのでそちらを読んでください。
以下、プロテクトに関する部分を引用します。
こちらも、引用した以上文責は僕にありますので、たいにゃんさんに問い合わせしないように。
SeeNaプロテクトというか簡易暗号化部分
— たいにゃん (@bugnekotinyan) 2016年7月4日
add sub xorを使う簡単なものでしたが、diskごとにどれをつかうかとソルトの値は乱数で、
この復号部分のプログラムのバイナリ値を使って一部データを復号するので、簡単なパッチでは別diskに適用できぬくくなってたはず
一部トラックは変則的な単密度フォーマットにしてあり、読み込もうとすると、コントローラーがハングアップする確率が高く、
— たいにゃん (@bugnekotinyan) 2016年7月4日
これは単にコピーツールを作ってる人へのいやがらせでした
ゲーム中にはもちろんそのトラックにはアクセスしません
あと、ダミーのfatとかいれてあり、NEC純正のbackup.n88だとこぴーできて遊べるようにしてあったのも、
— たいにゃん (@bugnekotinyan) 2016年7月4日
コピーツール作者に、散々苦労しなくてもできちゃうんだよ、ご苦労様、けけけ
というメッセージでもあったのです
思い・・・だした
— たいにゃん (@bugnekotinyan) 2016年7月5日
たしかトラックも一枚ごとにシャッフルしてたと思う
0トラック以外
いろいろ分からなかったので、ツイッターで直接お伺いしました。簡単にまとめます。
SeeNa のプロテクトは多重構造になっていて、
・普通にプロテクトがかけられている
・プロテクトチェック部分はディスク1枚ごとに違う方法で暗号化され、パッチしにくい
・ディスク1枚ごとに、トラックの並び方が違う
・トラックのうち一本は「ハングアップを誘う」トラップ用
・並びの違いは、先に書いた「暗号化」されたデータ領域内に記録されているので、事前にわからない。
・でも、BASIC のディスクをコピーする純正ツールではコピーできる。
(BASIC のディスク構造を示す fat 領域を巧妙に作り込み、トラップに引っかからずコピーできる)
・ただし、純正ツールコピーでも、違法コピーしたことはゲームを遊ぶとわかるようになっている。
SeeNa はゲーム自体の技術も高かったのですが、プロテクトもすごい…
引用ツイート最初の暗号化部分、簡単に解説すると、シーザー暗号です。
IBM の各アルファベットを、ABC 順で1つ前にすると HAL になる、ってやつ。
ここで「1つ」という数値が「ソルト」と呼ばれます。
#暗号鍵と同じ意味。
なぜわざわざ違う言い方をするかは、説明が長くなるので興味ある人は調べて。
sub 1(1つ前にする)で暗号化したら、add 1(1つ後ろにする)で復号化できる。
ソルトが変われば数値部分を変える。sub と add を入れ替えると別の暗号になる。
さらに、xor でも別の暗号になる。
この演算は、2回繰り返すと元に戻ります。だから暗号化と復号化は同じ。
市販するディスクをコピーする際に、自動的に sub add xor のどれを使って暗号化するかを選び、ソルトもランダムに選び、暗号化したデータと一緒に適切な復号化プログラムをディスクに書き込む…というソフトを作成したのだそうです。
コピーソフトを作る業者が、プロテクトをチェックしている部分を回避しようと思ってパッチを当てようとしても、パッチを当てたいプログラムは暗号化されている。
しかも、その暗号データは、市販されているディスクの1枚づつで内容が異なる。
ここに、最後の引用ツイート、トラックシャッフルが組み合わさります。
本文最初の方で書きましたが、ディスクはセクタ単位で管理が行われ、セクタをまとめたものをトラックと呼びます。
トラックはディスクに対して同心円状に並び、物理トラック番号が割り振られます。
この順番をディスクごとにバラバラにシャッフルしてしまい、実際にアクセスするときは、シャッフル順を記録したデータを参照して実際の物理トラック番号に変換してアクセスするのですね。
これに加えて、特定の1トラックはおかしな構造で記録されていて、アクセスすると FDC がハングアップする。
シャッフルされているので、そのトラックがどこかはディスクごとに異なる。
ハングアップするトラックを飛ばしてコピーしよう、と考えたとしても、それがどこにあるかわからないのです。
ディスクから起動する場合は、まずトラック0のセクタ1が読み込まれます。
トラック0はシャッフルしない、という理由はこれ。
読み込むんだデータはプログラムとみなされ、実行されます。
これは1つのセクタに収まるほど小さなプログラムですが、続いて複雑なプログラムを読みこませるには十分です。
そして、おそらくここでトラック0から先に書いた「復号化プログラム」が呼び出され、シャッフルされたトラックのデータ(シャッフルテーブル)を含む、暗号化された重要データの復号が始まる。
以降はゲームのシーケンスに入っていくのでしょうが、データアクセスの際には、必ずシャッフルテーブルを参照して、そこに書かれたトラックにアクセスします。
これで、トラックがシャッフルされていても正しいデータにたどり着ける。
もちろん、ハングアップするトラックにはアクセスしないようになっている。
非常に巧妙です。
SeeNa は、「ソフトメーカーのお手製プロテクト」の時代としては、最後に近いものではないかと思います。
もう少し後になると、先に書いたように複製業者が出てきて、プロテクトのサービスを行うようになる。
SeeNa はヒットゲームだったので、後に「ワイド版」というバージョンが作られます。(続編ではない)
このときには、複製業者にプロテクトを頼んだのだそうです。
こうした複製業者のサービスは、専門家なので非常に技巧を凝らしたものだった一方で、あまり手の込みすぎることは出来ません。
すでに完成しているゲームにプロテクトを施すだけだからね。2重3重のトラップは作りにくい。
SeeNa は、非常に凝ったプロテクトの技術としては円熟期のゲームの一つなのだろうと思います。
こんなお話を伺えたのは、非常に貴重なことかと思います。
引用の許可をいただき(…にゃーん?)、ありがとうございました。
2018.7.24 追記
実際に、FM-7 の各種ゲームを中心にプロテクトがどのようにかけられていたか、コピーするとどうなるか、などを説明しているサイトを見つけました。
こういう実例、非常に面白いです。リンクしておきます。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 【あきよし】 AppleII のプロテクトの話で、面白い記事を見かけたのでメモ。救えるものと、こぼれ落ちるもの (2016-12-26 18:04:23) |