• 标 题:我的破解心得(9) (4千字)
  • 作 者:chcw
  • 时 间:2001-3-13 18:10:44
  • 链 接:http://bbs.pediy.com

破解程序:
    深入地心(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 -------------------