C#項(xiàng)目使用obfuscar混淆實(shí)踐
obfuscar 可以混淆C#代碼。
在項(xiàng)目中我們通過(guò)NuGet安裝obfuscar包。
安裝obfuscar
VS里點(diǎn)擊解決方案,然后搜索,點(diǎn)擊安裝。

設(shè)置混淆xml
然后需要編譯一個(gè)混淆設(shè)置文件obfuscar.xml,放在項(xiàng)目目錄中。
<?xml version='1.0'?> <Obfuscator> <!-- 輸入的工作路徑,采用如約定的 Windows 下的路徑表示法,如以下表示當(dāng)前工作路徑 --> <!-- 推薦使用當(dāng)前工作路徑,因?yàn)?DLL 的混淆過(guò)程,需要找到 DLL 的所有依賴。剛好當(dāng)前工作路徑下,基本都能滿足條件 --> <Var name="InPath" value=".\bin\Release" /> <!-- 混淆之后的輸出路徑,如下面代碼,設(shè)置為當(dāng)前工作路徑下的 Obfuscar 文件夾 --> <!-- 混淆完成之后的新 DLL 將會(huì)存放在此文件夾里 --> <Var name="OutPath" value=".\bin\Obfuscar" /> <!-- 以下的都是細(xì)節(jié)的配置,配置如何進(jìn)行混淆 --> <!-- 使用 KeepPublicApi 配置是否保持公開(kāi)的 API 不進(jìn)行混淆簽名,如公開(kāi)的類型公開(kāi)的方法等等,就不進(jìn)行混淆簽名了 --> <!-- 語(yǔ)法的寫(xiě)法就是 name 表示某個(gè)開(kāi)關(guān),而 value 表示值 --> <!-- 對(duì)于大部分的庫(kù)來(lái)說(shuō),設(shè)置公開(kāi)的 API 不進(jìn)行混淆是符合預(yù)期的 --> <Var name="KeepPublicApi" value="true" /> <!-- 設(shè)置 HidePrivateApi 為 true 表示,對(duì)于私有的 API 進(jìn)行隱藏,隱藏也就是混淆的意思 --> <!-- 可以通過(guò)后續(xù)的配置,設(shè)置混淆的方式,例如使用 ABC 字符替換,或者使用不可見(jiàn)的 Unicode 代替 --> <Var name="HidePrivateApi" value="true" /> <!-- 設(shè)置 HideStrings 為 true 可以設(shè)置是否將使用的字符串進(jìn)行二次編碼 --> <!-- 由于進(jìn)行二次編碼,將會(huì)稍微傷一點(diǎn)點(diǎn)性能,二次編碼需要在運(yùn)行的時(shí)候,調(diào)用 Encoding 進(jìn)行轉(zhuǎn)換為字符串 --> <Var name="HideStrings" value="true" /> <!-- 設(shè)置 UseUnicodeNames 為 true 表示使用不可見(jiàn)的 Unicode 字符代替原有的命名,通過(guò)此配置,可以讓反編譯看到的類和命名空間和成員等內(nèi)容都是不可見(jiàn)的字符 --> <!-- 設(shè)置 UseUnicodeNames 為 true 可能在捕獲異常的時(shí)候出現(xiàn)問(wèn)題,不建議開(kāi) --> <Var name="UseUnicodeNames" value="false" /> <!-- 設(shè)置 UseKoreanNames 為 true 使用韓文字 --> <Var name="UseKoreanNames" value="true" /> <!-- 是否復(fù)用命名,設(shè)置為 true 的時(shí)候,將會(huì)復(fù)用命名,如在不同的類型里面,對(duì)字段進(jìn)行混淆,那么不同的類型的字段可以是重名的 --> <!-- 設(shè)置為 false 的時(shí)候,全局將不會(huì)有重復(fù)的命名 --> <Var name="ReuseNames" value="true" /> <!-- 配置是否需要重命名字段,默認(rèn)配置了 HidePrivateApi 為 true 將都會(huì)打開(kāi)重命名字段,因此這個(gè)配置的存在只是用來(lái)配置為 false 表示不要重命名字段 --> <Var name="RenameFields" value="true" /> <!-- 是否需要重新生成調(diào)試信息,生成 PDB 符號(hào)文件 --> <Var name="RegenerateDebugInfo" value="false" /> <Var name="OptimizeMethods" value="true"/> <Var name="SuppressIldasm" value="false"/> <!-- 需要進(jìn)行混淆的程序集,可以傳入很多個(gè),如傳入一排排 --> <!-- <Module file="$(InPath)\Lib1.dll" /> --> <!-- <Module file="$(InPath)\Lib2.dll" /> --> <Module file="$(InPath)\MyApp.exe"> <!--SkipType跳過(guò)指定的類 Program是Main所在的類名--> <!--<SkipType name="Program" />--> <!--SkipMethod 跳過(guò)指定的方法--> <!--<SkipMethod type="Program" name="Main"/>--> </Module> <!-- 程序集的引用加載路徑,對(duì)于 dotnet 6 應(yīng)用,特別是 WPF 或 WinForms 項(xiàng)目,是需要特別指定引用加載路徑的 --> <!-- 這里有一個(gè)小的需要敲黑板的知識(shí)點(diǎn),應(yīng)該讓 Microsoft.WindowsDesktop.App 放在 Microsoft.NETCore.App 之前 --> <!-- 對(duì)于部分項(xiàng)目,如果沒(méi)有找到如下順序,將會(huì)在混淆過(guò)程中,將某些程序集解析為舊版本,從而失敗 --> <!--<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。
編譯自動(dòng)混淆
然后我們寫(xiě)一個(gè)批處理,在編譯完成時(shí)候調(diào)用。 這里注意版本號(hào)和路徑
echo 批處理開(kāi)始混淆和拷貝發(fā)布程序 cd E:\Github\MyAppConsole\MyApp\MyApp ..\packages\Obfuscar.2.2.49\tools\Obfuscar.Console.exe .\obfuscar.xml echo 混淆結(jié)束
我們?cè)陧?xiàng)目生成事件里調(diào)用這個(gè)bat文件。

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

