C# dll代碼混淆加密的實(shí)現(xiàn)
一、需求
C# 項(xiàng)目生成 dll,在反編譯工具下,好比皇帝的新裝,dll 內(nèi)部的代碼看的一清二楚,在這里推薦一個(gè)工具ConfuserEx,可以給C#代碼混淆,甚至 exe 文件都可以加密,軟件是免費(fèi)開(kāi)源的,但是,目前已經(jīng)停止維護(hù),并且不支持最新的 .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.符號(hào)重命名(支持 WPF/BAML)
3.防止調(diào)試器/分析器
4.防止內(nèi)存轉(zhuǎn)儲(chǔ)
5.防止篡改(方法加密)
6.控制流混淆
7.常量/資源加密
8.引用隱藏代理
9.禁用反編譯器
10.嵌入依賴(lài)
11.壓縮輸出
12.可擴(kuò)展的插件 API
二、用法
1.新建C#項(xiàng)目
新建一個(gè)基于 .NET Framework 的類(lèi)庫(kù)項(xiàng)目,就用默認(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"); } } }
添加完代碼后,點(diǎn)擊生成,我們用工具 dnSpy 打開(kāi)這個(gè) dll 看看
代碼一覽無(wú)余 ,下面我們就開(kāi)始加密這個(gè) dll
2.開(kāi)始加密
打開(kāi) ConfuserEx,將 dll 拖入界面,并設(shè)置導(dǎo)出路徑,路徑我這里選擇的是桌面,和需要加密的dll放在一起。
3.常見(jiàn)的錯(cuò)誤
我試過(guò)導(dǎo)出路徑用 D 盤(pán),但結(jié)果發(fā)現(xiàn)報(bào)錯(cuò)。
導(dǎo)出的時(shí)候,路徑就容易報(bào)這種錯(cuò)誤,不知道是什么原因。
另外,如果使用 .NET6 類(lèi)庫(kù),在導(dǎo)出的時(shí)候也會(huì)報(bào)下面的錯(cuò)誤:
4.添加加密規(guī)則
在完成第二節(jié)的操作后(拖入DLL,選擇導(dǎo)出路徑),接下來(lái)點(diǎn)擊 Settings 選項(xiàng)卡,按下面步驟操作:
開(kāi)始添加加密規(guī)則
我這里連點(diǎn)五下,然后按 1-5 的順序選擇加密規(guī)則,選擇完成后,點(diǎn)擊 Done。
這里并不推薦使用過(guò)多的加密規(guī)則,越高混淆越強(qiáng),但性能越低,兼容性也越差。
5.導(dǎo)出加密dll
選擇 Protect 選項(xiàng),點(diǎn)擊 Protect 按鈕
如果出現(xiàn)了圖中的綠字,說(shuō)明加密成功了,找到對(duì)應(yīng)的位置
用 dnSpy 打開(kāi)這個(gè)加密的 DLL,可以看到,代碼已經(jīng)混淆了
6.調(diào)用加密dll
新建一個(gè) .NET Framework 的控制臺(tái)項(xiàng)目,將加密的 dll,放入項(xiàng)目的 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(); //獲取類(lèi)名 Type type = types.Where(arg => arg.Name.Equals("Class1")).FirstOrDefault(); //獲取方法名 MethodInfo methodInfo = type.GetMethod("Test"); //方法無(wú)參數(shù)的話 methodInfo.Invoke(null, null); //如果方法有參數(shù)的話,下面的 value 是返回值,沒(méi)用返回值則返回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(); } } }
運(yùn)行:
到此這篇關(guān)于C# dll代碼混淆加密的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# dll代碼混淆加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C#與SQL Server數(shù)據(jù)庫(kù)進(jìn)行交互的詳細(xì)步驟
在C#中與數(shù)據(jù)庫(kù)進(jìn)行交互,通常使用ADO.NET(ActiveX Data Objects .NET)框架,ADO.NET是.NET Framework中用于數(shù)據(jù)訪問(wèn)的一組類(lèi)庫(kù),它提供了多種用于連接和操作數(shù)據(jù)庫(kù)的方法,以下是使用C#與SQL Server數(shù)據(jù)庫(kù)進(jìn)行交互的詳細(xì)步驟,需要的朋友可以參考下2024-08-08在類(lèi)庫(kù)或winform項(xiàng)目中打開(kāi)另一個(gè)winform項(xiàng)目窗體的方法
這篇文章主要介紹了在類(lèi)庫(kù)或winform項(xiàng)目中打開(kāi)另一個(gè)winform項(xiàng)目窗體的方法,可以實(shí)現(xiàn)Winform項(xiàng)目間窗體的調(diào)用,在進(jìn)行Winform項(xiàng)目開(kāi)發(fā)中非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換
這篇文章主要介紹了Winform中實(shí)現(xiàn)圖片格式轉(zhuǎn)換的示例代碼,幫助大家更好的理解和使用winform開(kāi)發(fā),感興趣的朋友可以了解下2020-12-12