一区在线电影,国产在线首页,中文字幕精,天天爽天天射,夜色99,日韩国产成人av,伊人久久综合视频

威勢(shì)網(wǎng)絡(luò),為您的企業(yè)和團(tuán)隊(duì)注入互聯(lián)網(wǎng)活力!
服務(wù)熱線:138-9741-0341

【原創(chuàng)】 .NETCORE MVC代碼加密

發(fā)布日期:2022/11/21 作者: 瀏覽:852

    查詢了相關(guān)資料,有大佬們已經(jīng)解決了動(dòng)態(tài)編譯的問(wèn)題,也就是把代碼在運(yùn)行的時(shí)候動(dòng)態(tài)編譯進(jìn)程序集再調(diào)用執(zhí)行,根據(jù)這個(gè)原理,我寫(xiě)了一個(gè)小小的demo,首先將一段待保護(hù)的代碼進(jìn)行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();
        }
    }
}


    加密后為了測(cè)試方便,我直接將加密內(nèi)容寫(xiě)在了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啟動(dòng)以后先計(jì)算加密代碼的簽名是否和EXE內(nèi)保存的匹配,因?yàn)镋XE內(nèi)保存的簽名和加密的數(shù)據(jù)是一對(duì)一的關(guān)系,每個(gè)EXE和每個(gè)加密的CODE都是獨(dú)一無(wú)二的,如果匹配,用私鑰對(duì)代碼進(jìn)行解密,然后動(dòng)態(tài)編譯執(zhí)行,如果不匹配,直接退出或是解密失敗。當(dāng)然,這里演示的加密保護(hù)手段并不是十分嚴(yán)謹(jǐn),這不是本文討論的重點(diǎn)內(nèi)容。


  整個(gè)項(xiàng)目目錄結(jié)果如下圖所示

    Compiler.cs類(lèi)負(fù)責(zé)將代碼動(dòng)態(tài)編譯,DynamicActionProvider.cs,DynamicChangeTokenProvider.cs 分別提供MVC映射的支持和變更通知,ICompiler是動(dòng)態(tài)編譯的接口,我們只看到一個(gè)Home控制器,現(xiàn)在我們將動(dòng)態(tài)編譯一個(gè)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);
                //動(dòng)態(tài)注入運(yùn)行
                actionProvider.AddControllers(Code);
                tokenProvider.NotifyChanges();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return View();
        }


  我們將提前加密好的代碼載入進(jìn)來(lái),然后解密成明文,再通過(guò) actionProvider.AddControllers(Code) 動(dòng)態(tài)編譯進(jìn)程序集,程序集是在內(nèi)存中的,以動(dòng)態(tài)鏈接庫(kù)的形式存在。然后 tokenProvider.NotifyChanges 發(fā)出更新通知,這樣我們就可以在瀏覽器中訪問(wèn)了。為了說(shuō)明這一切我截個(gè)圖給大家



  我們的代碼被成功的解密出來(lái)后,動(dòng)態(tài)編譯進(jìn)內(nèi)存了。然后我們?nèi)g覽器訪問(wèn)一下試試,https://localhost:7245/crack/Time 成功返回當(dāng)前時(shí)間,訪問(wèn)該地址 https://localhost:7245/crack ,屏幕顯示提示:

Crack me , if you can !

看來(lái)我們的代碼已經(jīng)正常運(yùn)行,沒(méi)有問(wèn)題了。當(dāng)然今天的加密算法都是很容易被破解的,下節(jié)課我們來(lái)升級(jí)一下難度。 OK,下面是本文的源碼,


此處內(nèi)容僅對(duì)會(huì)員開(kāi)放,非會(huì)員用戶打賞后才可以查看





下拉加載更多評(píng)論
最新評(píng)論
暫無(wú)!