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で埋める。

なんかおこられるのでその部分も潰す

CRCチェックだかなんだか知らないが、exeを書き換えると別の箇所で怒られる(文字化けしてて読めない)のでそこも潰す。
004297B2のMessageBoxが呼ばれないために、00429731のJEをJMPにして、00404283のMessageBoxもその前の部分のJE(00404207)にを同様にJMPにする。

これでとりあえずCrossOver Gamesで起動するようになった!
普通のWindowsでの動作でも最初の広告的なのが出なくなった!

まとめ

まとめてパッチにするとこうなる。
なお、対象にしているのは、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