このプロジェクトは、.NET アセンブリ注入ライブラリを実装します (snoopwpf プロジェクトからインスピレーションを得ています)。リモート プロセスは、管理対象プロセスまたは非管理対象プロセスのいずれかになります。
リモート プロセスにアセンブリを挿入する場合は、次の点を考慮する必要があります。
上記の前提条件が満たされている場合は、アセンブリを挿入してアクティブ化メソッドを呼び出すことができます。アクティベーション メソッドを呼び出すには、次の 3 つの方法があります。
このライブラリは、リモート プロセスに DLL を挿入するために Shed によっても使用されます。ここでビデオを見ることができます。
実際の例については、TestRunner プロジェクトを参照してください。
挿入されたアセンブリに標準以外の .NET アセンブリへの依存関係がある場合は、 AddDependency
メソッドを使用してそれらの依存関係を追加できます。
挿入されたアセンブリが正しく動作するために外部ファイル (構成ファイルなど) を読み込む必要がある場合は、 AddFile
メソッドを使用してそれらを指定できます。このメソッドは、挿入されたプロセスの作業ディレクトリに指定されたファイルをコピーします。
場合によっては、挿入されたアセンブリで呼び出されるメソッドに引数を渡すことが必要になります。これは、 context
オブジェクトをInject
メソッドに渡すことによって実現されます。次に、 Injected
メソッドはcontext
オブジェクトを実際の型にキャストする必要があります (例については、 AssemblyWithMethodAcceptingAnArgument
」を参照)。フレームワークはBinaryFormatter
クラスを使用してcontext
オブジェクトをシリアル化するため、指定されたオブジェクトがシリアル化できることを確認してください。
次のコードを考えてみましょう。
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!");
}
}
}
上記のコードから生成されたアセンブリを挿入するには、次のコードを使用するだけで十分です。
var pid = 1234;
var injector = new Injector(pid, Assembly.LoadFile("AssemblyToInject.dll"));
var injectionResult = injector.Inject();
その他の例については、サンプル フォルダーを参照してください。
ManagedInjectorは現在、VisualStudio 2017 Community Edition を使用して開発されています (最新バージョンがインストールされていることを確認してください)。ソース コードをビルドするには、次のことを行う必要があります。
build.bat
実行するバージョン管理には SemVer を使用します。利用可能なバージョンについては、このリポジトリのタグを参照してください。
マネージド インジェクターは、クリエイティブ コモンズに基づいてライセンスされています。