採用Native引導方式的.Net加密保護
這類加密保護方式屬於整體程式集的加密保護.
這個方法首要解決的問題就是 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程式碼.
相關文章
- .net程式混淆、安全、保護、加密加密
- .Net保護中的nativecompile方式Compile
- 常見dotNet加密保護工具分析介紹加密
- 用Java的加密機制來保護你的資料Java加密
- 用Serverless Kubernetes為.NET (Core)應用保駕護航Server
- 採用斷路器設計模式來保護軟體設計模式
- 保護系統 用資料庫加密實現資料的安全資料庫加密
- 使用 Rootless Linux 容器保護您的 .NET 雲應用Linux
- 使用Wrap加密,保護Oracle程式原始碼加密Oracle原始碼
- Fortinet運用前沿IT思維,保護OT系統
- labview密碼保護方式及如何保護labview密碼不被破解View密碼
- js保護內部資料的三種方式JS
- ASP.NET Core中的資料保護ASP.NET
- 使用 stunnel 保護 telnet 連線
- mscorwks.dll在.Net中的地位以及在.Net程式碼保護方面的應用
- 企業檔案加密:資料保護的實戰策略加密
- 從QQ登入方式想到的QQ密碼保護密碼
- 微軟為Outlook.com等強化加密保護微軟加密
- 同態加密+區塊鏈,在大健康資料隱私保護中的應用加密區塊鏈
- Netty中的引導類BootstrapNettyboot
- 如何對採用移動互聯技術的等級保護物件進行定級?物件
- 中小企業商業機密加密保護的標準流程加密
- 資料夾加密小工具:保護你的隱私安全加密
- HarmonyOS:應用隱私保護
- 用ASP.NET Core 2.1 建立規範的 REST API -- 保護API和其它ASP.NETRESTAPI
- 新手引導動畫的4種實現方式動畫
- iOS 開發是否要採用 React Native?iOSReact Native
- 勒索軟體攻擊:如何透過加密保護您的資料加密
- 對一種加密保護的思想的一點分析..... (1千字)加密
- 適用於Android的加密教程:保護您的私人使用者資料免遭黑客攻擊Android加密黑客
- 聖天諾LDK加密鎖(加密狗)如何保護Linux系統下的軟體加密Linux
- Netty 框架學習 —— 引導Netty框架
- SpringBoot自定義classloader加密保護class檔案Spring Boot加密
- 保護郵件加密兩把鎖:PGP和S/MIME(轉)加密
- DG的保護模式模式
- 全同態加密的硬體加速:讓機器學習更懂隱私保護加密機器學習
- 使用Jwt為.Net Core SignalR保駕護航JWTSignalR
- java加密保護jar包及class檔案,防止反編譯Java加密JAR編譯