C#項目使用obfuscar混淆實踐
obfuscar 可以混淆C#代碼。
在項目中我們通過NuGet安裝obfuscar包。
安裝obfuscar
VS里點擊解決方案,然后搜索,點擊安裝。

設(shè)置混淆xml
然后需要編譯一個混淆設(shè)置文件obfuscar.xml,放在項目目錄中。
<?xml version='1.0'?> <Obfuscator> <!-- 輸入的工作路徑,采用如約定的 Windows 下的路徑表示法,如以下表示當前工作路徑 --> <!-- 推薦使用當前工作路徑,因為 DLL 的混淆過程,需要找到 DLL 的所有依賴。剛好當前工作路徑下,基本都能滿足條件 --> <Var name="InPath" value=".\bin\Release" /> <!-- 混淆之后的輸出路徑,如下面代碼,設(shè)置為當前工作路徑下的 Obfuscar 文件夾 --> <!-- 混淆完成之后的新 DLL 將會存放在此文件夾里 --> <Var name="OutPath" value=".\bin\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)容都是不可見的字符 --> <!-- 設(shè)置 UseUnicodeNames 為 true 可能在捕獲異常的時候出現(xiàn)問題,不建議開 --> <Var name="UseUnicodeNames" value="false" /> <!-- 設(shè)置 UseKoreanNames 為 true 使用韓文字 --> <Var name="UseKoreanNames" 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)\MyApp.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>
Module里配置要混淆的exe或者Dll。
編譯自動混淆
然后我們寫一個批處理,在編譯完成時候調(diào)用。 這里注意版本號和路徑
echo 批處理開始混淆和拷貝發(fā)布程序 cd E:\Github\MyAppConsole\MyApp\MyApp ..\packages\Obfuscar.2.2.49\tools\Obfuscar.Console.exe .\obfuscar.xml echo 混淆結(jié)束
我們在項目生成事件里調(diào)用這個bat文件。

這樣我們每次編譯release就可以自動混淆了。
注意事項
因為混淆會修改函數(shù)名字,所以要注意一些反射或者按照字符串反射函數(shù)或者變量的地方,這些地方要排除掉,還有使用Json讀取等反射,需要標記[Serializable]
[Serializable]
public class ShopInfo
{
public string id;
public string ver_url;
}
這樣就混淆成功了,我們可以使用dnSpy軟件來看我們混淆后的代碼。

基本上這樣就沒什么可閱讀性了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#實現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法
這篇文章主要介紹了C#實現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法,需要的朋友可以參考下2014-08-08
C#利用Spire.XLS for .NET將Excel轉(zhuǎn)換為HTML格式
在數(shù)字化浪潮中,數(shù)據(jù)是核心,而Excel作為最常用的數(shù)據(jù)管理工具之一,其生成的報表、統(tǒng)計數(shù)據(jù)等常常需要發(fā)布到Web平臺,供用戶在線瀏覽或集成進Web應(yīng)用,今天,我們將借助Spire.XLS庫,快速實現(xiàn)Excel到HTML的精準轉(zhuǎn)換,需要的朋友可以參考下2025-10-10
WPF利用RichTextBox實現(xiàn)富文本編輯器
在實際應(yīng)用中,富文本隨處可見,那么在WPF開發(fā)中,如何實現(xiàn)富文本編輯呢?本文以一個簡單的小例子,簡述如何通過RichTextBox實現(xiàn)富文本編輯功能,需要的可以參考下2024-02-02

