|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2004-03-30, 07:20 PM | #1 |
榮譽會員
|
註冊機破解法的原理以及應對方法
認識註冊機破解法
顧名思義,寫註冊機來破解軟體註冊的方法,就是模仿你的註冊碼產生算法或者逆向注 冊碼驗證算法而寫出來的和你一模一樣的註冊機。 如果被寫出註冊機,你的軟體只好免費了。或者你必須更換算法,但以前注過冊的合法用戶都得被迫更換註冊碼了。 上期《與暴力破解過招》的方法雖然可以避免爆破,但註冊機的威脅還是存在的。 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糧o個函數是什麼意思?恐怕只有天知道了。網上有現成的代碼混亂器,按你使用的編程語言的種類可以找到一些。 但要注意,只有當你要發佈軟體時才使用它,而且一定注意備份源程式碼。否則,當你看不懂你自己的代碼時就著急了:) 第二招:用公匙,並改名 另外,一定要使用公開密匙算法保護你的軟體。RSA、DSA和El Gamal之類的算法都可以從網上找到。 但注意:將你算法單元中所有涉及到算法名稱的字元串全部改名。避免被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!} {注意載入執行TlHelp32.pas單元} procedure CheckParentProc; var //檢查自己的行程的父行程 Pn: TProcesseNtry32; sHandle:THandle; H,ExplProc,ParentProc:Hwnd; Found:Boolean; Buffer:array[0..1023]of Char; Path:string; begin H:= 0; ExplProc:= 0; ParentProc:= 0; //得到Windows的目錄 SetString(Path,Buffer) GetWindowsDirectory(Buffer,Sizeof(Buffer)- 1)); Path:= UpperCase(Path)+ '\EX PLORER.EXE';//得到Explorer的路徑 //得到所有行程的列表快照 sHandle:= CreateToolHelp32Snap Shot(TH32CS_SNAPALL,0); Found:= Process32First(sHandle,Pn);//搜尋行程 while Found do //遍歷所有行程 begin if Pn.szExeFile = ParamStr(0)then //自己的行程 begin ParentProc:= Pn.th32ParentProcessID://得到父行程的行程ID //父行程的句柄 H:= OpenProcess(PRO CESS_ALL_ACCESS,True,Pn.th32Parent ProcessID); end else if UpperCase(Pn.szExeFile)= Path then ExplProc:= Pn.th32ProcessID;//Ex plorer的PID Found:= Process32Next(sHandle,Pn);//搜尋下一個 end; //父行程不是Explorer,是除錯器…… if ParentProc <> ExplProc then begin TerminateProcess(H,0);//殺之!除之而後快也! :) //你還可以加上其它什麼當機 代碼來消遣消遣這位可愛的Cracker:) end end 你可以在Delphi或者VC中試試,這樣可以把Delphi和VC殺掉了,因為你現在用的是Delphi和VC的內置除錯器來執行你的程序。 調試的時候你還是把它的註釋刪掉吧,發佈時別忘記啟動喲! 第四招:保護字元串 最後一個問題,這也是一個非常重要的問題:保護你的字元串!字元串在註冊模塊中非常重要!當一個富有經驗的Cracker破解你的軟體時,首先做的就是竊取你的字元串。 譬如他會輸入錯誤的註冊碼,得到你關於錯誤註冊碼的提示,通常是「無效的註冊碼,請重新輸入!」或者「Invalid key(please input again)」等等,然後用OllyDbg進行斷點調試或者用WinDASM、IDA Pro等靜態分析工具在被他脫殼後的程序中搜尋那個字元串,找到後進行分析。 因此,請一定有保護你的字元串! 使用時再臨時解密出來,而且要盡量少使用消息提示框,避免被Cracker找到漏洞。 有保護字元串不需要太複雜的算法,隨便找一個快速的對稱算法就可以了。 最後提醒大家一句,不要在有保護上花太多的功夫!你應該把更多的時間和精力都用來完善你的軟體,這樣會更合算。 借用一位前輩的話來忠告大家吧:花點時間考慮你自己的軟體,看看它是否值得保護?如果沒人用你的軟體,保護也就沒有意義了,不要過高估計你的軟體「對世界的重要性」! ========================= 文章類型:轉載 提交:沙加II |
送花文章: 3,
|
2004-04-02, 11:41 AM | #4 (permalink) |
長老會員
|
哇,好深啊,還是,晚點吧…>_<!!
|
__________________ 貴在中和,不爭之爭 2011-中華民國建國百年跨年慶典(精研完整版) 臺灣 我們的母親 臺灣 我們居住的家園 臺灣 我們心目中永遠的第一 相聚在這塊土地上,珍惜這裡的一切 |
|
送花文章: 13208,
|