破解程式:
深入地心(Game)
破解工具:
SoftICE 3.0 For Windows 95
W32Dasm 8.5
破解者:
chcw
在安裝完深入地心之後,執行其主程式Emb.exe,得到錯誤提示“你並未正確安裝本遊戲”。下
面我們將分析並解決該錯誤。
1. 用SoftICE載入EMB.EXE。
2. 因為在執行時會有一個錯誤提示,我們就對它設定斷點:
BPX MESSAGEBOXA
3. 按Ctrl-D,程式開始執行,觸發SoftICE,光帶停留在MessageBoxA函式的入口處:
USER32!MessageBoxA
0137:BFF541BA PUSH EBP
將游標移到MessageBoxA函式的返回處
0137:BFF541D RET 0010
並鍵入命令HERE,程式執行到游標所在處。
4. 按F10,回到呼叫MessageBoxA函式的上層語句處:
0137:00470B29 CALL USER32!MessageBoxA
從該語句處向上找,發現在:00470B0F有一處函式呼叫,其函式的返回值決定了是否顯示錯誤的
提示。
0137:00470B0F CALL 00402F5E
<-函式呼叫
0137:00470B14 ADD ESP, 00000004
0137:00470B17 TEST EAX, EAX
;若EAX非零,則不顯示錯誤資訊。
0137:00470B19 JNE 00470B36
5. 鍵入BC *,清除原先的斷點。再將滑鼠移到:00470B17 TEST EAX, EAX處雙擊,設定執行斷
點。
6. 按Ctrl-D回到執行程式,此時程式顯示完錯誤資訊,並正常退出。在SoftICE中選擇Module/Load
再次載入程式。
7. 程式開始執行後 ,SoftICE將被觸發,剛才設定的斷點被啟用了:
0137:00470B17 TEST EAX, EAX
; <-啟用的斷點處
鍵入r eax=1,將eax的值強行設定為1。然後鍵入X,繼續執行程式。此時程式不再顯示錯誤資訊,
而是開始顯示主介面。但在選擇New Game後,程式繼續執行時會出錯並退出。看來,很可能函式
00402F5E讀取了某些主程式執行時所必須的資料,我們需要進一步分析函式00402F5E
8. 用W32Dasm對執行程式EMB.EXE進行反彙編,並在Search/Find Text中輸入"call 00402F5E",查詢
呼叫函式00402F5E的語句,亮條將停留在以下語句處:
:00470B0F E84A24F9FF
call 00402F5E
在工具欄上選擇"Call",文字呼叫(Text Call)該函式。亮條將停留在函式00402F5E的入口處:
:00402F5E 55
push ebp
9. 從:00402F5E處往下看,可以知道該函式的大致功能。函式的第一部分是呼叫wsprintfA()函式:
wsprintfA(OneString, "Software\TGL\INSTALL\%s", AnotherString)
,
形成一個型如"Software\TGL\INSTALL\AnotherString"的串OneString以備後用(OneString和
AnotherString是引數,為敘述方便,這裡我們指定它們的名字):
* Possible StringData Ref from Data Obj ->"Software\TGL\INSTALL\%s"
|
:00402F6B 6868304800
push 00483068
:00402F70 8D8DFCFEFFFF
lea ecx, dword ptr [ebp+FFFFFEFC]
:00402F76 51
push ecx
|
* Reference To: USER32.wsprintfA, Ord:0264h
:00402F77 FF1544865B00
Call dword ptr [005B8644]
程式的第二部分是從登錄檔中開啟上述串OneString對應的鍵,並從中取出某一串值:
:00402F95 6801000080
push 80000001
* Reference To: ADVAPI32.RegOpenKeyExA, Ord:012Eh
|
:00402F9A FF15FC835B00
Call dword ptr [005B83FC]
...
* Possible StringData Ref from Data Obj ->"GameDirectory"
|
:00402FB9 6880304800
push 00483080
:00402FBE 8B95F8FEFFFF
mov edx, dword ptr [ebp+FFFFFEF8]
:00402FC4 52
push edx
* Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
|
:00402FC5 FF1500845B00
Call dword ptr [005B8400]
...
從串名"GameDirectory"我們可以猜到,該串中存放的串值是遊戲的目錄。查Win32 SDK可
以知道這個鍵是在HKEY_CURRENT_USER下。
根據上述分析,我們可以猜想到,在正版的遊戲正常安裝後,會生成主鍵
HKEY_CURRENT_USER\Software\TGL\INSTALL\AnotherString
並在該主鍵下生成一個串,該串的名字為"GameDirectory",值為遊戲檔案所在的目錄。我
們只要在登錄檔中手工鍵入上述的主鍵和串,就應該能使程式正常啟動。
10.但是在串\Software\TGL\INSTALL\AnotherString中尚有子串AnotherString的值是未知的。
在工具欄上選擇"Ret",返回到呼叫函式00402F5E的語句處:
:00470B0A 68849E4800
push 00489E84
:00470B0F E84A24F9FF
call 00402F5E
從壓棧的引數中我們可以獲取串AnotherString的地址為00489E84。
11.選擇HexData/Hex Display of Data Object/Segments,並找到00489E84處的資料:
:00489E80 xx xx xx xx B2 60 A4 4A RH...`.J
:00489E88 A6 61 A4 DF 00 xx xx xx .a......
這些資料看起來好象是一些亂碼,仔細分析一下,就可以發現它們都是中文的內碼(BIG5),
解讀後得到字串AnotherString="深入地心"。
12.現在我們可以修改登錄檔了。執行REGEDIT,開啟登錄檔,建立鍵
HKEY_CURRENT_USER\Software\TGL\INSTALL\深入地心,(注意這裡必須用BIG5輸入),並
在此主鍵中加入串GameDirectory=.\
附:修改登錄檔的檔案EMB.REG
------------------------ EMB.REG ----------------------------
REGEDIT4
//Regist Embrace(Add a key to the register table)
//Written By Mr. CHCW
[HKEY_CURRENT_USER\Software\TGL]
[HKEY_CURRENT_USER\Software\TGL\INSTALL]
[HKEY_CURRENT_USER\Software\TGL\INSTALL\`Jaみ]
"GameDirectory"=".\\"
--------------------- End of File EMB.REG -------------------