基本上這樣就沒(méi)什么可閱讀性了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法
這篇文章主要介紹了C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法,需要的朋友可以參考下2014-08-08
C#、ASP.NET通用擴(kuò)展工具類之TypeParse
這篇文章主要介紹了C#、ASP.NET通用擴(kuò)展工具類之TypeParse,使用了此類,類型轉(zhuǎn)換方便多了,本文直接給出實(shí)現(xiàn)代碼和使用方法,需要的朋友可以參考下2015-06-06
C#利用Spire.XLS for .NET將Excel轉(zhuǎn)換為HTML格式
在數(shù)字化浪潮中,數(shù)據(jù)是核心,而Excel作為最常用的數(shù)據(jù)管理工具之一,其生成的報(bào)表、統(tǒng)計(jì)數(shù)據(jù)等常常需要發(fā)布到Web平臺(tái),供用戶在線瀏覽或集成進(jìn)Web應(yīng)用,今天,我們將借助Spire.XLS庫(kù),快速實(shí)現(xiàn)Excel到HTML的精準(zhǔn)轉(zhuǎn)換,需要的朋友可以參考下2025-10-10
Unity游戲開(kāi)發(fā)之射擊小游戲的實(shí)現(xiàn)
本篇文章為大家?guī)?lái)一個(gè)橫版2D射擊小游戲,游戲制作超級(jí)簡(jiǎn)單,玩法一學(xué)就會(huì)。文中的示例代碼講解詳細(xì),快跟隨小編一起動(dòng)手試一試2022-03-03
WPF利用RichTextBox實(shí)現(xiàn)富文本編輯器
在實(shí)際應(yīng)用中,富文本隨處可見(jiàn),那么在WPF開(kāi)發(fā)中,如何實(shí)現(xiàn)富文本編輯呢?本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述如何通過(guò)RichTextBox實(shí)現(xiàn)富文本編輯功能,需要的可以參考下2024-02-02

