〜はじめに〜ついに、本格的なプログラム改造をお教えします。その第1段として「ディスクチェックの解除」の解説をします。 「あれ? CDチェック解除の解説は…?」と思うかもしれませんが、 それについては後ほどで… そもそもディスクチェックとは?本来は違法コピーを防止する役割であったり、CD−DAでBGM再生する場合などに用いられてました。現状ではCD−Rドライブも普及しましたし、コピー防止というのは結構減っています。 (SAFE DISCなどのように、時代にひたすら逆行するようなものもありますが…) で、ディスクチェックは基本的に「***のCDを挿入してください」などの メッセージを表示して終了・再試行するようなものが大半です。 ディスクチェック解除のターゲットは〜私の作ったサンプルです(苦笑メーカーさんの、CDチェック付きのゲームを改造したほうが実用的なのですが、 そうすると、不正競争防止法をギリギリ回避〜…な内容ですので…(汗 >>とりあえずサンプルをダウンロード サンプルの中身これは、「キーディスクチェック解析」で公開されている No.01 と同じものです。ファイル構成は〜
ちなみに、このサンプルのキーディスクとは「フロッピーディスク」です。 最近は付いてないPCもあるそうですが、まぁ、何とかしてください(ぉ さすがに、CDチェックサンプルを作って、キーディスクのCDイメージをアップして、 「焼いてから使ってね♪」というのは…(苦笑 (別に難しくは無いんですけど、コスト面に問題が…) あと、解析の際に「ASM解析.TXT」を見ながら作業を行うのも良いですが、スキルを付けるならば、 自力で CHK_VOL.EXE を逆アセンブルし、リスト出力したものを見てから作業をすると良いです。 ちなみに、リスト出力をDOSプロンプトで行う場合は、
リストからディスクチェック処理を探す出力した逆アセンブルリストをテキストエディタで開いたら、とりあえず何も考えずにGetDriveTypeA という文字列を検索してみましょう。 すると、
とまぁ、1発くらいは無関係なところに該当したりもしますが、気にせずに次を検索します。
以降を検索しても該当する場所は無し…というわけでヒットしました。 いきなりですが、ここがディスクチェック処理の1ステップ目とも言える部分です。 たま〜に例外もありますが、基本的にディスクチェックを行う処理には GetDriveTypeA が 使われているので、この文字列をサーチしたら一発ヒット〜というわけです。 そもそも GetDriveTypeA とは?名前のとおり「ドライブの種類を取得する命令」です。VisualC++などで組む場合は drivetype=GetDriveType("A:\\"); って感じに使います。 この例だと、Aドライブの装置の種類判別用の数値が drivetype 変数に返されます。 なお、数値は以下のようになっています。
つまり、ディスクチェックの1ステップ目は「ドライブの種類を得る」ということにあります。 ということは…種類判別用の数値を見て気づいた人も居ると思いますが、2がフロッピーで、5がCD-ROMドライブ…そう、フロッピーチェックだろうがCDチェックだろうが、実はやってることはほとんど同じです。 サンプルで GetDriveTypeA を検索してフロッピードライブ判定処理を見つけるように、 市販ソフトでも GetDriveTypeA を検索してCDドライブ判定処理を見つけることができます。 ってわけで、とりあえずサンプルの GetDriveTypeA のすぐ下2行を見てみましょう。
この2つの命令については第7回を参照していただくとして、これは順に、 cmp eax, 00000002(eaxレジスタが 00000002) jne 004010A6 (でなければ(Jump not equal)アドレス 004010A6 に分岐) という動作をしています。 eaxレジスタが 00000002 でなければアドレス 004010A6 に分岐…これは言うまでもなく、 ドライブをチェックしたときに返ってきた値が2(フロッピー)でなければ分岐という処理ですね。 書き替えるこれは言うならば、「CDドライブが付いてないマシンでCDチェックを行うと、ドライブが見つからなくて起動不可」 という現象の原因とも言える部分だったりします。 では、今回はここを書き替えるパターンを紹介します。 1.チェック対象ドライブの種類を変更する例えば、サンプルだと「判別用の数値 2(フロッピー) が見つからなければ起動不可」という動作ですが、これを判定用の数値 3(ハードディスクなど) に変更します。 これで、ハードディスクを搭載していれば……普通はウインドウズマシンでハードディスク無し というのは聞かないので(笑)、100%処理を続行させることが可能になります。 ちなみに書き替えるには
ちなみに書き換えには、バイナリエディタを使ってくださいな。 2.判定分岐を無効にする「ドライブが見つからなかったら分岐」とか、この判定分岐を無効にしてしまえば、もちろん、通過するようになります。 逆を言えば「ドライブが見つかれば分岐」ならば無条件分岐にすればOKです。 というわけで、無効にするにはいつもどおり
もちろん、無条件分岐ならば
(ただし、サンプルでこの部分を無条件分岐にすると、永遠にドライブ発見不可に…(苦笑) というか、CDチェックの場合は前者以外見たこと無いです) さいごにと、ドライブ種類を取得する処理の動作を書き替える方法を紹介したところで次回に続く〜です。次回は「ディスクチェック解除 後編(予定)」です。 おたのしみに〜 …と言ってたのですが、次回は中編になりました(苦笑 ごめんなさいぃ〜〜〜 >>NEXT STEP |