【问题标题】:C++ Loading a DLL into the default AppDomainC++ 将 DLL 加载到默认的 AppDomain
【发布时间】: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


【解决方案1】:

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

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


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

【讨论】:

  • 我需要在程序中其他所有内容所在的 AppDomain 中运行我的托管代码(它只有一个 AppDomain,检查一下)。万一您没有意识到,上面的代码是我已成功注入到所述程序中的非托管 Win32 DLL(DLL_ATTACH 上的消息框证明了这一点)。
  • Voigt 我无法实现您在编辑中提到的内容。你能指点我一些有用的文档吗?我找不到任何...
  • 干杯!感谢您的参考和建议,我已经成功地完成了这一切!如果可以的话,我会请你喝一杯。 ;)
  • Liam Dawson,在您最后的评论中,您提到您已经设法让它发挥作用。您能否在问题本身中添加您是如何解决的,以便对我和其他人有所帮助?
猜你喜欢
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多