洞窟物語の改造 - 多重起動防止の解除 -

昨日のエントリに引き続き洞窟物語の改造をしてみる。
今日は多重起動防止の解除だ。オンラインゲームではないのであまり意味はないが気にしない。
多重起動防止の方法にはいくつかあってここが参考になる。
さて、前置きはここまでで早速始めようと思う。
まず、Immunity Debuggerで洞窟物語を開く。
次に、Ctrl+Nで使用しているAPI一覧を表示させ、先述したURLに挙げられているAPIを探す。
CreateMutexが見つかった。


CreateMutexの項目を右クリックし、Find references to importを選ぶと、アドレス00412472が見つかるのでその項目をダブルクリックする。
周辺の逆アセンブルコードリストを眺めると次のようになっている。


アドレス00412472のCreateMutexで作成している多重起動防止用のMutexが開けるかどうかをアドレス0041243FのOpenMutexで試しているようだ。
多重起動防止を解除するにはCreateMutexを呼ばないようにすればよいから、CreateMutexの最初の引数をPUSHしているところからCreateMutexの呼び出し後までJMPするようにすればよい。
最終的に変更箇所は以下のようになった。

; 変更前
0041246D  |. 52             PUSH EDX                                 ; /MutexName => "Doukutsu"
0041246E  |. 6A 00          PUSH 0                                   ; |InitialOwner = FALSE
00412470  |. 6A 00          PUSH 0                                   ; |pSecurity = NULL
00412472  |. FF15 C4C04800  CALL DWORD PTR DS:[<&KERNEL32.CreateMute>; \CreateMutexA
00412478  |. A3 78E44900    MOV DWORD PTR DS:[49E478],EAX

; 変更後
0041246D     EB 09          JMP SHORT Doukutsu.00412478
0041246F     006A 00        ADD BYTE PTR DS:[EDX],CH
00412472  |. FF15 C4C04800  CALL DWORD PTR DS:[<&KERNEL32.CreateMute>; \CreateMutexA
00412478  |. A3 78E44900    MOV DWORD PTR DS:[49E478],EAX

変更が終わったら右クリック->Copy to executable->All modificationsで現れるダイアログに対してCopy allを選ぶ。すると、ウィンドウが表示されるので右クリック->Save fileでファイルにセーブする。

多重起動出来ることが確認できた。


パッチを作成すると以下のようになった。

*== TARGET_FILE ================
FILENAME Doukutsu.exe
* FileSize: 1478656 bytes
* LastMod.: 2005/06/12 16:07:12
*===============================
0001246D: 52 EB
0001246E: 6A 09