update 2005.05.09

処女はお姉さまに恋してる メディア倫理協会認可ロゴ外し


概要
PC用18禁ゲームの大半は、ソフ倫ことコンピュータソフトウェア倫理機構のチェックで流通していますが、
キャラメルBOX処女はお姉さまに恋してるは、メディ倫ことメディア倫理協会認可で販売されています。

これが存在感バリバリで、ゲームを起動する毎に5秒間強制的に認可証明が表示されるのですが、
気分的にもゲームを楽しもうとする気分を害するだけで全く意味がありません。
(そもそも箱に思いっきり表示されているのですから)。

てわけで、逆アセンブラ+バイナリエディタを使ってロゴを除去してみましょう。
ついでに起動短縮したい人向けに、動画再生スキップも施しちゃいます

手順

このゲームはプログラムを実行すると、
「メディ倫認可ロゴ表示→オープニング動画再生→タイトル画面」
という流れになりますので、動画再生からさかのぼってロゴ表示処理を探すことが可能です。

また、実行プログラムotoboku.exeのVer1.1から動画再生ルーチンが改善され、
動画再生処理の追跡がしやすくなりました。
(Ver1.1で、all.mpgという動画ファイルそのものを再生するように仕様が変更されました)。
というわけで当然ですが、必ずVer1.1修正パッチを適用してから作業を行ってください。

なお、使用する逆アセンブラはDisassemですので、いつも通り、
>disasm otoboku.exe > list.asm
こんな感じで逆アセンブルリストを出力し、テキストエディタで開きましょう。

続いてオープニング動画ファイル名であるall.mpgを文字列検索します。
すると、
=========
:00409400 83EC28                  sub esp, 028
:00409403 56                      push esi
:00409404 57                      push edi
:00409405 68F8A14400              push 0044A1F8
                      (StringData)"all.mpg"
:0040940A BEE0A14400              mov esi, 0044A1E0
                      (StringData)"system.bin"
:0040940F FF1564214400            call dword[00442164 ->00043F54 GetFileAttributesA]
                            ;;call KERNEL32.GetFileAttributesA
:00409415 83F8FF                  cmp eax, -001
:00409418 7405                    je 0040941F // ファイルが無ければ分岐
:0040941A BED0A14400              mov esi, 0044A1D0
                      (StringData)"all.mpg"
........(以下略)
こんな感じで、ふつーに動画再生処理がヒットします。
さらにこの処理の開始アドレス00409400をコールしている処理を探すと…
アドレス0040D37B,0040ECF5,0040EF88の3箇所にヒットします。
こういうときはデバッガで各アドレスにブレークポイントを仕掛けるのがスマートですが、
たった3箇所ですから、NOP(90)で埋めて再生されなかったら当たりの力業でいってみます。
2番目であるアドレス0040ECF5のcall 00409400を潰したときに動画再生が行われなくなりましたので、
ここがオープニング動画再生処理のコール元であるとわかります。
その周辺の処理は以下のような流れになっています。

:0040ECC2 8D4600                  lea eax, dword[esi+00]
:0040ECC5 83EC1C                  sub esp, 01C
:0040ECC8 84C0                    test al, al
// jmp(750C->EB0C)でメディ倫認可ロゴ除去
:0040ECCA 750C                    jne 0040ECD8
:0040ECCC E8AF070000              call 0040F480 // ロゴ表示・ウェイトなどの処理
:0040ECD1 C605A18D460001          mov byte[00468DA1], 01
---------
:0040ECD8 53                      push ebx
:0040ECD9 55                      push ebp
:0040ECDA 56                      push esi
:0040ECDB 57                      push edi
---------
:0040ECDC A0A08D4600              mov al, byte[00468DA0]
:0040ECE1 C644241200              mov byte[esp+12], 00
:0040ECE6 84C0                    test al, al
// jmp 0040ED0B(7521->EB21)でオープニング動画再生スキップ
:0040ECE8 7521                    jne 0040ED0B
:0040ECEA A1F4774600              mov eax, dword[004677F4]
:0040ECEF 85C0                    test eax, eax
:0040ECF1 740C                    je 0040ECFF
:0040ECF3 6A00                    push 000
:0040ECF5 E806A7FFFF              call 00409400 // 動画再生処理
:0040ECFA 83C404                  add esp, 004
:0040ECFD EB05                    jmp 0040ED04
---------
:0040ECFF E85C090000              call 0040F660
---------
:0040ED04 C605A08D460001          mov byte[00468DA0], 01
---------
:0040ED0B E890040000              call 0040F1A0
:0040ED10 E84B0F0000              call 0040FC60
:0040ED15 6A01                    push 001
// タイトル画面用BGM(OP主題歌のインスト版)ロード
// ここの文字列を直接書き換えるとタイトル画面のBGMが変わる。
:0040ED17 6898A64400              push 0044A698
                      (StringData)"bgm01_inst"
:0040ED1C E81FF9FFFF              call 0040E640
まあ、とてもわかりやすいですねぇ。
後はメモリアドレス→オフセットを変換してやると、
メモリアドレスオフセット元データ書き換え後
メディ倫認可ロゴ表示0040ECCA0000ECCA75 0CEB 0C
オープニング動画再生0040ECE80000ECE875 21EB 21
こんなかんじですね。

さいごに

今回の方法は「おとボク」だけでなく、ほとんどのゲームで使えます。
例外としてはNScripterや独自のスクリプトエンジンを使用しているゲームなど、
ロゴ表示までスクリプトの一部として組まれている作品では今回の手法は使えません。

しかし、今回の「おとボク」のプログラム…ロゴ表示処理の手前に条件分岐があるということは、
開発段階では手前の分岐がロゴを表示しないように作用していたとも考えられます。
ひょっとするとデバッグ用変数も生きてるかもしれませんねぇ。