o2maniaをCrossOver Games上で走らせるパッチを作る
o2maniaってなんだっけ?
今となっては存在していないけれどもその昔DJMAX Onlineというオンゲーの音ゲーがありまして、
そのデータを使ってゲームの曲をプレイできるエミュとか呼ばれる類の物がございまして…云々
という訳でその頃のデータがHDDの中に未だ眠っている人限定で、o2maniaを使うとDJMAXの曲がプレイできる訳です。
きっかけ
何もしてない状態でo2mania.exeをCrossOver Gamesで起動しようとすると、C:\windows\gecko\1.0.0\wine_gecko\xul.dllでEXCEPTION_ACCESS_VIOLATIONとか言われる。
元を正せば、この起動時の半広告みたいな感じの画面のIEコントロールで、IEコントロールのかわりに使われてるWineのGeckoが落ちているといった感じ。
そもそもこの広告じみてるの自体邪魔なので消してしまいたい。バイナリレベルで消そう。
といった所がきっかけ。
やる事・手順
OllyDbgでこのIEコントロールを含むモーダルダイアログを消す。
冒頭からのステップ実行でダイアログを作成している関数を特定する
メモリ上で言えば、00426E8EのDialogBoxIndirectParamAを呼んでいる箇所がソレだと分かった。
ダイアログボックスを作成している箇所をつぶす
モーダルダイアログボックスにおいては、モーダルダイアログのプロージャ内においてEndDialogした第二引数がそのまま作成関数、ここではDialogBoxIndirectParamAの返り値になる。
OllyDbgで実行していくと、ダイアログを普通にクリックで閉じた場合のEAX(=戻り値)は1である事が分かったので、DialogBoxIndirectParamA呼び出しのPUSHの頭から、MOV EAX, 1して、1バイトあまるのでNOPで埋める。
まとめ
まとめてパッチにするとこうなる。
なお、対象にしているのは、Mania 1. 3. 0 Betaの日本語化Patchが当たっていないバイナリである。
というか日本語化Patch自体が何故か(このパッチ自分で作る前から)MD5とかで怒られて当てられなかった。
FILENAME o2mania.exe 00004207: 0F E9 00004209: 83 00 0000420C: 00 90 00026E89: 50 B8 00026E8A: 51 01 00026E8B: 52 00 00026E8C: 57 00 00026E8D: 56 00 00026E8E: FF 90 00026E8F: 15 90 00026E90: A8 90 00026E91: 53 90 00026E92: 4B 90 00026E93: 00 90 00029731: 0F E9 00029732: 84 89 00029733: 88 00 00029736: 00 90