摘 要:介紹了.NET環(huán)境下的一種軟件保護(hù)方法——混淆:通過對(duì)MSIL代碼進(jìn)行字符串加密、名稱混淆、流程混淆等技術(shù),以加大反編譯的難度,從而達(dá)到對(duì).NET產(chǎn)品的保護(hù);列舉了目前常用的混淆工具,并分析了它們的優(yōu)劣。
關(guān)鍵詞:軟件保護(hù);.NET;MSIL;混淆;加密
0 引言
作為一種編程平臺(tái),Microsoft.NET比微軟公司先前推出的其他技術(shù)平臺(tái)更為復(fù)雜。.NET提供了對(duì)多種編程語(yǔ)言以及(在理論上說(shuō))多重平臺(tái)的支持,在傳統(tǒng)的兩個(gè)代碼層之間添加一個(gè)中間代碼層。這里,傳統(tǒng)的兩層分別是源代碼層和編譯后的本機(jī)代碼層。新加的代碼層給.NET平臺(tái)帶來(lái)了額外的靈活性,不過,反過來(lái)卻又增加了系統(tǒng)的復(fù)雜性。
在Microsoft.NET框架內(nèi),應(yīng)用程序可以用好多種高級(jí)程序語(yǔ)言編寫、創(chuàng)建,例如VB.NET、C#乃至COBOL.NET等等,都可以編寫.NET應(yīng)用程序。而通過每一種遵守.NET規(guī)范的編程語(yǔ)言所編寫的程序首先都得通過一種初始編譯步驟從源代碼變成.NET的公共標(biāo)準(zhǔn)語(yǔ)言:MSIL(Microsoft IntermediateLanguage,微軟中介語(yǔ)言),然后,在執(zhí)行時(shí)臨時(shí)由JIT解釋成機(jī)器代碼執(zhí)行(如圖1所示)。MSIL自身是一種完整的、和對(duì)象相關(guān)的語(yǔ)言,通過它才可能實(shí)現(xiàn)多種高級(jí)語(yǔ)言來(lái)編寫.NET應(yīng)用程序。但使用ILDASM可以很容易地反匯編成一個(gè)文本文件,這個(gè)文本文件比較容易看懂,還可以修改后使用ILASM重新編譯成EXE文件。這就給軟件保護(hù)提出了新的難題。

1 保護(hù)軟件與常用做法
對(duì)上述問題,在不同場(chǎng)合可以采取不同的解決方案:
(1)Web service或者remote方式調(diào)用將核心代碼和數(shù)據(jù)放到服務(wù)器上。
(2)Jeffrey Richter認(rèn)為:如果有非常重要的代碼,而且認(rèn)可Native Code有100%的安全,則可以考慮使用Native Code的DLL+Interop。
(3)在程序里加上簽名,即在Assembly里加上數(shù)字證書。這樣,當(dāng).NET應(yīng)用被加載時(shí),它的安全體系會(huì)檢查這個(gè)簽名的,這個(gè)簽名可以保證代碼不被改動(dòng)。改變過的代碼是不能執(zhí)行的,它保證了“這個(gè)程序一定是由某某公司開發(fā)的,且未被篡改”,但是無(wú)法保證這個(gè)程序是安全的,是否接受程序取決于對(duì)該公司的信任。這種方法仍然無(wú)法實(shí)現(xiàn)軟件保護(hù),可以將程序COPY到其它機(jī)器上運(yùn)行。
(4)使用混淆器,混淆是目前最流行的方式。混淆工具一般都有三個(gè)功能:字符串加密、名稱混淆、流程混淆等。目前流行的混淆軟件有:XenoCode、Dotfuscator、Remotesoft、ILDog,MaxtoCode里也集成了少許混淆功能。
(5)可以自行設(shè)計(jì)一個(gè)加密方法。
本文主要討論第4種方法,也就是混淆技術(shù)。關(guān)于.NET源代碼的安全性,關(guān)于如何保護(hù)您的知識(shí)產(chǎn)權(quán),關(guān)于市場(chǎng)上流動(dòng)的混淆工具以及最新的混淆加密工具,本文將集中展示一下,全新的保護(hù)手段,以便能讓同行們能使用.NET開發(fā)共享程序并保護(hù)自己的知識(shí)產(chǎn)權(quán)。
2 混淆的原理
混淆,顧名思義就是混雜,使界限不分明。這個(gè)詞相當(dāng)妙,特別是用在計(jì)算機(jī)界。我們知道.NET程序集中有一個(gè)重要的概念叫做MetaData(元數(shù)據(jù)),它記錄了相關(guān)程序集的一切信息,因此,NET程序集才有了跨平臺(tái)的可能,才可以在網(wǎng)上傳送運(yùn)行,才不會(huì)出現(xiàn)DLL HELL。但同時(shí),由于它記錄了所有的信息,程序集中的信息可以完全還原至初始狀態(tài),使得編譯過后的程序集,依然擁有良好的“可讀性”。在某些特殊的情況下,這是一件很糟的事情,針對(duì)這些情況,出現(xiàn)了混淆器,它對(duì)MetaData的某些相關(guān)信息進(jìn)行了處理,達(dá)到了混淆的作用。
(1)字符串加密
首先,最簡(jiǎn)單的混淆是字符串加密,也就是將程序集中所存在的字符串加密,防止字符串信息泄漏,使攻擊者無(wú)法讀懂程序中出現(xiàn)的字符串。這種方法在每一個(gè)混淆工具軟件中都會(huì)用到。
(2)名稱混淆
名稱混淆也就是將命名空間名、類名、方法名、字段名等統(tǒng)統(tǒng)換成特殊符號(hào)或其它無(wú)意義的符號(hào)(如圖2)。

