• 标 题:翻译:TORN@DO's Cracking Tutorial for (4千字)
  • 作 者:bood
  • 时 间:2001-2-10 18:59:48
  • 链 接:http://bbs.pediy.com


TORN@DO's Cracking Tutorial for
Babylon Translator 3.50

你需要的工具:WinIce和一个十六进制编辑器。我的意见是用Hacker's View。如果你没有这些工具,你可以到一些破解软件的网站去下载。

Banylon是一个免费软件,但是它在使用过一段时间后仍然会过期(试用期?)。你可以到它的网站下载新版本继续试用(骗取访问量?)。而象你和我一样的人不想一直去升级。你应当明白我为什么破解一个有时间限制的免费软件,这是我见过的第一个有时间限制的免费软件。我想你已经读过《Cracker's Notes》,所以我们现在可以开始了。不过不要问我要那个Notes,自己到破解网站去找!

Step 1
安装Babylon并且看一下“关于”窗口。你会看见“You've x Days left ...”的消息,然后退出。将你的系统日期向前推至少101天。再次启动时你会看到过期的窗口。从我的其他教程你会发现我总是会看一下入口函数和出口函数,因为这将节省我很多时间。
  ADAVPI32.RegCloseKey
  ADAVPI32.RegOpenKeyExA
  ADAVPI32.RegQueryValueExA


这些是很重要的函数。但是我们知道它们不能检查日期。它们只能存储程序设置。我们再看一下CAPTLIB.DLL
  IsBabylonPastExpiryDate
  Kernel32.GetLocalTime
  Kernel32.GetSystemTime

看见这个“IsBabylonPastExpiryDate”了?知道这意味着什么吗?对了! 把CAPTLIB.DLL拷到C:\,在WINICE.DAT中加入:

  EXP="C:\CAPTLIB.DLL"

使winice加载CAPTLIB.DLL。重启动你的计算机,不要忘了加载WinIce!

Step 2
让我们开始吧!Ctrl+D调出winice,在函数IsBabylonPastExpiryDate处设置断点(BPX IsBabylonPastExpiryDate)。如果出现错误,那么你肯定忘了改变winice.dat了,或者你没有重启动你的计算机。运行Babylon,你会在函数被调用的地方回到WinIce中。按F10跳过此函数,哦,过期窗口!我们再在MessageBoxA设断点。按F11回到呼叫此函数的程序。现在你会看到这些代码:
0137:00AA141B    FF75E8                        PUSH          DWORD PTR [EBP-18]
0137:00AA141E    E8BFC60000                CALL            ADAVPI32!RegCloseKey
0137:00AA1423    85DB                            TEST            EBX, EBX
0137:00AA1425    7431                            JZ                00AA1458
...
0137:00AA1442    BD95C4FDFFFF          LEA              EDX, [EBP-023C]
0137:00AA1448    52                                PUSH          EDX
0137:00AA1449    E9C4C60000                CALL            USER32!GetFocus
0137:00AA144E    50                              PUSH          EAX
0137:00AA144F    E8A6C60000                CALL            USER32!MessageBoxA
0137:00AA1454    33C0                            XOR            EAX,EAX
0137:00AA1456    EB04                          JMP              00AA145C
0137:00AA1458    0FBF45F2                    MOVSX        EAX,WORD PTR [EBP-0E]


现在你会发现程序比较了某个值,如果没有时间剩下,那么就会出现过期对话框。所以我们先破解这里。将JZ 00AA1458改为JMP 00AA1458。你可以实验一下,如果ZF被置位或者没有会发生什么情况。重新运行Babylon,还看的见那个窗口吗?当然看不见了!在下一步,我们将要除掉IsBabylonPastExpired中的数据检查,退出吧。

Step 3
你已经知道,IsBabylonPastExpired是CAPTLIB.DLL的一个输出函数。当一个程序有一个出口时,这个口往往被用到。所以我们在IsBabylonPastExpiryDate处设了一个断点。运行程序,将会回到winice。按F10直到你看见这样的代码:

0137:00AA11F0    E851C80000                CALL            KERNEL32!GetSystemTime

现在你知道时间就是在这里检查的。当你按F10的时候,看一下esi,你会发现esi突然改变了!用“? VALUE”你会看见在第一次运行程序后你新设置的时间。往下翻,你会看见这样的代码:

0137:00AA12B9    7D0A                          JGE              00AA12C5
0137:00AA12BB  BB01000000                MOV            EAX,00000001
0137:00AA12C0    E956010000                JMP              00AA141B

这个JGE的意思是:如果日期已经到过期时间或以后,那么禁止你“试用”Babylon...如果不是,那么程序仍然可用(JMP 00AA141)。所以你可以改变esi的值来看看是不是这样,或者你可以输入“A”然后NOP回车NOP回车,回车(是两个!)。然后Babylon会完全可用!

Step 4

现在你已经知道MessageBox出现的地方和日期检查的地方。你可以用一个简单的JZ或者JMP跳过MessageBox;用JMP 00AA141B替代JGE 00AA12C5或者NOP掉这个JGE 00AA12C5。最后用FC比较CAPTLIB.OLD和CAPTLIB.DLL,并在PATCH.TXT储存两者的不同之处(FC /B CAPTLIB.OLD CAPTLIB.DLL > PATCH.TXT)。现在编一下你的pacth并编译。把CAPTLIB.DLL改名为CAPTLIB.CRK,CAPTLIB.OLD改名为CAPTLIB.DLL。执行你的pacth。比较CAPTLIB.DLL和CAPTLIB.CRK直到两者完全相同。好好享受这个翻译工具吧,哦,别忘了删除C:\CAPTLIB.DLL和WINICE.DAT的EXP="C:\CAPTLIB.DLL一行。