Dotnet是一種建立在虛擬機上執行的語言,它直接生成 MSIL 的中間語言,再由DotNet編譯器 JIT 解釋映象為本機代碼並交付CPU執行。它和Java是一種機制的語言。這種語言的優點就是您不需要去考慮您的程序在那裡運行,您只需要把功能做出來,虛擬機會在任何地方實現您的功能。這是一個很好的趨勢和想法,但虛擬機的中間語言由於帶了大量的“元數據metadada”信息,所以也極容易被反編譯。
Dotnet的保護分為三大類
由ms 提供的非第三方保護方案
a) 強名稱
強名稱是MS提供的保護機制。
它需要使用 sn 這個命令。
強名稱是什麼意思呢?在這裡稍作解釋。強名稱的作用就是防止程序集被非法修改,當對程序集修改後,必須重新用您的私鑰再對程序集加一次強名稱,這也是如果含有強名稱的程序集在混淆或加密後必須要重新加強名稱的原因。
Sn / ? 可以看到它的使用方法,如果你安裝的 Framework是中文的,那麼參數的解釋也是中文的,我就不多講了。
那麼強名稱有用嗎?網上輕松破解強名稱的方法很多,Ildasm反編譯加過強名稱的程序集後,在IL文件中將強名稱的相關信息去掉,再利用Ilasm編譯,就可以解除強名稱的限制了。強名稱的PublcKey不管是加在程序集中,還是加在Class中,都可以被去掉,所以強名稱不是一個完善的保護方式。
使用StrongNameIdentityPermissionAttribute類
這個類允許你將組件(或類、方法)與某一強名稱(通常就是你發布程序時所用的強名稱)綁定,這樣,只有在客戶端程序具有該強名稱簽名的情況下才能使用你的組件。也就是說,除了你自己編寫的客戶端代碼因為擁有同樣的簽名而被允許使用組件以外,任何第三方代碼都無法通過StrongNameIdentityPermissionAttribute的防護,因此也就無法惡意調用你的組件了。
為了簡便起見,先創建一個很簡單的Class Library項目,代碼如下:
// SecureComp.dll
using System;
namespace musicland
{
public class SecureComp
{
public string Confidential()
{
return "This is confidential!";
}
}