翻譯|使用教程|編輯:郎婷|2023-04-21 15:22:36.367|閱讀 160 次
概述:VMProtect是新一代軟件保護實用程序。本文分享保護應(yīng)用程序的三大關(guān)鍵要素,歡迎查閱~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
VMProtect是新一代軟件保護實用程序。VMProtect支持德爾菲、Borland C Builder、Visual C/C++、Visual Basic(本機)、Virtual Pascal和XCode編譯器。
同時,VMProtect有一個內(nèi)置的反匯編程序,可以與Windows和Mac OS X可執(zhí)行文件一起使用,并且還可以鏈接編譯器創(chuàng)建的MAP文件,以快速選擇要保護的代碼片段。
為了輕松實現(xiàn)應(yīng)用程序保護任務(wù)的自動化,VMProtect實現(xiàn)了內(nèi)置腳本語言。VMProtect完全支持Windows系列的32/64位操作系統(tǒng)(從Windows 2000開始)和Mac OSX(從版本10.6開始)。重要的是,無論目標(biāo)平臺如何,VMProtect都支持所有范圍的可執(zhí)行文件,即Windows版本可以處理Mac OS X版本的文件,反之亦然。
VMProtect 是保護應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護機制并且沒有可能破壞整個保護的典型錯誤的情況下才能最有效地使用,讓我們一起來看看為您的程序開發(fā)提供良好保護的三大關(guān)鍵要素。
許多開發(fā)人員在設(shè)計自己的應(yīng)用程序注冊過程時犯的一個典型錯誤是將整個注冊密鑰檢查封裝到一個單獨的函數(shù)中,該函數(shù)還返回一個易于理解的值:
function CheckRegistration(const RegNumber: String): Boolean; begin if RegNumber='123' then Result:=True else Result:=False; end; procedure TForm1.Button1Click(Sender: TObject); begin ... if not CheckRegistration(RegNumber) then exit; Application.CreateForm(TForm2, Form2); Form2.ShowModal; ... end;
使用這種方法,入侵者甚至不需要了解密鑰檢查算法。他可以簡單地修改檢查程序開頭的代碼,使其始終返回正確的注冊密鑰值:
function CheckRegistration(const RegNumber: String): Boolean; begin Result:=True; exit; ... end;
一種更有效的密鑰校驗方法是將正確性校驗嵌入到程序的主要運行邏輯中,使注冊密鑰校驗算法與調(diào)用過程算法密不可分。我們還建議將操作邏輯與注冊碼檢查程序“混合”起來,以便在繞過檢查時使程序失敗。對于上面的示例,這可以按如下方式完成:
function CheckRegistration(const RegNumber: String): Boolean; begin if RegNumber='123' then begin Application.CreateForm(TForm2, Form2); Result:=True end else Result:=False; end; procedure TForm1.Button1Click(Sender: TObject); begin ... Form2:=nil; if not CheckRegistration(RegNumber) then exit; Form2.ShowModal; ... end;
如果 CheckRegistration 函數(shù)是這樣實現(xiàn)的,入侵者將不得不分析注冊碼檢查的所有細節(jié)的代碼,以便繞過它。如果此應(yīng)用程序受 VMProtect 保護,則建議對 CheckRegistration 函數(shù)和 TForm1.Button1Click 過程進行虛擬化。為了使黑客攻擊更加復(fù)雜,您可以打開“以結(jié)合代碼變異和后續(xù)虛擬化。
開發(fā)人員犯的另一個嚴(yán)重錯誤是注冊密鑰檢查的錯誤實施。通常將輸入的密鑰與正確的值進行簡單比較。破解者可以通過跟蹤字符串比較函數(shù)的參數(shù)輕松匹配密鑰的正確值:
var ValidRegNumber: String; ... function CheckRegistration(const RegNumber: String): Boolean; begin if RegNumber=ValidRegNumber then Result:=True else Result:=False; end;
為避免這種情況,我們建議比較密鑰的哈希值,而不是它們的實際值。哈希函數(shù)是不可逆的,所以破解者無法從哈希中檢索到真正的密鑰值,并且必須花費更多的時間來研究程序,因為現(xiàn)在需要分析更多的代碼片段,而不僅僅是注冊密鑰檢查程序:
var ValidRegNumber: String; ... function CheckRegistration(const RegNumber: String): Boolean; begin if RegNumber=ValidRegNumber then Result:=True else Result:=False; end;
當(dāng)使用 VMProtect 保護應(yīng)用程序時,應(yīng)處理 HashPJW 和 CheckRegistration 函數(shù)以使黑客的活動復(fù)雜化。
通常,即使是在注冊程序上花費大量時間的開發(fā)人員也不會適當(dāng)注意保護注冊程序的結(jié)果。下面的示例使用全局變量來存儲和控制調(diào)用序列號檢查過程之前應(yīng)用程序的注冊狀態(tài)。對于入侵者來說,找到一個全局變量是小菜一碟——他只是比較注冊前后的數(shù)據(jù)段。順便說一下,流行的 ArtMoney 程序使用相同的原理。
var IsRegistered: Boolean; ... procedure TForm1.Button1Click(Sender: TObject); begin ... if not IsRegistered then IsRegistered:=CheckRegistration(RegNumber); if not IsRegistered then exit; ... end;
為避免這種情況,我們建議將與程序注冊相關(guān)的所有檢查結(jié)果存儲在動態(tài)內(nèi)存中。在這種情況下,在注冊之前和之后掃描數(shù)據(jù)段以查找修改后的內(nèi)存塊變得毫無用處。這是一個非常簡單的示例,演示如何將結(jié)果存儲在動態(tài)分配的內(nèi)存中:
type PBoolean = ^Boolean; var IsRegistered: PBoolean; ... procedure TForm1.Button1Click(Sender: TObject); begin ... if not IsRegistered^ then IsRegistered^:=CheckRegistration(RegNumber); if not IsRegistered^ then exit; ... end; ... initialization New(IsRegistered);
這些是使用內(nèi)置保護機制的最簡單方法。注冊程序、注冊密鑰檢查和存儲結(jié)果的實際實現(xiàn)僅限于開發(fā)人員的創(chuàng)造力。無論如何,您應(yīng)該在開發(fā)自己的保護機制時了解這些潛在的錯誤以避免它們。
以上便是保護應(yīng)用程序的三大關(guān)鍵要素,如果您有任何疑問或者想獲取更多產(chǎn)品試用/授權(quán)/價格信息,請點擊VMProtect了解。
加密解密技術(shù)QQ群:766135708
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn