• C# dll代码混淆加密


    目录

    一、需求

    二、用法

    1.新建C#项目

    2.开始加密

    3.常见的错误

    4.添加加密规则

    5.导出加密dll

    6.调用加密dll

    结束


    一、需求

    C# 项目生成 dll,在反编译工具下,好比皇帝的新装,dll 内部的代码看的一清二楚,在这里推荐一个工具ConfuserEx,可以给C#代码混淆,甚至 exe 文件都可以加密,软件是免费开源的,但是,目前已经停止维护,并且不支持最新的 .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.防止调试器/分析器
    4.防止内存转储
    5.防止篡改(方法加密)
    6.控制流混淆
    7.常量/资源加密
    8.引用隐藏代理
    9.禁用反编译器
    10.嵌入依赖
    11.压缩输出
    12.可扩展的插件 API

    二、用法

    1.新建C#项目

    新建一个基于 .NET Framework  的类库项目,就用默认添加的 class1 好了,代码如下

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace 加密程序集1
    7. {
    8. public class Class1
    9. {
    10. public static string User { get; set; } = "张三";
    11. public static string Password { get; set; } = "erwtyyhghdgh";
    12. public static void Test()
    13. {
    14. Console.WriteLine("f**k you");
    15. }
    16. }
    17. }

    添加完代码后,点击生成,我们用工具 dnSpy 打开这个 dll 看看

    代码一览无余 ,下面我们就开始加密这个 dll

    2.开始加密

    打开 ConfuserEx,将 dll 拖入界面,并设置导出路径,路径我这里选择的是桌面,和需要加密的dll放在一起。

    3.常见的错误

    将DLL拖进去后,使用默认的路径就好,我试过改路径,但导出的时候发现报错。

    错误:

    另外,如果使用 .NET6 类库,在导出的时候也会报下面的错误:

    4.添加加密规则

    在完成第二节的操作后(拖入DLL,选择导出路径),接下来点击 Settings 选项卡,按下面步骤操作:

    开始添加加密规则

    我这里连点五下,然后按 1-5 的顺序选择加密规则,选择完成后,点击 Done。

    这里并不推荐使用过多的加密规则,越高混淆越强,但性能越低,兼容性也越差。

    这里推荐使用 anti tamer 这一种就够了,方法和字段的默认值都有混淆。

    5.导出加密dll

    选择 Protect 选项,点击 Protect 按钮

    如果出现了图中的绿字,说明加密成功了,找到对应的位置

    用 dnSpy 打开这个加密的 DLL,可以看到,代码已经混淆了

    6.调用加密dll

    在加密 dll 后,可以直接在 VS 中添加引用,然后和正常的 dll 一样使用就好了,如果添加了过多的加密规则,不知道会不会报错,这个我没测试过。

    另一种,就是直接用反射调用了,如下:

    新建一个 .NET Framework 的控制台项目,将加密的 dll,放入项目的 Debug 目录下。

    代码:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Reflection;
    5. using System.Runtime.InteropServices;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. namespace 调用加密dll
    9. {
    10. internal class Program
    11. {
    12. static void Main(string[] args)
    13. {
    14. Assembly dll = Assembly.LoadFrom("加密程序集1.dll");
    15. Type[] types = dll.GetTypes();
    16. //获取类名
    17. Type type = types.Where(arg => arg.Name.Equals("Class1")).FirstOrDefault();
    18. //获取方法名
    19. MethodInfo methodInfo = type.GetMethod("Test");
    20. //方法无参数的话
    21. methodInfo.Invoke(null, null);
    22. //如果方法有参数的话,下面的 value 是返回值,没用返回值则返回null
    23. //object value = methodInfo.Invoke(null, new object[]{param1,param2});
    24. //获取指定的属性
    25. object value1 = type.GetProperty("User").GetValue(type);
    26. Console.WriteLine(value1);
    27. object value2 = type.GetProperty("Password").GetValue(type);
    28. Console.WriteLine(value2);
    29. Console.ReadKey();
    30. }
    31. }
    32. }

    运行:

    结束

    如果这个帖子对你有所帮助,欢迎 关注 、点赞 、留言

    end

  • 相关阅读:
    免费活动-11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场
    R语言使用epiDisplay包的pyramid函数可视化金字塔图、基于已有的汇总数据(表格数据)可视化金字塔图、使用main参数添加自定义标题信息
    Canal安装
    Elasticsearch
    微服务项目:尚融宝(51)(核心业务流程:充值服务(1))
    机器学习中的几种交叉验证方法(5种)
    学习Oracle数据库的新建表的基本操作(二)
    干掉Switch-Case、If-Else----订阅发布模式+事件驱动模式
    如何将PDF转换为Excel?一招解决办公难题
    李彦宏:程序员将不复存在! 周鸿祎回怼!网友:先把百度程序员都开除了!
  • 原文地址:https://blog.csdn.net/qq_38693757/article/details/128002084