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