RealLiveを使用して作られたエロゲーやギャルゲーのCD/DVDチェックを外す
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系統のディスクチェックはとても簡単に回避できます。先ずディスクチェックに用いられる事の多いGetDriveTypeやGetVolumeInformationを呼び出しているコードを探しましょう。
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
今回見つかったのはこの二カ所です。01A05598か01A05610に移動すると分かりますが同じルーチンの中で使用されています。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 01A03EA1をJMP 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で開いてみましょう。スパゲティのようなアンチデバッグがあなたを待っています・・・・・・・・



Recent Comments