Внедрение управляемого DLL в нативный процесс

Я пытаюсь внедрить управляемый C # DLL в собственный исполняемый файл. Я вставляю следующий код в исполняемый файл для загрузки CLR.

Я знаю, что инъекция работает, потому что, когда я внедряю код в cmd.exe, он выводит правильно. я знаю это CLRCreateInstance, pMetaHost-> GetRuntime, pRuntimeInfo-> GetInterface все возвращают S_OK, но pClrRuntimeHost-> Start () возвращает E_FAIL.

Это происходит только тогда, когда я внедряю dll в удаленный процесс. Если я загружаю dll в свой собственный процесс и оттуда вызываю Main, все вызовы возвращают S_OK, и управляемый код работает нормально.

Обновить: Я пытался внедрить код в другие процессы, такие как notepad.exe и explorer.exe. Это хорошо работает в тех. Мне все еще любопытно, почему он не запускается в cmd.exe, но я использовал его только для целей тестирования, так что это больше не проблема.

GetLastError возвращает «Была сделана попытка сослаться на несуществующий токен»

#include "stdafx.h"#include "Bootstrap.h"#include <metahost.h>
#pragma comment(lib, "mscoree.lib")

using namespace std;

//Forward declarations
void StartTheDotNetRuntime();

DllExport HRESULT Main(_In_ LPCTSTR lpCommand)
{
cout << "Starting .NET runtime" << endl;
StartTheDotNetRuntime();
return 0;
}

void StartTheDotNetRuntime()
{
wprintf(L"Press enter to load the .net runtime...");

HRESULT hr;
ICLRMetaHost *pMetaHost = NULL;
ICLRRuntimeInfo *pRuntimeInfo = NULL;
ICLRRuntimeHost *pClrRuntimeHost = NULL;

// build runtime
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));
hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_PPV_ARGS(&pRuntimeInfo));
hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost,
IID_PPV_ARGS(&pClrRuntimeHost));

// start runtime
hr = pClrRuntimeHost->Start();
cout << "RESULT: " << hr << endl;

wprintf(L".Net runtime is loaded.");

// Okay, the CLR is up and running in this (previously native) process.
// Now call a method on our managed C# class library.
DWORD dwReturn = 0;
hr = pClrRuntimeHost->ExecuteInDefaultAppDomain(
L"F:\\Client.dll",
L"Client.Main", L"Start", L"MyParameter", &dwReturn);
cout << dwReturn << endl;
}

2

Решение

Я нашел ответ на проблему, по крайней мере для меня, процессу, в который вводится начальная загрузка, требуются права администратора. Мне потребовалось много времени, чтобы понять, так как все программы по умолчанию имеют права администратора, и как только я запустил процесс, в который я встраивался как администратор, это сработало!

0

Другие решения

Других решений пока нет …