利用我对C++不存在的知识(嘿,至少我知道指针是什么:p),我设法将一些代码示例组合在一起,创建了一个将DLL文件注入另一个程序的解决方案。
不幸的是,我正在INJECTING的DLL工作不正常:它成功地显示了消息框(所以我知道DLL正在运行),但它实际上并没有创建指定类型的实例(来自托管DLL,它有一个类型为Injectee的静态构造函数,用于写入文件)。那么,有人能帮我解决哪里出了问题吗?(注意:托管DLL是相同的.Net版本,并安装到GAC。还有一个副本与我注入的应用程序位于同一文件夹中)
这是非托管注入对象(应该加载托管DLL):
#include "stdafx.h"
#include "Injectee.h"
#include "stdafx.h"
#include <stdio.h>
#include "objbase.h"
#include "MSCorEE.h"
#import "C:WindowsMicrosoft.NETFrameworkv2.0.50727mscorlib.tlb" raw_interfaces_only
using namespace mscorlib;
void Bootstrap() {
CoInitializeEx(0, COINIT_MULTITHREADED );
ICorRuntimeHost* pICorRuntimeHost = 0;
HRESULT st = CoCreateInstance(CLSID_CorRuntimeHost, 0, CLSCTX_ALL,
IID_ICorRuntimeHost, (void**)&pICorRuntimeHost);
if(!pICorRuntimeHost) {
MessageBox(NULL, TEXT("Failed at stage 1."), TEXT("Error"), MB_OK);
}
HDOMAINENUM hEnum = NULL;
pICorRuntimeHost->EnumDomains(&hEnum);
if(!hEnum) {
MessageBox(NULL, TEXT("Failed at stage 2."), TEXT("Error"), MB_OK);
}
IUnknown* pUunk = 0;
st = pICorRuntimeHost->NextDomain(hEnum, &pUunk);
if(!pUunk) {
MessageBox(NULL, TEXT("Failed at stage 3."), TEXT("Error"), MB_OK);
}
_AppDomain * pCurDomain = NULL;
st = pUunk->QueryInterface(__uuidof(_AppDomain), (VOID**)&pCurDomain);
if(!pCurDomain) {
MessageBox(NULL, TEXT("Failed at stage 4."), TEXT("Error"), MB_OK);
}
_bstr_t assemblyName = "ZAI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9db2aaea0fceabbb";
_bstr_t typeName = "Injectee";
_ObjectHandle* pObjectHandle = 0;
MessageBox(NULL, TEXT("Loading DLL."), TEXT("Error"), MB_OK);
pCurDomain->CreateInstance(assemblyName, typeName, &pObjectHandle);
}
有什么帮助吗?
(注意,托管程序集是针对这两种体系结构构建的(目标应用程序是x64),具有基本命名空间ZAI)
欢迎提出任何建议。
(如果你想知道,我正在尝试将API添加到免费软件、封闭源代码的.Net应用程序中)
我认为创建一个新的CorRuntimeHost
实例会创建一个全新的AppDomain。
我建议编写一个混合模式的C++/CLI DLL并注入它。
如果您已经确认您确实获得了对正确AppDomain的引用,请在CreateInstance
之前调用AppDomain::Load
。甚至是AppDomain::ExecuteAssembly
,如果您将程序集的入口点设置为执行有用的操作。