2017-02-11 4 views
2

私はC++コードの中に.NETアプリケーションのバイト配列を持っています。 これらのバイトをディスクに書き込まずにこの.NETアプリケーションを実行します。 ICLRRuntimeHost::ExecuteInDefaultAppDomainはアセンブリへのパスを期待しているため、ここでは式の外です。私は可能な方法(またはハック)を直接clrにバイナリを渡すことを探しています。実行中の.NETアプリケーションC++から

私は何ができますか?

+0

@ user4581301。 – 0x3h

+2

ネイティブC++で '_AppDomain'インタフェースを使うことができます。これにより、Load(byte [])メソッドを呼び出すことができます。 ICorRuntimeHost :: GetDefaultDomain()を使用します。 –

+0

@HansPassantは素晴らしいアイデアのようです。私はそれを試してみましょう。 – 0x3h

答えて

0
//todo error checks/cleanup 
HRESULT hr; 
ICLRMetaHost *pMetaHost = NULL; 
ICLRRuntimeInfo *pRuntimeInfo = NULL; 
ICorRuntimeHost *pCorRuntimeHost = NULL; 
IUnknownPtr spAppDomainThunk = NULL; 
_AppDomainPtr spDefaultAppDomain = NULL; 
bstr_t bstrAssemblyName(L""); 
_AssemblyPtr spAssembly = NULL; 
bstr_t bstrClassName(L""); 
_TypePtr spType = NULL; 
variant_t vtEmpty; 
bstr_t bstrStaticMethodName(L"Main"); 
variant_t vtLengthRet; 
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost)); 
const wchar_t* pszVersion = L"v2.0.50727"; 
hr = pMetaHost->GetRuntime(pszVersion, IID_PPV_ARGS(&pRuntimeInfo)); 
BOOL fLoadable; 
hr = pRuntimeInfo->IsLoadable(&fLoadable); 
if (!fLoadable) { wprintf(L".NET runtime %s cannot be loaded\n", pszVersion); return; } 
hr = pRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_PPV_ARGS(&pCorRuntimeHost)); 
hr = pCorRuntimeHost->Start(); 
hr = pCorRuntimeHost->GetDefaultDomain(&spAppDomainThunk); 
hr = spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spDefaultAppDomain)); 
SAFEARRAYBOUND bounds[1]; 
bounds[0].cElements = array_len; 
bounds[0].lLbound = 0; 
SAFEARRAY* arr = SafeArrayCreate(VT_UI1, 1, bounds); 
SafeArrayLock(arr); 
memcpy(arr->pvData, bytearray, array_len); 
SafeArrayUnlock(arr); 
hr = spDefaultAppDomain->Load_3(arr, &spAssembly); 
hr = spAssembly->GetType_2(bstrClassName, &spType); 
hr = spType->InvokeMember_3(bstrStaticMethodName, static_cast<BindingFlags>(BindingFlags_InvokeMethod | BindingFlags_Static | BindingFlags_Public), NULL, vtEmpty, nullptr, &vtLengthRet); 
SafeArrayDestroy(arr); 

それは、元の.NETバイナリだとプログラムがメモリにロードされます瞬間は、それが簡単にダンプできることに注意してください、あなたはそれが難しくただ、これはリバースエンジニアリングのプロセスを作成することがより必要があります。

関連する問題