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
まあ、とてもわかりやすいですねぇ。
後はメモリアドレス→オフセットを変換してやると、
| メモリアドレス | オフセット | 元データ | 書き換え後 |
メディ倫認可ロゴ表示 | 0040ECCA | 0000ECCA | 75 0C | EB 0C |
オープニング動画再生 | 0040ECE8 | 0000ECE8 | 75 21 | EB 21 |
こんなかんじですね。
さいごに
今回の方法は「おとボク」だけでなく、ほとんどのゲームで使えます。
例外としてはNScripterや独自のスクリプトエンジンを使用しているゲームなど、
ロゴ表示までスクリプトの一部として組まれている作品では今回の手法は使えません。
しかし、今回の「おとボク」のプログラム…ロゴ表示処理の手前に条件分岐があるということは、
開発段階では手前の分岐がロゴを表示しないように作用していたとも考えられます。
ひょっとするとデバッグ用変数も生きてるかもしれませんねぇ。