目前程式碼保護的方法主要有五種:
• 強名稱簽名
• 程式碼混淆
• 程式碼隱藏
• 程式碼加密
• 程式碼本地化
• 添加浮水印
強名稱簽名
• 原理:這種方法,用通俗的話說就是對檔按照Microsoft的演算法對檔進行Hash,然後將hash出來的數據(publickeytoken )寫入檔。在執行或者對檔進行呼叫的時候,SDK會檢查publickeytoken ,若不符合則投擲異常,結束。
• 弱點:反編譯後將publickeytoken 部份去掉即可。
程式碼混淆
• 表面混淆(layout)
把類或者變量的名字修改成晦澀的長名字、特別簡單的單個字母或者不可顯示的字元來實作
• 控制混淆(control)
<行號> br.s <行號+2>
<行號+1> break
<行號+2> …………
• 數據混淆(data)
對於字串進行加密,在執行的時候再進行解密還原,從而增加破解的難度
比如,JS程式碼,就非常適用混淆的方式進行保護,國內知名的JS混淆產品:JShaman,在這方面做的很不錯。
程式碼隱藏
.NET的程式集包括程式碼檔和資原始檔兩部份,此方案就是將程式碼檔的核心部份作為資原始檔隱藏。執行時核心程式集不會在硬碟上留下任何痕跡,它只在記憶體中解密並被載入
弱點:記憶體有完整的程式碼,利用軟件可以將記憶體dump出來,得到完整的程式碼
程式碼加密
• 原理:改變MSIL和JIT的通訊,根據底層的需要來解密程式碼
• 優點:破解的難度大,較安全,記憶體無完整程式碼
• 缺點:編程的難度大,若利用專門的加密軟件,則會加大系統的開發成本
程式碼本地化 及添加浮水印
• 程式碼本地化
將程式碼完全編譯成本機程式碼,同win32下的應用程式一樣,完全失去了.NET的優越性。
• 添加浮水印
簡單的說,就是讓特定的字串以圖片的形式,繪制在程式的界面上,用來提示軟件是否註冊,這種保護方法,關鍵的地方就是對圖片繪制條件的判斷,如果僅僅是用true 或者false 來判斷,就形同虛設了。