Archive

Posts Tagged ‘NoCD’

RealLiveを使用して作られたエロゲーやギャルゲーのCD/DVDチェックを外す

8月 28th, 2008

RealLiveはビジュアルアーツが開発しているノベルゲームのスクリプトエンジンです。例えばPC版の「CLANNAD」や「AIR」に利用されています。今回は参考までにRealLive Version 1.5.0.4が利用されている「CLANNAD」のディスクチェックを回避します。ちなみに「AIR」に利用されているのはRealLive Version 1.2.9.5です。


今回必要なツールと・・・・

・デバッガ「OllyDbg

・RealLiveが利用されているゲーム

正しくない日本語を読む力


今回扱うことになるRealLive Version 1.5.0.X系統のディスクチェックはとても簡単に回避できます。先ずディスクチェックに用いられる事の多いGetDriveTypeGetVolumeInformationを呼び出しているコードを探しましょう。

Intermodular calls in module ‘REALLIVE’, item 66
Address = 01A05598
Command = CALL DWORD PTR DS:[<&KERNEL32.GetDriveTypeA>]
Destination = kernel32.GetDriveTypeA

Intermodular calls in module ‘REALLIVE’, item 67
Address = 01A05610
Command = CALL DWORD PTR DS:[<&KERNEL32.GetVolumeInformationA>]
Destination = kernel32.GetVolumeInformationA

今回見つかったのはこの二カ所です。01A0559801A05610に移動すると分かりますが同じルーチンの中で使用されています。GetDriveTypeA ,GetVolumeInformationAを呼び出しているコードにブレークポイントを仕掛けてからDVDを入れずにF9キーを押してCLANNADを起動させてみましょう。ちなみにWindows Vistaを使用してCLANNADをデバッグすると何故かアンチデバッグに引っかかります。Windows XPの環境では記憶が正しければ何故か引っかかりません。

そこでアンチデバッグも回避してみましょう。面倒な方はスルー

OllyDbgのCPU Windowを右クリックしSearch for→All intermodular callsから呼び出されている外部関数を確認すると簡易的なアンチデバッグに用いられる事の多いIsDebuggerPresent関数が使われている事に気がつくと思います。その関数が使われているルーチンの頭の方を見ると明らかに怪しげな文字例が・・・・Please turn off debugger! and try again.

もう一度IsDebuggerPresent関数の付近を見てみましょう。

Address   Hex dump          Command                                  Comments
01A03CB9  |.  FF15 5CAFC001 CALL DWORD PTR DS:[<&KERNEL32.IsDebugger ; [KERNEL32.IsDebuggerPresent
01A03CBF  |.  83F8 01       CMP EAX,1
01A03CC2  |.  0F85 D9010000 JNE 01A03EA1

IsDebuggerPresent関数を呼び出し戻り値がTURE(1)なら01A03EA1にジャンプしないようになっている事が分かります。と言う事はJNE 01A03EA1JMP 01A03EA1に書き換えれば恐らくアンチデバッグを回避できるはず。

CPU Disasm
Address   Hex dump          Command                                  Comments
01A03CC2     /E9 DA010000   JMP 01A03EA1
01A03CC7     |90            NOP

File C:\KEY\CLANNAD_FV\REALLIVE.EXE
Address   Hex dump          Command                                  Comments
0026CCC2    E9 DA010000     JMP 0026CEA1
0026CCC7    90              NOP

と思いきや01A03EA1以降のコードにも様々な関数を駆使してアンチデバッグを行っていました・・・・・・・orz。全てを解説していては面倒なので

RealLiveのアンチデバッグについて解説していると切りがないのでディスクチェック回避の続きを解説します。ブレークポイントを仕掛けF9で実行した後の話から再開。

ブレークポイントで止まるので付近のコードを読んでみましょう。GetDriveTypeA関数の下のコードを見ていくとエラーメッセージを取得する際によく使用されているFormatMessageA関数が有ります。この事から推測するとGetDriveTypeA関数付近からFormatMessageA関数よりも下の一定の部分にジャンプさせればこのルーチンを無事に抜けられるはず。01A056C6のRETNから上のコードを見ていくとJG 01A056C2から01A056C2にジャンプしている事が分かります。これはかなり怪しいです。必ずジャンプするようにJMP 01A056C2に書き換えてみましょう。恐らくこれでDVDを入れなくても起動するはずです。


今回の解析で分かった事は・・・・・

RealLiveのディスクチェック=糞
RealLiveのアンチデバッグ=SPAGHETTI
CODE

RealLiveのディスクチェックは全く勉強になりませんがアンチデバッグだけは勉強になります。「CLANNAD」を持っている方は一度OllyDbgで開いてみましょう。スパゲティのようなアンチデバッグがあなたを待っています・・・・・・・・

S1sG0d tech , , , ,