Внедрение управляемого 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;
}

1 ответ

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

Другие вопросы по тегам