C#使用Obfuscar進行代碼混淆的實現(xiàn)
一、為什么要混淆
可以通過反編譯程序集,直接就能看到你的源代碼,這顯然很不利于企業(yè)進行知識產(chǎn)權(quán)保護。
二、有哪些混淆工具
Obfuscar、ConfuserEx、Dotfuscator、.NETReactor、Eazfuscator.NET、Xeoncode、Foxit等等,非常多。
三、Obfuscar的使用
我們介紹開源的Obfuscar。這是一個非常老牌的混淆工具,從 2014 年就對外分發(fā)。而且此工具也在不斷持續(xù)迭代更新,完全支持 dotnet 6 版本,對 WPF 和 WinForms 等等的支持也是非常好,支持多個不同混淆方式和等級的配置,支持混淆之后生成符號文件。此工具是由 Lex Li 主導(dǎo)開發(fā)的,在 GitHub 上使用 MIT 最友好協(xié)議開源。此工具的使用方式有多個不同的方式,我比較推薦直接放在visual studio 2022中使用,因為開發(fā)完順帶就混淆編譯,很省事
1、通過Nuget安裝Obfuscar。

2、在工程中新建Obfuscar.xml文件

內(nèi)容如下:
<?xml version='1.0'?>
<Obfuscator>
<!-- 輸入的工作路徑,采用如約定的 Windows 下的路徑表示法,如以下表示當(dāng)前工作路徑 -->
<!-- 推薦使用當(dāng)前工作路徑,因為 DLL 的混淆過程,需要找到 DLL 的所有依賴。剛好當(dāng)前工作路徑下,基本都能滿足條件 -->
<Var name="InPath" value=".\bin\Debug\net6.0" />
<!-- 混淆之后的輸出路徑,如下面代碼,設(shè)置為當(dāng)前工作路徑下的 Obfuscar 文件夾 -->
<!-- 混淆完成之后的新 DLL 將會存放在此文件夾里 -->
<Var name="OutPath" value=".\bin\Debug\net6.0\Obfuscar" />
<!-- 以下的都是細節(jié)的配置,配置如何進行混淆 -->
<!-- 使用 KeepPublicApi 配置是否保持公開的 API 不進行混淆簽名,如公開的類型公開的方法等等,就不進行混淆簽名了 -->
<!-- 語法的寫法就是 name 表示某個開關(guān),而 value 表示值 -->
<!-- 對于大部分的庫來說,設(shè)置公開的 API 不進行混淆是符合預(yù)期的 -->
<Var name="KeepPublicApi" value="true" />
<!-- 設(shè)置 HidePrivateApi 為 true 表示,對于私有的 API 進行隱藏,隱藏也就是混淆的意思 -->
<!-- 可以通過后續(xù)的配置,設(shè)置混淆的方式,例如使用 ABC 字符替換,或者使用不可見的 Unicode 代替 -->
<Var name="HidePrivateApi" value="true" />
<!-- 設(shè)置 HideStrings 為 true 可以設(shè)置是否將使用的字符串進行二次編碼 -->
<!-- 由于進行二次編碼,將會稍微傷一點點性能,二次編碼需要在運行的時候,調(diào)用 Encoding 進行轉(zhuǎn)換為字符串 -->
<Var name="HideStrings" value="true" />
<!-- 設(shè)置 UseUnicodeNames 為 true 表示使用不可見的 Unicode 字符代替原有的命名,通過此配置,可以讓反編譯看到的類和命名空間和成員等內(nèi)容都是不可見的字符 -->
<Var name="UseUnicodeNames" value="true" />
<!-- 是否復(fù)用命名,設(shè)置為 true 的時候,將會復(fù)用命名,如在不同的類型里面,對字段進行混淆,那么不同的類型的字段可以是重名的 -->
<!-- 設(shè)置為 false 的時候,全局將不會有重復(fù)的命名 -->
<Var name="ReuseNames" value="true" />
<!-- 配置是否需要重命名字段,默認配置了 HidePrivateApi 為 true 將都會打開重命名字段,因此這個配置的存在只是用來配置為 false 表示不要重命名字段 -->
<Var name="RenameFields" value="true" />
<!-- 是否需要重新生成調(diào)試信息,生成 PDB 符號文件 -->
<Var name="RegenerateDebugInfo" value="false" />
<Var name="OptimizeMethods" value="true"/>
<Var name="SuppressIldasm" value="false"/>
<!-- 需要進行混淆的程序集,可以傳入很多個,如傳入一排排 -->
<!-- <Module file="$(InPath)\Lib1.dll" /> -->
<!-- <Module file="$(InPath)\Lib2.dll" /> -->
<Module file="$(InPath)\UavDataServer.dll">
<!--SkipType跳過指定的類 Program是Main所在的類名-->
<!--<SkipType name="Program" />-->
<!--SkipMethod 跳過指定的方法-->
<!--<SkipMethod type="Program" name="Main"/>-->
</Module>
<Module file="$(InPath)\UavDataWorkerService.exe">
<!--SkipType跳過指定的類 Program是Main所在的類名-->
<!--<SkipType name="Program" />-->
<!--SkipMethod 跳過指定的方法-->
<!--<SkipMethod type="Program" name="Main"/>-->
</Module>
<!-- 程序集的引用加載路徑,對于 dotnet 6 應(yīng)用,特別是 WPF 或 WinForms 項目,是需要特別指定引用加載路徑的 -->
<!-- 這里有一個小的需要敲黑板的知識點,應(yīng)該讓 Microsoft.WindowsDesktop.App 放在 Microsoft.NETCore.App 之前 -->
<!-- 對于部分項目,如果沒有找到如下順序,將會在混淆過程中,將某些程序集解析為舊版本,從而失敗 -->
<!--<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.1\" />
<AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.1\" />-->
</Obfuscator>
其中,
- InPath是你要混淆的dll或exe所在的目錄,一般是你的生成目錄,要改成你自己的相對路徑。
- OutPath則是混淆完成后的新dll或exe所輸出到的目標目錄,自己改。
- Module標簽則需要設(shè)置要混淆哪些dll或exe,有多個就添加多個Module標簽。

3、生成混淆文件
- 設(shè)置生成事件指令
項目屬性中,添加生成后事件
"$(Obfuscar)" Obfuscar.xml


4、最后編譯運行即可,在我的輸出路徑下,能看到

5、對了,驗證下是否混淆效果
使用ILSpy打開混淆后的dll,發(fā)現(xiàn)方法名、參數(shù)、一些變量名都被混淆了:

到此這篇關(guān)于C#使用Obfuscar進行代碼混淆的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# Obfuscar代碼混淆內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析Silverlight調(diào)用WCF/Rest異常的解決方法
本篇文章對Silverlight調(diào)用WCF/Rest異常的解決方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05

