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);
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/Lexy/p/2978300.html
Copyright © 2011-2022 走看看