C ++将DLL加载到默认的AppDomain中

时间:2011-06-25 10:17:41

标签: .net winapi unmanaged managed code-injection

使用我不存在的C ++知识(嘿,至少我知道指针是什么:P),我设法将一些代码示例放在一起创建一个将DLL文件注入另一个程序的解决方案。

不幸的是,这是我注入的DLL无法正常工作:它成功显示了消息框(所以我知道DLL正在运行),但它实际上并没有创建指定类型的实例(来自托管DLL,在Injectee类型中有一个写入文件的静态构造函数。那么,任何人都可以帮助我解决我的错误吗? (N.B.托管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应用程序中)

1 个答案:

答案 0 :(得分:2)

我想创建一个新的CorRuntimeHost实例会创建一个新的AppDomain。

我建议编写一个混合模式的C ++ / CLI DLL并注入它。


如果您确认已获得对正确AppDomain的引用,请在AppDomain::Load之前致电CreateInstance。或者甚至是AppDomain::ExecuteAssembly,如果你设置程序集的入口点来做一些有用的事情。