Native C++中调用C++/C#/VB托管程序集(用C++保护.NET程序)


#include <windows.h>
#include <tchar.h>
#include <MSCoree.h>
#include <Metahost.h>
#pragma comment(lib, "mscoree.lib")

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow)
{ 
  ICLRMetaHost *pMetaHost = nullptr; 
  ICLRMetaHostPolicy *pMetaHostPolicy = nullptr; 
  ICLRRuntimeHost *pRuntimeHost = nullptr; 
  ICLRRuntimeInfo *pRuntimeInfo = nullptr; 

  HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 
  hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo)); 

  if(FAILED(hr)) { 
    MessageBox(0,L"启动出错",L"Error",MB_OK|MB_ICONERROR);    
    goto cleanup; 
  } 

  hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pRuntimeHost)); 
  hr = pRuntimeHost->Start(); 

  DWORD dwRet = 0; 
  hr = pRuntimeHost->ExecuteInDefaultAppDomain(L"EXE或DLL全路径", //不会产生新的进程
    L"类的全名", 
    L"函数名",   
    L"参数", 
    &dwRet); 
  hr = pRuntimeHost->Stop(); 

cleanup:   
  if(pRuntimeInfo != nullptr) { 
    pRuntimeInfo->Release(); 
    pRuntimeInfo = nullptr; 
  } 

  if(pRuntimeHost != nullptr) { 
    pRuntimeHost->Release(); 
    pRuntimeHost = nullptr; 
  } 

  if(pMetaHost != nullptr) { 
    pMetaHost->Release(); 
    pMetaHost = nullptr; 
  } 
  return TRUE;
}

 

被调用的程序集必须具备以下签名:

static int pwzMethodName (String pwzArgument)

参考地址:http://technet.microsoft.com/zh-cn/subscriptions/ms164411(v=vs.80)

通过此方法可以在一定程度上阻止它人对.NET程序破解的难度(某些菜鸟看到此程序不是.NET的就会死心)。

但是通过PEID可以看出我们调用了.NET的某个核心的DLL中的函数(CLRCreateInstance):


我们要把它从导入表中去除。可以通过LoadLibrary动态加载并调用它里面的导出函数,这样就不会在EXE的导入表中看到这个函数了。
然后再把被调用的

真正程序集隐藏某个地方(如'在运行时把程序还原成文件并存储到某个目录下,并且锁定目录阻止其它程序读写。用完再删除')。这样就更好了!


 1 //定义函数指针类型
 2 typedef HRESULT (WINAPI *MyCLRCreateInstance)(REFCLSID clsid, REFIID riid, LPVOID *ppInterface);
 3 
 4 //将此行改为以下三行内容:CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 
 5 HMODULE clrmd=LoadLibrary(L"mscoree.dll");
 6 MyCLRCreateInstance func=(MyCLRCreateInstance)(GetProcAddress(clrmd,"CLRCreateInstance"));
 7 HRESULT hr = func(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 
 8 
 9 //略...
10 
11 //最后FreeLibrary
12 FreeLibrary(clrmd);
原文地址:https://www.cnblogs.com/Lexy/p/2978300.html