第5章 プロテクトを持つプロクラムの開発
さて,プログラム中のどこでこのプロテクトのチェックを行なうかであるが,これはプログラム自体の構成にもよるが,プログラムが起動されてからの「流れ」の各節でチェックするのが一般的である。 一般的なプログラムの起動からの流れは, 01. BOOT後, IPL を読み込む (IPL がホストマシン内に固定されている場合もある。 と言った形をとる。 プロテクトをチェックする最初の節としては, IPL によりチェックをする方法がある。 よって,これを避けるためには, IPL をいくつかに分けて続くプログラム,データをロードして行く方法が考えられる。 IPL により,プログラムのメインモジュールを読み込むが, このプログラムモジュールをいくつかに分けてロードする方法が考えられる。 次に,プロテクトをかけるトラック,またはセクターについて考察する。 プロテクトのかかっているトラックを捜すこと自体,大変難しくなるためである。 01. IPL と同一トラック上にプロテクトがかかっているため, バックアップユーティリティーでは, 0 トラックからバックアップを行なうものが多く, 一枚のディスケット上にいくつかのプロテクトがかけられており,これをチェックして行く場合,前述のように, BOOT後,いくつかの節でチェックする場合は,さほど問題がないが, 1ケ所ですべてのプロテクトをチェックする場合問題が生ずる。 そこで, チャート 5 - 2 のように,チェック時にマスターディスケットでないと判断した場合も,フラグをセットするのみで,すべてのプロテクトのチェックを行なった後,マスターディスケットではないと判断された場合の処理を行なえば,見かけ上,いくつかのプロテクトが外された場合も,またプロテクトが外されていない場合でも,処理時間は一定となるため,どの時点までのプロテクトが外れたのかは知ることは不可能となる。 プロテクト これと異なった方法もいくつか考えられるが, 重要な点は,プロテクトがどこまで外され この場合, 一般的に次の3つの処理が考えられる。 01. その時点で処理をストップする(デッドループに入る) . 1は,マスターディスケットではないと判断された時点でデッドループに入るタイプである。 2は,再度BOOT処理,つまりIPL ロードから処理を再スタートするもので,メディアや 3の方法はさらにいくつかのバリエーションが考えられる。 よって,よほど慎重に扱わなければならないことに注意していただきたい。 この対策として,定期的なバージョンアップ,メインテナンスなどが必要となる。 また,アフターケアやメインテナンスがしつかりしているソフトメーカーの商品は,アフターケアやメインテナンスそのものが大きな商品価値となるので,コピーによる損害は少ないと言われるほどで,いかにこの点が重要であるかが分る。 ソフトウェアの複製は,他のメディアの複製と異なり,まったく機能上同一のものを生み出すためプロテクトが必要となるわけであるが, どんなソフトウェアでもプロテクトをかければ,コピーによる損害が減り,利益率が良くなると言った考えは誤りであることを良く認識してプロテクトを利用していただきたい。
前章までは,プロテクトそのものの内容について解説を行なってきたが,この章では,プロテクトをかけたプログラム ( ディスケット, または商品とも言いかえられる ) を開発するにあたってのポイント,注意点などについて解説する。
5-1 フロテクトのチェック方法 ランダム・テクニック
いくらプロテクトそのものが強力であっても,チェックの方法,手順が貧弱であれば,その効果は半減してしまう。
プロテクトをかける場合,プロテクト自体の強さよりも,チェック方法の強さのほうが重要であるとも考えられる。
むしろ,プロテクト自体がそれほど強力でないにしても,チェック方法が強力であれば,商品全体としては強力なプロテクトがかかっているのと等価と見ることができるほどである。
02. IPL により, 第2IPL, ないしはメインプログラムまたはメインのプログラムモジュールをロードし,
実行する.
03. 第2IPL がある場合は, これによりメインプログラムなどを読み込み実行する.
IPL でチェックを行なう場合, IPL の物理的なディスケット上の位置は,ホストマシンによって固定されており, 該当するセクターを読み取り解析されると,簡単にプロテクトを外されてしまう可能性がある(かつ, IPL 自身にはプロテクトをかけることは不可能である場合が多い)。
つまり,最初のIPL により,第2IPL をロードし, 第2IPL により, 第3IPL をロード ……… と言った方法で, IPL を次々にロードし,かつ各IPL によってプロテクトのチェックを行う。
また,この手法だと,第2IPL 以後にはプロテクトをかけても良いので,さらに効果的である。
もちろん,分けてロードする場合は,それぞれの部分でさらにプロテクトをチェックする
と良い。
ここで注意しなければならないのは,分割してロードを行なうと(IPL も含めて)それだけ起動までの時間が長くなる, と言う点である。
よって何らかのプログラミング上のテクニックが必要となることを, 考えていただきたい。
メインプログラム,またはモジュールが起動した後は,その内部でプロテクトのチェックを行なえば良い。
メインプログラムから,各モジュールを呼んで動作させるようなタイプ ( ビジネス・ソフトに多い ) では,各モジュールを読み込むごとに,その内部で異なったプロテクトのチェックを行なうと良い。
これは,メインプログラム起動までは正常に動いても一部のユーティリィティーのみが動かなくすることが可能となり, 全体として,コピー品が役に立たなくする手としてよく使用される。
どのトラックにプロテクトをかけるのが効果的であるかであるが,これは,プログラムの構成によって異なるが,一般的には一ケ所に集中させず,パラバラに置くと良い。
ランダムに置くことにより,プロテクトを解析し, 外すと言った手順が難しくなるためである。
ランダムに置く場合, 「一見プロテクトがかかっていないように見えるプロテクト」( 第3章参照) を使用すると効果的である。
また, 良く使用されるトラックとして, IP Lの存在するトラックがある。
IPL が入っているセクターには, プロテクトをかけることは不可能と思えるが,ホストマシンのIPL 読み込み処理しだいで,プロテクトをかけることも可能である。
これについては,ホストマシンごとに異なるので,それぞれについて解析していただきたい。
また, IPL が入っているセクター以外の同一トラック上のセクターに対してはプロテクトが可能である。
IPL の存在するトラックにプロテクトをかけると次のような利点がある。
プート後,プロテクトのチェックのために他のトラックにシークする必要がなく起動が速い。
02. IPL のトラック= 0 トラック, ないしは1トラックの場合が多い。
IPL のトラックにプロテクトがかかっている場合, 最初のトラックでエラーが発生し,コピ
ーさせないようにすることが可能である。
3 IPL のトラックのみにプロテクトをかけると,他の一般的に言われているユーザーエ
リアはフリーで,プログラム上の制約がない。
などである。
これは,チェック後,マスターディスケットではないと判断された時の処理と関係がある
が, チャート5-1 のような処理を行なうと,プロテクトのチェック処理時間の違いから,ど
の時点までのプロテクトがはずされたのか分ってしまう。
チェック
この例ではRの時点でマスター
ディスクではないと判断された場
合は,フラグがセットされるだけ
でチェック処理は継続される。
フラグを初期化
n番目の.
フロテクト
をチェック
最初の.
フロテクト
をチェック
フラグを立てる
フラグを
チェック
2番目の
プロテクト
をチェック
yllll
{
)
フラグを立てる
マスターディス
クではないと判
断した時の処理
フラグを立てる
O
'
次の処理へ
よって,R,Rどちらの時点でマ
スターディスクではないと判断さ
れた場合でもマスターディスクで
ないと判断した時の処理へ移行す
るまでの時間は等しくなる。
たのかを外部から見て判断不可能なようにロジックを組むことである。
次に,この次の階段の処理,つまりマスターディスケットではないと判断した場合の処理
について考案する。
02 再度BOOTからスタートさせる。
03. 何らかの対応処理を行なう。
当然,ハード的にアポート(リセットスタート)する他再起動は行えない。
この場合注意しなければならないのは,デッドループに入った時点で,ホストマシンのメ
インメモリー中にプロテクトのチェックルーチンなど残っていると,これをもとにプロテク
トが解析される恐れがある。
よって, これらのルーチンは,デッドループに入る前にすべて消却してからデッドループ
に入るようにするのが好ましい。
マシンの状況によって不安定に起動が行なわれた場合,マスターディスケットであっても,
そうでないと判断される場合などに有効である。
ただし,プロテクト自体が,このような状況に左右されるものである場合は問題であり,
プロテクトの再考を用する。
この方法だと,マスターディスケットであると判断されなければ何回でも同じ動作をくり
返すので,何回目のトライアルであるかをカウントし,ある回数に達したら, 1の処理など
に移行するようにすべきである。
たとえば,マスターディスクではないことを表示する,ディスケットをフォーマッティン
グしてしまい,すべてデータを消してしまう,他のソフトを起動させるなどが考えられるが,
中にはマスターディスケットではないと判断した場合でもある一定期間(たとえば,使用回
数,使用通算時間などをカウントする) は正常に動作するが, それ以上になると,プログラ
ムを消してしまう, と言った処理も考えられる。
この方法は,コピー品に手を焼く米国の大手ソフトメーカーが実際に使用したことがある。
いずれにせよ,マスターディスクではないと判断した場合,そのディスク自体を再起動不能(またはそのディスク自体に何らかの書き込み動作を行なう)にするような処理は,よほどプロテクトのチェック処理がしっかりしていないと,誤ってマスターディスクを使用不能にする可能性があり,即ユーザークレームにつながる可能性が大きく,問題が多い。
さて,どんなプロテクトの強力なソフトであっても, 一旦起動すると「無防備」である場合が多い。
つまり,起動後何らかの方法でプログラムがアポートされて,プログラムやプロテクトを解析されてしまう場合が良くある。
これらはプロテクトと直接は関係がないが, プロテクトを最大限生かすには考應しなければならない点である。
たとえば,起動後,ディスケットが抜かれてしまづたため, リード動作が行なえずアポートして,コマンドレベルに戻ってしまった,プロテクトを兼たオリジナルのDOS を使用していたが,メインプログラムのロード中にディスケットが抜かれたため,アポートし, DOS のコマンドレベルに戻ってしまったため, プログラム,プロテクトはおろか,DOS までも解析
されてしまったなどである。
このような場合の対策としては,ディスクのリード, ライトで本来エラーが発生しないはずのトラック,セクターでエラーが発生した場合は,正常にリード,ライトが行なえるまで,無制限のリトライを行なうか,または,エラーが発生した場合でも直接コマンドレベルに戻らず,メモリー上のプログラムをすべて消してから戻るようにするか,BOOT のルーチンヘ飛ばすなどの処理が必要である。
ホストマシン内の標準リード,ライトルーチンを使用すると,エラ一時に無条件でコマンドレベルに戻るようになっている場合が多いので,これは使用せず,独自に作成したほうが良い。
また, リセットがかけられた場合は,メインメモリー上にプログラムが残されたまま再起動されるような位置には置かず, リセットスタート時にイニシャライズされるようなエリアに重要なルーチンを置くと良い。
データなどは,単独ではまず解析されることはないので,どこに置いても良い。
ただし,ある種のゲームソフトのようにデータそのものが重要な意味を持つ場合などは,そのままの形では置かず, エンコード, または暗号化して置くようにする。
一部のソフトで使用されるパスワードなども当然このような処理が必要である。
5-2 フロテクトとアフターケア
プロテクトを持つソフトウェアは,商品がプラックボックス化する点で何かと批判が多い。
このため, プロテクトを持つソフトを商品として見た場合,ソフトウェアメーカー,またはプログラム開発者が常に考えなければならないのがアフターケアの問題である。
ソフトウェアを,ューザーが好みに応じて変更できない場合は,そのソフトウェアの操作性,バグなどのクレームがより強い形でユーザーから出される。
よって,プロテクトをかけたソフトを商品として売る場合,メインテナンスなどの経費とプロテクトをかけないで,ユーザーが自由に変更できるようにした場合(当然コピーが行なわれる可能性が大きい)の第三者のコピーによる損益のバランスが取れないようなものであれば,プロテクトをかけない方が良い場合がある。