博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Native C++中调用C++/C#/VB托管程序集(用C++保护.NET程序)
阅读量:5343 次
发布时间:2019-06-15

本文共 2346 字,大约阅读时间需要 7 分钟。

#include 
#include
#include
#include
#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)

参考地址:)

通过此方法可以在一定程度上阻止它人对.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 //最后FreeLibrary12 FreeLibrary(clrmd);

 

转载于:https://www.cnblogs.com/Lexy/archive/2013/03/24/2978300.html

你可能感兴趣的文章
Linux远程登录
查看>>
Linux自己安装redis扩展
查看>>
HDU 1016 Prime Ring Problem(dfs)
查看>>
C#中结构体与字节流互相转换
查看>>
session和xsrf
查看>>
跟随大神实现简单的Vue框架
查看>>
Linux目录结构
查看>>
LeetCode-Strobogrammatic Number
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
五一 DAY 4
查看>>
(转)接口测试用例设计(详细干货)
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
win8.1安装Python提示缺失api-ms-win-crt-runtime-l1-1-0.dll问题
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
Spring mvc初学
查看>>