由於.NET程式為了跨平台,導入CLR(Common Language Run-time),讓所有.NET程式編成MSIL(Microsoft Intermediate Language)程式碼,使其在CLR上運作(簡單來說,就是MS版的JVM)。也正因如此,其編譯出來的程式碼,都有一定的規則可以做逆向工程,進行反組譯。
知名的反組譯工具有:.NET Reflector(要錢), ILSpy (筆者測試過,若程式碼不加以防護的話,用這套很容易把程式碼完全還原回來…) 以及Telerik的JustDecompiler
但是,在販賣軟體產品的開發人員,應該不想要讓自己的程式碼被輕易地破解吧?
就目前讀到的參考資料,可將防止反組譯方法分為以下:
1. 混淆保護(Obfuscating) :將程式碼變數命名或是方法做混淆,或是加入無意義的文字,使其無法輕易破解。
此類工具較為知名的有微軟合作夥伴PreEmptive推出的Dotfuscastor (Community版本內建於Visual Studio,這個版本不用錢;但是Professional版要錢,此二版本功能差異請見此文章)
若想要使用此工具進行軟體保護的話,可見以下兩篇教學:
(1) Dotfucscator 使用者入門
(2) Obfuscation with Dotfuscator with Visual Studio 2010
2. Kernel等級的加密保護:使其無法用MSIL去讀取。代表工具:MaxToCode
3. 硬體鎖:採用硬體鎖的方式,避免程式盜用。(貌似跟反組譯無關)
參考資料
1. .NET反組譯工具:ILSpy, Telerik JustDecompile
2. 使用SuppressIldasmAttribute防止MSIL反組譯工具對組件進行反組譯
3. [.NET Concept][Security].NET程式保護機制概述 (Recommended)
4. MaxToCode