小提示
API是程序調(diào)用系統(tǒng)功能的函數(shù)接口,比如程序要檢測(cè)光盤,就必須使用GetDriveType函數(shù)來獲得盤符的設(shè)備類型。因此找到GetDriveType函數(shù)在程序中的調(diào)用位置,就一定能在附近找到光盤檢測(cè)代碼。
第三步:在W32DASM主界面的代碼顯示框中就以高亮方式選中了GetDriveType函數(shù)的調(diào)用位置,將代碼框稍微往下拉一點(diǎn)就能看到光盤檢測(cè)代碼了(見圖2)。代碼框最左側(cè)的藍(lán)色數(shù)字是代碼的位置,如本文中在zweipet.exe中找到GetDriveType的位置為0048843,而光盤檢測(cè)代碼的位置在004088BD處。以下是代碼簡(jiǎn)要注釋:
:004088BDmoveax,dword ptr[esp+14]
:004088C1testeax, eax//檢查是否有光盤
:004088C3jnz004088DB//有光盤則跳轉(zhuǎn)到004088DB位置(即游戲開始位置),沒有光盤則不跳轉(zhuǎn)
:004088C5push00000000
:004088C7push00428934
:004088CCpush00428919
:004088D1push00000000
:004088D3calldword ptr[004233EC]//彈出一個(gè)提示窗口“請(qǐng)插入××物語(yǔ)的游戲光盤”(見圖3)
:004088D9jmp00408933//程序轉(zhuǎn)向代碼結(jié)束部分,也就是強(qiáng)制退出游戲
第三步:可以看到在004088C3處決定了程序走向(是繼續(xù)下一行代碼還是跳轉(zhuǎn)到004088DB處開始游戲),如果能讓程序不加判斷直接跳轉(zhuǎn)到004088DB,就等于跳過了光盤檢測(cè)。關(guān)閉W32DASM,打開剛才下載的RTA,選擇菜單命令“File→Open File”(文件→打開文件),同樣也是打開zweipet.exe。RTA界面立即顯示出zweipet.exe的匯編程序代碼。最左側(cè)的紅色數(shù)字為代碼位置,邊上藍(lán)色十六進(jìn)制數(shù)為該行代碼的機(jī)器碼,右側(cè)黃色文字則為匯編代碼。找到要修改的位置004088C3,這句匯編代碼為“JNZ SHORT 4088DB”,將其修改為“JMP SHORT 4088DB”(不含引號(hào),機(jī)器碼為EB16)(見圖4、5)。
你知道嗎
JNZ和JMP是什么意思?
JNZ為有條件轉(zhuǎn)移指令,先檢測(cè)一個(gè)條件,如果滿足則跳轉(zhuǎn),否則繼續(xù)執(zhí)行下一行代碼。而JMP則為無條件轉(zhuǎn)移指令,不檢測(cè)任何條件而直接跳轉(zhuǎn)至需要轉(zhuǎn)移的位置。
第四步:選擇菜單命令“File→Save File”(文件→保存文件),將修改成果保存。重新運(yùn)行“××物語(yǔ)”,不再有討厭的“請(qǐng)插入××物語(yǔ)的游戲光盤”提示框出現(xiàn),沒有光盤也能玩!
將光盤文件復(fù)制到硬盤
硬盤上僅有部分游戲文件,沒有復(fù)制的光盤文件的路徑記錄在文件或注冊(cè)表中。
修改原理:將需要從光盤中提取的內(nèi)容復(fù)制到本地硬盤中,并修改路徑記錄使游戲程序從本地硬盤進(jìn)行讀取。
典型游戲:《××醫(yī)院》修改難度:★★
所需工具:記事本
第一步:《××醫(yī)院》在安裝過程中即使選擇“完全安裝”,在運(yùn)行時(shí)也需要插入光盤,并且插入光盤后確實(shí)在游戲過程中有較大數(shù)據(jù)量的讀取,故判斷其有一部分游戲文件沒有安裝到本地硬盤中。插入該游戲光盤,瀏覽其下文件并與硬盤中的游戲安裝目錄中的文件作比較,發(fā)現(xiàn)有幾個(gè)目錄中的文件數(shù)都不同,但光盤與硬盤的目錄結(jié)構(gòu)一致。
第二步:從光盤中將缺少的游戲文件復(fù)制到硬盤中的游戲安裝目錄中(可用“覆蓋”),再次運(yùn)行游戲卻發(fā)現(xiàn)仍提示插入游戲光盤。因?yàn)橛螒虺绦虿⒉恢滥惆讶鄙俚挠螒蛭募?fù)制到硬盤中了,仍然去尋找光盤中的文件。那么怎么能讓游戲程序知道呢?我們需要修改游戲程序的“記憶”,尋找游戲設(shè)置文件(一般為文件名中包含“Config”、“cfg”、“settings”等關(guān)鍵字的文件),如本例中的游戲的設(shè)置文件為游戲安裝目錄下的Hospital.Cfg,用“記事本”打開此文件,將“INSTALL_PATH=”后的路徑修改為你游戲的安裝路徑(即硬盤中存放剛才復(fù)制過來的缺少文件的路徑,本例修改后的行如“INSTALL_PATH=C:\Program Files\Bullfrog\Hospital\”),保存并關(guān)閉文件。
第三步:再次運(yùn)行游戲,發(fā)現(xiàn)不再需要插入光盤了。
修改過程總結(jié)
在給出以上實(shí)例后,我們比較概括地總結(jié)一下修改步驟。
首先通過文件比較及光驅(qū)讀盤時(shí)間等來判斷游戲的類型是A還是B。
A.僅檢測(cè)光盤,硬盤中已安裝所有游戲文件。
第一步:用W32DASM查看游戲程序文件的匯編程序代碼,找出光盤檢測(cè)部分的代碼位置。
第二步:分析這段代碼,找出條件轉(zhuǎn)移指令JNZ的位置。
第三步:用RTA編輯游戲程序文件,查看剛才記錄下的JNZ的位置,并將其修改為JMP(無條件轉(zhuǎn)移指令)。
小提示
以上情況僅用于未做進(jìn)一步加密的游戲,有些游戲在光盤檢測(cè)代碼處使用了“花指令”或“動(dòng)態(tài)加密”技術(shù),則無法用此法修改。
B.硬盤中的游戲文件不全,需要從光盤中讀取。
第一步:比較硬盤中的游戲文件數(shù)與光盤中的文件數(shù),將硬盤中缺少的文件復(fù)制到游戲安裝目錄相應(yīng)位置中(也可復(fù)制到其他目錄并在第三步的路徑處做相應(yīng)的修改,但出于兼容性考慮,強(qiáng)烈建議復(fù)制到游戲安裝目錄)。
小提示
有一些游戲?qū)ξ募隽思用茈[藏,用此法修改路徑后會(huì)出現(xiàn)類似“缺少文件”的提示。
第二步:根據(jù)文中給出的特征識(shí)別法尋找游戲用以存放光盤文件路徑的設(shè)置文件(或注冊(cè)表位置)。
第三步:編輯該設(shè)置文件,并將其中的文件存放路徑修改為游戲安裝目錄。