C ++ Загрузка DLL в домен приложений по умолчанию - PullRequest
0 голосов
/ 25 июня 2011

Используя мои несуществующие знания 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 с закрытым исходным кодом)

1 Ответ

2 голосов
/ 25 июня 2011

Я полагаю, что при создании нового экземпляра CorRuntimeHost создается новый домен приложений.

Я бы предложил написать DLL C ++ / CLI в смешанном режиме и внедрить ее.


ЕслиВы подтвердили, что получили ссылку на нужный домен приложения, позвоните по номеру AppDomain::Load до CreateInstance.Или даже AppDomain::ExecuteAssembly, если вы установите точку входа в свою сборку, чтобы сделать что-то полезное.

...