全体表示

[ リスト ]

CD/DVDチェックとは、PCゲームなどに使用されているプロテクトの1つである。
今回はそれをクラックし、CD/DVD無しでも起動できるようにしてみる。
このようなクラックをNO CD/DVD化という。

クラック対象はうさみみハリケーンに同梱されている
UsaTest2Win.exe である。

なおこれはあくまでも練習用ソフトウェアである。

OllyDBGを管理者として実行し、
ファイル⇒開くより、UsaTest2Win.exeを開く。

イメージ 1



開いた後F9を押す。
(2回押す必要あり)
その後、プログラム解析演習(E)⇒CD/DVDチェック(C)を選ぶ。

イメージ 2


すると CD/DVDチェックに失敗しました というメッセージが表示される。

イメージ 3



まず、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にカーソルを合わせ
右クリック⇒全ての参照にブレークポイントをセットを選択する。

イメージ 4



プログラム解析演習(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


これでハードディスクをチェックさせる事ができる。


次にボリュームラベルを取得後そのボリュームラベルをチェックする処理を
見てみる。

イメージ 5

GetVolumeInformationAでボリュームラベルを取得し、
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を押し、処理を進めるとクラックに成功した事が分かる。
イメージ 6


この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(0)


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事