破解程序:
深入地心(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\瞏み]
"GameDirectory"=".\\"
--------------------- End of File EMB.REG -------------------
- 标 题:我的破解心得(9) (4千字)
- 作 者:chcw
- 时 间:2001-3-13 18:10:44
- 链 接:http://bbs.pediy.com