由于.NET代碼經(jīng)過編譯后,名稱完全被保留。這樣,如果Cracker想破解這個(gè)程序,當(dāng)看到Register的時(shí)候,就差不多找到破解的入口了。但經(jīng)過名稱混淆后,它將變成毫無(wú)意義的名稱,增加了破解的難度。
然而,名稱混淆有一個(gè)非常致命的缺點(diǎn):當(dāng)修改了類名之后可能出現(xiàn)程序不能執(zhí)行的問題。一般來(lái)說(shuō),這種情況在DLL中發(fā)生得更多,但在EXE中也經(jīng)常發(fā)生。因?yàn)镈LL的某些Public方法是對(duì)外的接口,在程序開發(fā)和調(diào)試的時(shí)候使用的原名稱,當(dāng)混淆以后,改成了別的名稱,所以對(duì)它的調(diào)用(特別是通過反射調(diào)用)肯定報(bào)錯(cuò)。處理辦法:不混淆對(duì)外提供的Public方法。EXE和DLL還有一個(gè)共同的容易出錯(cuò)的地方就是資源,混淆器也可以混淆資源名稱,這樣,就存在同樣的問題——“無(wú)法找到資源而報(bào)錯(cuò)(動(dòng)態(tài)Load資源的時(shí)候)”:處理方法:不混淆程序內(nèi)部調(diào)用的東西。
另外,如果名稱混淆時(shí),使用短名稱及不可見字符(如ILDog),將會(huì)縮小程序集的大小,但如果使用長(zhǎng)名稱(如XenoCode),可能會(huì)增加程序集大小。
(3)流程混淆
流程混淆是較大強(qiáng)度的混淆,能較好地保護(hù)代碼不被反編譯。其基本原理是:給程序中增加某些形式的跳轉(zhuǎn),以破壞原有可讀的流程但不改變執(zhí)行流程(如圖3)。

3 常見.NET產(chǎn)品保護(hù)工具
目前代碼保護(hù)工具主要有以下幾種,下面介紹它們的性質(zhì)及特點(diǎn):
(1)Dotfuscator Community。性質(zhì):混淆。
這是微軟推薦的一種混淆工具,可以集成到NET開發(fā)環(huán)境中。Dotfuscator利用標(biāo)識(shí)符重命名,流程修改,字符串加密等技術(shù)混淆MSIL,極大地增加了其被反匯編的難度,而對(duì)功能沒有絲毫的影響。同時(shí),Dotfuscator對(duì)代碼進(jìn)行全局掃描,移除不必要的關(guān)系數(shù)據(jù),還對(duì)代碼進(jìn)行優(yōu)化壓縮,移除所有多余的方法,變量,和函數(shù),可以將執(zhí)行程序的大小最大壓縮至原來(lái)的30%,極大地提高了程序運(yùn)行效益。Doffuscator可以和Visual Studio完全整合。大眾版已經(jīng)是Visual Studio的一個(gè)標(biāo)準(zhǔn)部件。
(2)Remotesoft Dotfuscator。性質(zhì):混淆。
(3)XenoCode,可能是目前最常用的混淆工具。性質(zhì):混淆。
(4)MaxtoCode。性質(zhì):加密、混淆。
這是世界第一款利用Windows底層技術(shù)保護(hù).NET源代碼的高技術(shù)產(chǎn)品。它可以完美地與.NET程序結(jié)合在一起,全力保護(hù)源代碼和知識(shí)產(chǎn)權(quán)。MaxtoCode已經(jīng)完全超越了傳統(tǒng)的混淆手段,它加密后的代碼,完全無(wú)法被反編譯(由于篇幅有限,不在本文中討論)。是目前保護(hù)強(qiáng)度最大,最完美的.NET產(chǎn)品保護(hù)方案。2.0以上的版本已經(jīng)加上混淆功能,并將混淆功能與加密功能疊加使用,以增加保護(hù)的強(qiáng)度。
4 結(jié)束語(yǔ)
從目前市場(chǎng)情況來(lái)看,雖然.NET2003已經(jīng)推出近五年,了,但市面上用.NET開發(fā)的軟件產(chǎn)品并不多見。究其原因,筆者認(rèn)為.NET產(chǎn)品保護(hù)較困難,對(duì)開發(fā)者的開發(fā)積極性可能起到了一定的負(fù)面影響。只有很好地解決了.NET產(chǎn)品的保護(hù)問題,才能充分地調(diào)動(dòng)開發(fā)者的積極性。