CD/DVDチェックとは、PCゲームなどに使用されているプロテクトの1つである。 今回はそれをクラックし、CD/DVD無しでも起動できるようにしてみる。 このようなクラックをNO CD/DVD化という。 クラック対象はうさみみハリケーンに同梱されている UsaTest2Win.exe である。 なおこれはあくまでも練習用ソフトウェアである。 OllyDBGを管理者として実行し、 ファイル⇒開くより、UsaTest2Win.exeを開く。 開いた後F9を押す。 (2回押す必要あり) その後、プログラム解析演習(E)⇒CD/DVDチェック(C)を選ぶ。 すると CD/DVDチェックに失敗しました というメッセージが表示される。 まず、CD/DVDをチェックする関数というものは直接的には存在しない。 しかしながら、ドライブの種類を取得後ボリュームラベルをチェックすれば CD/DVDをチェックする事が出来る。 もう少し分かりやすく言うと、 対象のドライブはHDD(SSD)なのかCD/DVDドライブなのか などをチェックする ↓ もしCD/DVDであれば、ボリュームラベルをチェックする ドライブの種類を取得する関数としてGetDriveTypeという関数がある。 この関数の戻り値は次の通り 0 ⇒ ドライブの種類を判別できない 1 ⇒ 指定のルートディレクトリが存在しない 2 ⇒ このディスクはドライブから取り出せる(USBメモリやSDカードなど) 3 ⇒ このディスクはドライブから取り出せない(ハードディスクなど) 4 ⇒ このドライブはネットワークである(NASなど) 5 ⇒ このドライブはCD(DVD)ドライブである 6 ⇒ このドライブはRAMディスクである まずはGetDriveTypeにブレークポイントをセットする。 ctrl + n を押し、GETDRIVETYPEとタイプする。 その後、GetDriveTypeAにカーソルを合わせ 右クリック⇒全ての参照にブレークポイントをセットを選択する。 プログラム解析演習(E)⇒CD/DVDチェック(C)を選ぶと 自動的にGetDriveTypeAで処理が止まる。 ここからは逆アセンブリされたアセンブリをよく読む。 004015C0 83F8 05 CMP EAX,5 004015C3 75 5A JNZ SHORT UsaTest2.0040161F この一連の命令はGetDriveTypeAの戻り値を比較している。 特に CMP EAX,5 は重要。 5 ⇒ このドライブはCD(DVD)ドライブである この処理は戻り値によってCD(DVD)ドライブかどうかチェックしている。 まずはここを攻略する。 そこでCD(DVD)ドライブ以外をチェックさせる事を考えてみる。 例えば、どんなパソコンにも入っているであろうハードディスクである。 5 を別の数値に書き換える事によって他のドライブを比較させる事が 出来るので 5 を 3 に書き換える。 3 ⇒ このディスクはドライブから取り出せない(ハードディスクなど) 次のように書き換える。 書き換える方法は書き換え箇所を右クリック⇒逆アセ修正で 書き換える事ができる。 *書き換え前 004015C0 83F8 05 CMP EAX,5 004015C3 75 5A JNZ SHORT UsaTest2.0040161F *書き換え後 004015C0 83F8 03 CMP EAX,3 004015C3 75 5A JNZ SHORT UsaTest2.0040161F これでハードディスクをチェックさせる事ができる。 次にボリュームラベルを取得後そのボリュームラベルをチェックする処理を 見てみる。 lstrcmpAで先ほど取得したボリュームラベルが GAMECDかどうかをチェックしている。 重要なのはlstrcmpAで、戻り値が0かそれ以外かのどちらかである。 0であれば次の TEST EAX,EAX での戻り値は 0 それ以外であれば 1 である。 つまり、ボリュームラベルがGAMECDであれば 0 を返し、 それ以外であれば 1 を返すようになっている。 常に 0 を返すようにすれば良いので、次のように書き換える。 *書き換え前 00401603 3BC0 TEST EAX,EAX 00401605 75 18 JNZ SHORT UsaTest2.0040161F *書き換え後 00401603 3BC0 CMP EAX,EAX 00401605 75 18 JNZ SHORT UsaTest2.0040161F [!] 補足 TESTはAND演算を行いその結果次第でフラグをセットする。 1 and 1 = 1 1 and 0 = 0 0 and 1 = 0 0 and 0 = 0 よって、ボリュームラベルが同じでなければ 0 にはならない。 CMPはSUB(引き算)を行いその結果次第でフラグをセットする。 今回のlstrcmpAの戻り値は 正の値、負の値、0 のいずれかである。 正の値を 1 負の値を -1 とし、CMP EAX,EAX をすると 1 - 1 = 0 -1 - (-1) = 0 0 - 0 = 0 のいずれかである。 つまり、常に計算結果は 0 になる。 [!]補足終 これでF9を押し、処理を進めるとクラックに成功した事が分かる。 |
この記事に
- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア
コメント(0)