采用Native 引导方式的.Net加密保护

简介: 这类加密保护方式属于整体程序集的加密保护. 这个方法首要解决的问题就是 native code 和 .Net Code如何交互. 这里介绍三种实现方式. 1. C++/CLI 实现. 这个比较简单了,会C++/CLI一下子就能完成了.

这类加密保护方式属于整体程序集的加密保护.
这个方法首要解决的问题就是 native code 和 .Net Code如何交互.
这里介绍三种实现方式.

1. C++/CLI 实现.
这个比较简单了,会C++/CLI一下子就能完成了.
Loader是由C++/CLI实现的.运行时通过解码程序集通过反射载入然后运行.
void InvokeAssemblyResource()
{
 
 try
 {
  byte[] pBuf = GetDecryptedResource();  
  Assembly^ asm = Assembly::Load(pBuf);
  asm->EntryPoint->Invoke(nullptr,nullptr);
 }
 catch(Exception^ ex)
 {
  MessageBox::Show(ex->Message);
 }


}

2. 利用C#导出Com接口和native code交互.
Loader由C#和native code两部分组成.
C#部分代码
public interface IInvokeAssembly
{
 void LoadAndExecute(byte[] pBuf);
};

public class CInvokeAssembly : IInvokeAssembly
{
 public CInvokeAssembly()
 {
 }
 public void LoadAndExecute(byte[] pBuf)
 {
  try
  {
   Assembly asm = Assembly.Load(pBuf);
   asm.EntryPoint.Invoke(null,null);
  }
  catch(Exception ex)
  {
   MessageBox.Show(ex.Message);
  }
 }
}

这里导出的 IInvokeAssembly 接口,将在native code中使用.
native code 部分
void InvokeAssemblyResource()
{
 IInvokeAssemblyPtr pInvoker; //COM Pointer to the .Net Interface

 if(FAILED(pInvoker.CreateInstance(CLSID_CInvokeAssembly)))
 {
  MessageBox(NULL,_T("Unable to Create Invoke Assembly Object !!"),_T("Error"),MB_OK|MB_ICONERROR);
  return;
 }

 HRSRC hRC = FindResource(NULL,MAKEINTRESOURCE(IDR_EMBEDDED_ASSEMBLY),"RT_EMBEDDED_ASSEMBLY");
 HGLOBAL hRes = LoadResource(NULL,hRC);
 DWORD dwSize = SizeofResource(NULL,hRC);

 SAFEARRAY* pSA = NULL;

 if(NULL !=(pSA = SafeArrayCreateVector(VT_UI1, 0, dwSize)))
 {
  LPVOID pBuf = NULL;

  if(FAILED(SafeArrayAccessData(pSA,&pBuf)))
   MessageBox(NULL,_T("Unable to Access SafeArray Data"), _T("Error"),MB_OK|MB_ICONERROR);
  else
  {
   LPVOID hAsm = LockResource(hRes);

   memcpy(pBuf, hAsm, dwSize);
   
   UnlockResource(hRes);
   
   SafeArrayUnaccessData(pSA);
  }

  pInvoker->LoadAndExecute(pSA); //Invoke the Reflection to load and Execute our Byte[]
 }
 else
  MessageBox(NULL,_T("Unable to Allocate Memory"),_T("Memory Allocate Error"),MB_OK|MB_ICONERROR);

 if(pSA) SafeArrayDestroy(pSA);
}


这里还有一个问题,loader是两部分.加密的程序集可以作为资源签入到native code loader中.但是C#部分怎么处理?
一个比较隐蔽的方式是,在安装程序时将它安装到gac中.

