Zunächst einmal muss ich etwas loswerden: COM-Objekte und ihre GUID/CLSID/IDDs sind BLÖD! Seid Stunden sitze ich an einem kleinen Problem, welches sich HRESULT REGDB_E_CLASSNOTREG bzw E_NOINTERFACE nennt. Laut Google müssen CLSID und IID identisch sein, aber hier…:
CLSID_CLRRuntimeHost = 90F1A06E-7712-4762-86B5-7A5EBA6BDB02
IID_CLRRuntimeHost = 90F1A06C-7712-4762-86B5-7A5EBA6BDB02
Suche und finde den Fehler. Jap, ein Zeichen unterschied der GUIDs und alles für den A…..
So, nach diesem kleinen Ausraster direkt zur Einleitung. Es geht um CLRHosting durch Managed FASM, wie bereits in einem Post vor ziemlich genau einem Jahr erklärt. Dabei ist es möglich von .NET ASM-Code in eine native Assembly zu injecten, welche wiederrum eine CLR-Runtime läd um dort .NET Assemblys zu laden und auszuführen. Wozu braucht man das? Zum Beispiel um auf native Bootstrap DLLs verzichten zu können oder böse Malware in nativen Programmen zu verstecken.
In dem erwähnten Post wurde die CLRRuntime 2.X über die Funktion CorBindToRuntimeEx geladen, dies ist allerdings nicht zu höheren Versionen des .NET Frameworks kompatibel. Nun wurde eine andere Lösung gesucht, da viele Libraries inzwischen auf .NET 4 portiert sind.
Die hier vorgestellte Methode ist etwas komplizierter, dafür funktioniert sie für .NET v4.0.30319 und ist abwärtskompatibel. Bei dem früheren CLRHosting reichte es, eine statische Funktion aufzurufen um ein Interface-Handle zu bekommen. Von diesem Interface-Handle reichte es, wiederum eine Funktion aufzurufen, um die CLRRuntime zu starten.
Weiterlesen
7 people like this post.