zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    页面布局方案-上固定,下自适应
    页面布局方案-左右固定,中间自适应
    身心疲惫
    生产计划拆分说明-班组绩效匹配算法
    CSS代码片段
    常见内部函数----Python
    pyramid的第一个项目
    2015年大连国际马拉松半程经历
    高效时间管理
    《番茄工作法图解》第四章读书笔记
  • 原文地址:https://www.cnblogs.com/Lexy/p/2978300.html
Copyright © 2011-2022 走看看