c# 中加密混淆 dll 并通过反射的方式调用

基于 .net Framework 4.7.2

假设我们有一个输出类型为类库的项目,项目的命名空间为 SomeSecurityDll,该命名空间下有如下一个类

namespace SomeSecurityDll
{
    public static class ImportantClass
    {
        private static string password = "123@abc";

        public static string DoSomething()
        {
            return password + "@xyz";
        }

    }
}

如果不采用加密混淆的方法,我们点击生成,那么会生成文件 SomeSecurityDll.dll,我们新建一个控制台应用,命名空间为 Confuser_Demo,添加该 dll 引用,然后使用如下方法调用

namespace Confuser_Demo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string str = ImportantClass.DoSomething();
            Console.WriteLine(str);//123@abc@xyz
            Console.ReadKey();
        }
    }
}

但是我们会发现 ImportantClass 中的 password 和 DoSomething 都是明文可见的,这显然是不行的,使用 dnspy 打开该 dll ,结果如下,可以发现我们的 dll 的实现细节都能看到

c# 中加密混淆 dll 并通过反射的方式调用_第1张图片

为了避免我们的 dll 实现细节暴露,可以采用 ConfuserEx 进行混淆和加密

c# 中加密混淆 dll 并通过反射的方式调用_第2张图片
c# 中加密混淆 dll 并通过反射的方式调用_第3张图片
c# 中加密混淆 dll 并通过反射的方式调用_第4张图片

然后去我们的输出目录找到该混淆加密后的 dll,同样使用 dnspy 打开查看

c# 中加密混淆 dll 并通过反射的方式调用_第5张图片

可以发现咱们的方法和细节全部隐藏了,通过这种混淆和加密的方式,visual studio 项目是没法去添加引用的,因此得使用 Assembly 去做反射调用,把加密后的 dll 复制到 Confuser_Demo 的应用路径,然后修改 main 方法

static void Main(string[] args)
{
    string dllPath = "SomeSecurityDll.dll";
    Assembly dll = Assembly.LoadFrom(dllPath);
    Type[] types = dll.GetTypes();
    Type type = types.Where(arg => arg.Name.Equals("ImportantClass")).FirstOrDefault();//类名
    MethodInfo methodInfo = type.GetMethod("DoSomething");//方法名
    object value = methodInfo.Invoke(null, null);// 方法无参数的话
    // 如果方法有参数的话
    //object value = methodInfo.Invoke(null, new object[]{param1,param2});
    Console.WriteLine(value);
    Console.ReadKey();
}

你可能感兴趣的:(C#,c#,visual,studio,开发语言,安全)