威势网络,为您的企业和团队注入互联网活力!
服务热线:138-9741-0341

【原创】 .NETCORE MVC代码加密

发布日期:2022/11/21 作者: 浏览:851

    查询了相关资料,有大佬们已经解决了动态编译的问题,也就是把代码在运行的时候动态编译进程序集再调用执行,根据这个原理,我写了一个小小的demo,首先将一段待保护的代码进行RSA加密,代码如下:


using Microsoft.AspNetCore.Mvc;

namespace WINS.Controllers
{
    public class CrackController : Controller
    {
        public string Index()
        {
            return "Crack me , if you can !";
        }
        public string Time()
        {
            return System.DateTime.Now.ToString();
        }
    }
}


    加密后为了测试方便,我直接将加密内容写在了appsettings.json文件中,如下图所示:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "WebConfig": {
    "PriKey": "MIIEvQIBADANBgkqh......nIhttu1h9Zk=",
    "Signatrue": "RoJMV/ff7UggrXAkyXuQv5EOd4BaWaCwgMGONeplUbSXfaHDD/c1wH9y69XmL7U3bBUeWaA196I0Bb+DPvi5/dKo8m2FtRqrK1iI7nzWAMbYGRNJE8JPuknjZjbwoxBOsH9L9+g5vWynCnPeOZU7F8Y8S0IMv/FApKZEV2KwYB4=",
    "Code": "RkEYCyLAyIknwH......F2g9BQ=="
  }
}


  其中PriKey是解密用的私角,Code是被加密的代码,在EXE启动以后先计算加密代码的签名是否和EXE内保存的匹配,因为EXE内保存的签名和加密的数据是一对一的关系,每个EXE和每个加密的CODE都是独一无二的,如果匹配,用私钥对代码进行解密,然后动态编译执行,如果不匹配,直接退出或是解密失败。当然,这里演示的加密保护手段并不是十分严谨,这不是本文讨论的重点内容。


  整个项目目录结果如下图所示

    Compiler.cs类负责将代码动态编译,DynamicActionProvider.cs,DynamicChangeTokenProvider.cs 分别提供MVC映射的支持和变更通知,ICompiler是动态编译的接口,我们只看到一个Home控制器,现在我们将动态编译一个Crack控制器。

    

        [HttpGet("/")]
        public IActionResult Index([FromServices] DynamicActionProvider actionProvider, [FromServices] DynamicChangeTokenProvider tokenProvider)
        {
            try
            {
                //从appsetting.json加载私钥,加密的源码,签名
                string PriKey = WebConfig.PriKey;
                string SourceCode = WebConfig.Code;
                string Signatrue = WebConfig.Signatrue;
                //解密成明文源代码
                RSAService rSAService = new RSAService();
                string Code = rSAService.Decrypt(PriKey, rSAService.Base64Encode(SourceCode), true);
                var cc = Convert.FromBase64String(Code);
                Code = Encoding.Unicode.GetString(cc);
                //动态注入运行
                actionProvider.AddControllers(Code);
                tokenProvider.NotifyChanges();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return View();
        }


  我们将提前加密好的代码载入进来,然后解密成明文,再通过 actionProvider.AddControllers(Code) 动态编译进程序集,程序集是在内存中的,以动态链接库的形式存在。然后 tokenProvider.NotifyChanges 发出更新通知,这样我们就可以在浏览器中访问了。为了说明这一切我截个图给大家



  我们的代码被成功的解密出来后,动态编译进内存了。然后我们去浏览器访问一下试试,https://localhost:7245/crack/Time 成功返回当前时间,访问该地址 https://localhost:7245/crack ,屏幕显示提示:

Crack me , if you can !

看来我们的代码已经正常运行,没有问题了。当然今天的加密算法都是很容易被破解的,下节课我们来升级一下难度。 OK,下面是本文的源码,


此处内容仅对会员开放,非会员用户打赏后才可以查看





下拉加载更多评论
最新评论
暂无!