Dieses Projekt implementiert eine .NET Assembly-Injection-Bibliothek (sie ist vom Snoopwpf-Projekt inspiriert). Der Remote-Prozess kann verwaltet oder nicht verwaltet sein.
Wenn Sie eine Assembly in einen Remote-Prozess einfügen möchten, müssen Sie die folgenden Aspekte berücksichtigen:
Wenn die oben genannten Voraussetzungen erfüllt sind, können Sie eine Assembly einfügen und eine Aktivierungsmethode aufrufen. Es gibt drei Möglichkeiten, die Aktivierungsmethode aufzurufen:
Diese Bibliothek wird von Shed auch verwendet, um eine DLL in einen Remote-Prozess einzuschleusen. Ein Video können Sie hier sehen.
Praktische Beispiele finden Sie im TestRunner-Projekt.
Wenn die eingefügte Assembly Abhängigkeiten von nicht standardmäßigen .NET-Assemblys aufweist, können Sie diese Abhängigkeiten mit der AddDependency
-Methode hinzufügen.
Wenn die injizierte Assembly eine externe Datei laden muss, um ordnungsgemäß zu funktionieren (z. B. eine Konfigurationsdatei), können Sie diese mit der AddFile
-Methode angeben. Diese Methode kopiert die angegebene Datei in das Arbeitsverzeichnis des injizierten Prozesses.
In manchen Fällen ist es notwendig, ein Argument an die in der injizierten Assembly aufgerufene Methode zu übergeben. Dies wird erreicht, indem ein context
an die Inject
-Methode übergeben wird. Anschließend muss die Injected
-Methode das context
in den echten Typ umwandeln (ein Beispiel finden Sie unter AssemblyWithMethodAcceptingAnArgument
). Das Framework verwendet die BinaryFormatter
-Klasse, um das context
zu serialisieren. Stellen Sie daher sicher, dass das angegebene Objekt serialisiert werden kann.
Betrachten wir den folgenden Code:
using System;
namespace InjectedAssembly
{
public class Main
{
// we use a default injection method name in order to execute our code in the remote process
private static void Inject()
{
Console.WriteLine("Hello world from the injected process!");
}
}
}
Um die aus dem obigen Code generierte Assembly einzufügen, reicht es aus, den folgenden Code zu verwenden:
var pid = 1234;
var injector = new Injector(pid, Assembly.LoadFile("AssemblyToInject.dll"));
var injectionResult = injector.Inject();
Weitere Beispiele finden Sie im Beispielordner.
ManagedInjector wird derzeit mit VisualStudio 2017 Community Edition entwickelt (stellen Sie sicher, dass die neueste Version installiert ist). Um den Quellcode zu erstellen, müssen Sie Folgendes tun:
build.bat
aus Wir verwenden SemVer zur Versionierung. Die verfügbaren Versionen finden Sie in den Tags in diesem Repository.
Managed Injector ist unter der Creative Commons-Lizenz lizenziert.