.NET 程式編譯為 MSIL(Microsoft Intermediate Language)中間語言,極易被反編譯工具(如 Reflector、ILSpy)還原為高可讀性的原始碼。為了保護智慧財產權,防止破解與逆向工程,業界通用的策略是「強簽名 + 混淆 + 加密」三層防禦體系。
強簽名賦予組件全域唯一的身份(名稱、版本、公開金鑰Token),防止被竄改或冒用。即使檔案名稱相同,強簽名不同也視為不同組件。注意:未簽名的主程式可引用已簽名或未簽名組件;但已簽名的主程式不能引用未簽名組件(可透過設定略過驗證解決)。
操作步驟:在專案屬性的「簽署」頁籤勾選「為組件簽署」,選擇或建立強名稱金鑰檔(.snk)。詳細教學請參考:強簽名詳細指南。
混淆對編譯後的 MSIL 進行模糊處理,最基本的是「命名混淆」——將命名空間、類別、方法、欄位等識別符替換為無意義字元(如 a、b、c 或特殊符號),不改變程式邏卻讓人難以閱讀。進階混淆還包括控制流混淆、字串加密、水印嵌入等。
本文採用 Dotfuscator Community Edition(Visual Studio 內建)示範:
混淆後用 Reflector 對比原始碼,可見類別/方法名已變為亂碼,邏輯結構仍保留。
混淆僅增加閱讀難度,而加密則將 MSIL 本體加密,運行時由解殼器動態解密執行。本文使用 MaxtoCode:
三步驟結合可有效抵禦大多數自動化反編譯與初級破解嘗試。但需認清:不存在絕對無法破解的客戶端程式碼。若極度敏感邏輯,應移至伺服器端執行。此外,混淆與加密可能影響效能、除錯困難、甚至引發相容性問題,上線前務必充分測試。