跳到主要內容

muv漢化補丁修復

muv的漢化補丁對Win10會有相容性問題,這自從補丁發佈到現在,漢化組都沒有修正的意思,這問題也折騰我好一陣子了,最後決定還是自己debug比較實際。

其實解決方法意外的簡單,不過追蹤的過程挺有趣的,也讓我學到了一個hook的實作方法。

在win10下啟動漢化補丁會出現下面這個對話框:


連主程式都沒啟動就停下來了,因此我們先來觀察一下補丁的檔案結構。
muv漢化補丁的安裝檔,實際上只是把以下五個檔案複製到遊戲資料夾:
cnpack
Muv-luv.exe
rugp2.exe
rugpHook.dll
rvmm.dll
UnivUI.dll
Vm60.dll

Muv-luv.exe其實只是一個啟動器,他只負責呼叫 CreateProcess,啟動 rugp2.exe,而rugp2.exe又相依於其他 dll 檔,因此直接以 OllyDbg開啟 rugp2.exe。

令人錯愕的是,程式完全沒有停下來就直接跳出剛剛的 MessageBox了,也就是說 rugp2.exe 根本都還沒被執行,在載入階段就停了下來。

那麼在載入時有哪些code被執行了? 答案就是 dll 的主程式。再載入階段,所有rugp2.exe所相依的dll都會被載入,且dll的主程式會被執行。由於只有 rugpHook.dll是補釘原創的部分,引此可以推測我們的目標就在 rugpHook.dll中。

切換到 rugpHook.dll 的領空,果然找到了對 MessageBox的呼叫:

對這三個地方通通下斷,重新執行程式,這次果然停下來了:

一路 F8 往下,終於找到叫出錯誤訊息的地方:

注意 0x65ED21E0的 jnz指令,顯然是上方的 call 造成此處沒有跳轉,因此跟進這個函式,
來到這個地方:

這正是實作hook的地方,此處hook了以下幾個函式:
CreateFontIndirectA
GetGlyphOutlineA
EnumFontFamiliesExA
SetWindowTextA
CreateWindowExA

此處關鍵就是 rugpHook.65ED1000 這個函式,這個函式若傳回0,就會造成下方 JZ 跳轉,
引此我們跟進這個函式,看看這個函式做了什麼。

這個函式不難,做的事如下:
1. 呼叫 GetProcAddress 取得要 hook函式的開頭
2. 呼叫 VirtualProtect ,取得修改權限
3. 修改被hook函式開頭,使他跳轉到我們己的code

修改 hook 函式的程式碼如下,esi指向被hook函式開頭:
mov    eax, 0x0000FF8B ;0xFF8B 為 "mov edi, edi"的machine code
cmp    word ptr [esi], ax
jne      LOC_0x65ED1096   ;若被hook函式第一條指令不是 "mov edi, edi" 則跳轉
cmp    dword ptr [ebx], 0x90909090
-> jne      LOC_0x65ED1096
cmp    byte ptr [esi-0x01], 0x90
-> jne      LOC_0x65ED1096    ;上方四條指令檢查被hook函式之前的5個byte是否為 0x90(nop)
mov    eax, 0x0000F9EB  
mov    word ptr [esi], ax   ;修改被hook函式開頭的2 byte
mov    eax, dword ptr [ebp+0x08]
sub      edi, esi
mov    byte ptr [ebx], 0xE9
mov    dword ptr [esi-0x04], edi ;修改被hook函式之前的4 byte
pop     ebx
lea      ecx, dword ptr [esi+0x02]
pop     edi
mov    dword ptr [eax], ecx
mov    eax, 0x00000001 ;return 1
pop     esi
pop     ebp
retn     0x0008

跟蹤後發現,被hook函式之前的5個byte都不是 0x90,因此在箭頭所指的兩處會跳走,造成hook根本沒有做。

接著就簡單了,將這兩處 jne 通通用 nop 填充:

保存修改後啟動遊戲,成功!!





留言

  1. 能不能發個rugphook.dll的檔案呀 網路上都是百度的不能載

    回覆刪除
  2. dalao请受我一拜谢谢大佬

    回覆刪除

張貼留言

這個網誌中的熱門文章

OllyDbg教學(一) -- 基本操作

這篇簡單介紹一下OllyDbg的用法,還有一些使用上的技巧,這邊假設讀者對程式的執行已經有一定的了解。 OllyDbg 1 主頁 OllyDbg 2 主頁 要用OllyDbg來debug一個程式有兩種方法,第一種是直接以OllyDbg啟動程式,另一種則是先啟動程式,在用OllyDbg附加到執行中的程式。一般用第一種方法就可以成功,第二種方法通常用於一些需要特殊啟動環境的程式。

SiglusEngine地區限制破解

新版網誌: https://casidi.github.io/2016/07/29/siglusengine-cracking/ 採用這個引擎的比較有名的就是key跟SAGA PLANETS這兩家公司了。 這次以SAGA PLANET做的一個小遊戲為分析對象,遊戲可以免費下載: 【はつゆきパズル☆神経衰弱☆】 下載下來的是一個壓縮檔,檔名為 hatsukipuzzle01.zip,直接解壓縮會得到一個資料夾, 名字為: はつゆきパズル 其實遊戲必要的只有 はつゆきパズル\StartData\GameData 這個資料夾,直接把GameData資料夾搬到隨便一個地方,執行SiglusEngine.exe即可啟動遊戲。