C# dll代碼混淆加密的實現(xiàn)
一、需求
C# 項目生成 dll,在反編譯工具下,好比皇帝的新裝,dll 內(nèi)部的代碼看的一清二楚,在這里推薦一個工具ConfuserEx,可以給C#代碼混淆,甚至 exe 文件都可以加密,軟件是免費開源的,但是,目前已經(jīng)停止維護,并且不支持最新的 .Net6。
下載地址:
GitHub - yck1509/ConfuserEx: An open-source, free protector for .NET applications
特征:
1.支持.NET Framework 2.0/3.0/3.5/4.0/4.5
2.符號重命名(支持 WPF/BAML)
3.防止調(diào)試器/分析器
4.防止內(nèi)存轉(zhuǎn)儲
5.防止篡改(方法加密)
6.控制流混淆
7.常量/資源加密
8.引用隱藏代理
9.禁用反編譯器
10.嵌入依賴
11.壓縮輸出
12.可擴展的插件 API
二、用法
1.新建C#項目
新建一個基于 .NET Framework 的類庫項目,就用默認(rèn)添加的 class1 好了,代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 加密程序集1 { public class Class1 { public static string User { get; set; } = "張三"; public static string Password { get; set; } = "erwtyyhghdgh"; public static void Test() { Console.WriteLine("f**k you"); } } }
添加完代碼后,點擊生成,我們用工具 dnSpy 打開這個 dll 看看
代碼一覽無余 ,下面我們就開始加密這個 dll
2.開始加密
打開 ConfuserEx,將 dll 拖入界面,并設(shè)置導(dǎo)出路徑,路徑我這里選擇的是桌面,和需要加密的dll放在一起。
3.常見的錯誤
我試過導(dǎo)出路徑用 D 盤,但結(jié)果發(fā)現(xiàn)報錯。
導(dǎo)出的時候,路徑就容易報這種錯誤,不知道是什么原因。
另外,如果使用 .NET6 類庫,在導(dǎo)出的時候也會報下面的錯誤:
4.添加加密規(guī)則
在完成第二節(jié)的操作后(拖入DLL,選擇導(dǎo)出路徑),接下來點擊 Settings 選項卡,按下面步驟操作:
開始添加加密規(guī)則
我這里連點五下,然后按 1-5 的順序選擇加密規(guī)則,選擇完成后,點擊 Done。
這里并不推薦使用過多的加密規(guī)則,越高混淆越強,但性能越低,兼容性也越差。
5.導(dǎo)出加密dll
選擇 Protect 選項,點擊 Protect 按鈕
如果出現(xiàn)了圖中的綠字,說明加密成功了,找到對應(yīng)的位置
用 dnSpy 打開這個加密的 DLL,可以看到,代碼已經(jīng)混淆了
6.調(diào)用加密dll
新建一個 .NET Framework 的控制臺項目,將加密的 dll,放入項目的 Debug 目錄下。
代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace 調(diào)用加密dll { internal class Program { static void Main(string[] args) { Assembly dll = Assembly.LoadFrom("加密程序集1.dll"); Type[] types = dll.GetTypes(); //獲取類名 Type type = types.Where(arg => arg.Name.Equals("Class1")).FirstOrDefault(); //獲取方法名 MethodInfo methodInfo = type.GetMethod("Test"); //方法無參數(shù)的話 methodInfo.Invoke(null, null); //如果方法有參數(shù)的話,下面的 value 是返回值,沒用返回值則返回null //object value = methodInfo.Invoke(null, new object[]{param1,param2}); //獲取指定的屬性 object value1 = type.GetProperty("User").GetValue(type); Console.WriteLine(value1); object value2 = type.GetProperty("Password").GetValue(type); Console.WriteLine(value2); Console.ReadKey(); } } }
運行:
到此這篇關(guān)于C# dll代碼混淆加密的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# dll代碼混淆加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C#與SQL Server數(shù)據(jù)庫進行交互的詳細步驟
在C#中與數(shù)據(jù)庫進行交互,通常使用ADO.NET(ActiveX Data Objects .NET)框架,ADO.NET是.NET Framework中用于數(shù)據(jù)訪問的一組類庫,它提供了多種用于連接和操作數(shù)據(jù)庫的方法,以下是使用C#與SQL Server數(shù)據(jù)庫進行交互的詳細步驟,需要的朋友可以參考下2024-08-08在類庫或winform項目中打開另一個winform項目窗體的方法
這篇文章主要介紹了在類庫或winform項目中打開另一個winform項目窗體的方法,可以實現(xiàn)Winform項目間窗體的調(diào)用,在進行Winform項目開發(fā)中非常具有實用價值,需要的朋友可以參考下2014-11-11