3 是利用 CLR-Hosting 接口. 可以参考msdn中 本地接口部分的文档.
bool InvokeAssemblyResource()
{  
 CComPtr<ICorRuntimeHost> spRuntimeHost;
 CComPtr<_AppDomain> spAppDomain;
 CComPtr<IUnknown> spUnk;

 bool bSuccess = false;

 if(FAILED(CorBindToRuntimeEx( NULL, // Latest Version by Default
    L"wks",  // Workstation build
    STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN,
    CLSID_CorRuntimeHost ,
    IID_ICorRuntimeHost ,
    (void**)&spRuntimeHost)))
 {
  gErrMsg = _T("Unable to Bind CLR");
  return false;
 }
 if(FAILED(spRuntimeHost->Start()))
 {
  gErrMsg = _T("Unable to Start CLR");
  return false;
 }
 do
 {
  if(FAILED(spRuntimeHost->GetDefaultDomain(&spUnk)))
  {
   gErrMsg = _T("Unable to GetDefaultDomain");
   break;
  }
  if(FAILED(spUnk->QueryInterface(&spAppDomain.p)))
  {
   gErrMsg = _T("Unable to Query AppDomain Interface");
   break;
  }

  SAFEARRAY* pSA = GetDecryptedResource();
  if(pSA)
  {
   try
   {    // Invoke the Entry Point with No Arguments
    spAppDomain->Load_3(pSA)->EntryPoint->Invoke_3(_variant_t(), NULL); 
    bSuccess = true; // Everything Went Fine !!
   }
   catch(_com_error ex)
   {
    gErrMsg = ex.ErrorMessage();
   }

   SafeArrayDestroy(pSA);
   pSA = NULL; 
  }
 }while(false);

 if(FAILED(spRuntimeHost->Stop()))
 {
  gErrMsg = _T("Unable to Stop CLR");
  return false;
 }

 return bSuccess;
}

一般这类加密工具都会选择第三种实现方式.如 .Net Reactor.

不过单纯的整体加密保护安装性是很低的,可以配合一些其它的方式来提高保护强度,如 .Net Reactor的 NecroBit.
因为在Load时很容易被dump出程序集.这种方式就是让Load时载入的程序集不是完整的(除去了IL代码部分,NecroBit).
然后在Load完成后,程序集执行之前,还原IL代码.

目录
相关文章
|
1月前
|
Java C# 数据安全/隐私保护
|
2月前
|
C# 数据安全/隐私保护
一款实用的.NET Core加密解密工具类库
一款实用的.NET Core加密解密工具类库
|
8月前
|
算法 网络安全 C#
一个基于.Net开发齐全的加密库
一个基于.Net开发齐全的加密库
50 0
|
开发框架 .NET 网络安全
虚拟主机ASP.NET 使用SSL加密465端口发邮件demo
虚拟主机ASP.NET 使用SSL加密465端口发邮件demo
|
开发框架 .NET 数据安全/隐私保护
视频点播HLS 标准加密实现 .net解密服务器搭建说明
解密服务器搭建成功了,但是访问之后出现解密失败或者无法访问加密的m3u8,可以从如下几点确认可能的原因。
视频点播HLS 标准加密实现 .net解密服务器搭建说明
|
.NET 数据库连接 数据库
ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作。当有人想要获取你程序中的数据库信息,他首先看到的可能会是Web.Config文件。
1231 0
|
Web App开发 算法 .NET
asp.net 加密类
MD5相关类: System.Security.Cryptography.MD5System.Security.Cryptography.MD5CryptoServiceProvider()System.
992 0
|
2天前
|
安全 网络安全 量子技术
数字堡垒之下:网络安全漏洞、加密技术与安全意识的三重奏
【7月更文挑战第18天】本文旨在揭示网络安全领域的关键要素——安全漏洞、加密技术和用户安全意识,并分析它们如何共同作用以维护我们的数字世界。文章将探讨最新的安全漏洞案例,介绍加密技术的最新进展,以及强调培养安全意识的重要性。通过深入浅出的分析,读者将获得必要的知识,以更好地理解和应对日益复杂的网络安全挑战。
|
1天前
|
存储 监控 安全
网络安全的守护者:漏洞、加密与意识
【7月更文挑战第19天】本文深入探讨了网络安全领域的核心要素,包括网络漏洞的识别与防御、先进的加密技术,以及培养必要的安全意识。文章不仅提供了关于网络攻击手段和防御策略的实用信息,还讨论了如何通过教育提高个人和组织的安全素养。通过分析最新的网络安全趋势和案例研究,本文为读者提供了一套全面的网络安全知识框架。
|
2天前
|
SQL 安全 算法
网络防线的构筑者:漏洞、加密与意识
【7月更文挑战第18天】在数字化浪潮中,网络安全与信息安全成为维护信息资产的重要屏障。本文将深入探讨网络安全漏洞的类型与应对策略,解析当前加密技术的作用与局限,并强调提升个人与企业的安全意识对于构建坚固网络防线的重要性。
10 4