【发布时间】:2011-06-25 10:17:41
【问题描述】:
使用我不存在的 C++ 知识(嘿,至少我知道指针是什么 :P ),我设法将一些代码示例组合在一起,创建了一个将 DLL 文件注入另一个程序的解决方案。
不幸的是,我正在注入的 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:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.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 应用程序)
【问题讨论】:
-
不可能在同一进程中加载 CLR 两次,至少在版本 2 中是不可能的。由于您没有收到错误,至少部分问题应该是您实际上没有注入 DLL。
标签: .net winapi unmanaged managed code-injection