最近遇到有一款遊戲,其簡體中文版比英文版賣得平得多,但是只能在簡體中文Windows下跑,用意大概是只讓大陸的用戶才能用這個平價版吧。天呀,誰說大陸用戶必然是用簡體中文的Windows?
坊間的確有流傳著一些破解和後門,但有些好的方法在Vista下不能用,有的就只能破一部分等等……為了通過較正當的手段(而不是用綠色版)而玩到這個遊戲,並在好奇心驅使下,就DIY了一把。
先前基本上從未用過Visual Studio以外的Debugger。一般有source code,只是debug一下Managed Code或C++的情況下,VS都能應付有餘。但看來今次「劫數難逃」,還是要認真的學會用WinDbg。
觀察現有的破解方法,以及在Error Message set breakpoint等手段,基本上鎖定遊戲是透過GetSystemDefaultUILanguage等API拿得相關系統安裝語言,還有0×0804 (簡中的Lang ID)是關鍵字之一。在反匯編碼搜一下,就找到相關的流程控制代碼。
本來還打算用DLL Injection/Hooking的方法,讓程式要Call GetSystemDefaultUILanguage的時候,不是Call System的而是Call我創建的替代Function。這方法用於簡單的測試程式上的確無問題,但因種種知名和不知名原因都未能成功應用在該遊戲上。
另一個我在測試用的方法是,在GetSystemDefaultUILanguage set Breakpoint,在返回的時候把返回值改成我想要的。
想起安裝WinDbg它有問我要不要裝SDK,就想起不如用SDK把這個手工方法自動化。一查Document之下發現除了有個SDK Dll之外,原來還提供了一個Managed Wrapper Dll。研究了一會,真的這很容易通個這個API做了一個Debugger程序出來。
經過幾翻修改後,最終成功騙過遊戲我是用簡體中文Windows,而且不需要修改任何程式檔案。
真想不到第一次認真用WinDbg竟然是因為這樣的緣故。話說回來,這個可惡的遊戲叫《魔獸爭霸3:冰封王座》。