3

マネージド 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;
}
4

1 に答える 1

0

少なくとも私にとっては、ブートストラップが挿入されるプロセスには管理者権限が必要です。すべてのプログラムにはデフォルトで管理者権限があり、管理者として挿入していたプロセスを開始すると、それが機能したことに気付くのに何年もかかりました!

于 2016-02-05T23:13:07.940 に答える