将托管dll注入本机进程

时间:2013-11-16 20:19:59

标签: c# c++ code-injection managed createremotethread

我正在尝试将托管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 个答案:

答案 0 :(得分:0)

我找到了问题的答案,至少对我来说,注入引导程序的过程需要具有管理员权限。我花了很长时间才意识到,因为默认情况下我所有的程序都有管理员权限,一旦我开始这个过程,我就会以管理员身份注入它的工作!