第一章 注冊機破解法的原理和應對方法(1 / 2)

第一章 注冊機破解法的原理和應對方法

認識注冊機破解法

顧名思義,寫注冊機來破解軟件注冊的方法,就是模仿你的注冊碼生成算法或者逆向注冊碼驗證算法而寫出來的和你一模一樣的注冊機。如果被寫出注冊機,你的軟件隻好免費了。或者你必須更換算法,但以前注過冊的合法用戶都得被迫更換注冊碼了。

Cracker要寫注冊機必須詳細研究你軟件的驗證模塊,這必須先將你的軟件脫殼,再反彙編或者用調試器跟蹤。市麵上許多加殼和保護軟件都吹噓不可能被脫殼,但到目前為止沒有一個軟件兌現了自己的諾言。由於CPU最終執行的都是有效指令,所以等你的程序自解壓完成後再從內存中Dump出來就可以實現脫殼。因此不要在殼上麵花很多功夫,因為沒有這個必要。

第一招:製造假相

反彙編和調試器跟蹤都是不可能防止的,因為所有的Win32程序都必須通過API來調用Windows係統中的關鍵DLL的(如Kernel32.dll、GDI32.dll等),然而API是可以Hook的。我們隻能從自己的代碼著手來保護我們的勞動果實了。

為了自己調試和以後維護的方便,我們一般采用有意義的名字給我們的函數命名,可這給了Cracker可乘之機。例如這樣的函數是什麼意思大家應該一目了然吧?IsRegistered(),IsLicensed(),LicenseVerify(),CheckReg()......這樣Cracker就可以輕鬆地從數千個函數中找到他的目標--你的注冊碼校驗函數!而且破解Delphi編寫的軟件還有一件TMG小組的破解利器--DeDe。它可以輕鬆地看到你軟件裏的Form、Unit和函數名,還可以反彙編一部分代碼,更可以和Win32DASM合作反彙編更多的代碼,對Delphi編出的程序威脅極大。

為了不給Cracker創造溫馨舒適的破解環境,要故意混亂(Obfuscate)我們的代碼,將軟件中所有的函數名全部替換成隨機生成的函數名。例如Func_3dfsa_fs32zlfv這個函數是什麼意思?恐怕隻有天知道了。網上有現成的代碼混亂器,按你使用的編程語言的種類可以找到一些。但要注意,隻有當你要發布軟件時才使用它,而且一定注意備份源代碼。否則,當你看不懂你自己的代碼時就著急了:)

第二招:用公匙,並改名

另外,一定要使用公開密匙算法保護你的軟件。RSA、DSA和ElGamal之類的算法都可以從網上找到。但注意:將你算法單元中所有涉及到算法名稱的字符串全部改名。避免被Cracker發現你用的算法而模仿寫出注冊機來!你還可以張冠李戴,明明用的DSA,將名字全部替換成RSA。

其它算法,如對稱算法和Hash算法也要注意改名,否則這樣:

EncryptedCode=Blowfish(MD5(UserName),MD5(Key));

//你的加密算法,使用了Blowfish(對稱算法)和MD5(Hash算法)

雖然那些Cracker不了解Blowfish和MD5算法的原理,也不會逆向推測它們,但他們了解你的校驗算法的流程和算法名,便可馬上從網上找到類似的Blowfish和MD5算法包,從而模擬你的軟件仿造出注冊機。

如果你用不常見的,算法如Skipjack(NASA美國航天局標準算法)、LOKI、3-WAY、Safer之類不出名但保密程度很高的算法,並且全部改名,這樣就會傷透他們腦筋了。

當然,最好把Hash算法也全部改名,會給他們製造更多的困難。但注意,MD5和SHA之類的Hash初始值會被Cracker從內存中找到,這樣他就知道你用的Hash了。所以建議同時使用MD5的變形算法Ripe-MD(RMD)128或160或其它的Hash,如Tiger、Haval等算法。

第三招:阻止別人調試

還有一點,調試器對我們的威脅很大,我們不會讓Cracker們舒舒服服地使用SoftICE、TRW或OllyDbg來調試我們的程序。除了常用的MeItICE方法外,這裏我給一個筆者寫的方法:

{檢查自己的進程的父進程是否為Explorer.exe,否則是被調試器加載了}

{不過注意,控製台程序的父進程在WinNT下是Cmd.exe!}