
CLRホスティングを実装して.NETアセンブリをメモリ内で実行する、Crystal Palace用のPICOです。
Crystal Palace向けのPICOであり、donut シェルコードジェネレーターと同じ手法を使用して、追加された.NETアセンブリをメモリ内で実行するためのネイティブCLRホスティングを実装しています。これにより、RubeusやSeatbeltなどの.NETツールを、ディスク上に配置せずに位置独立コードから読み込むことができます。

プロジェクトをリンクするには、MinGW GCC、zipユーティリティ、およびCPL実行ファイルが必要です。config.spec を編集して、プロジェクトにリンクする.NETアセンブリと渡したいコマンドライン引数を指定します。Makefile を編集して crystalpalace.jar の場所を指定します。
PICOを単体で(COFFとして)ビルドするには、make pico を実行します。サンプルランナーをビルドしてPICOにリンクするには、make runner を実行します。
サンプルランナーは out/runner.bin に出力されます。デフォルト構成では、実行時に一般的なダミー資格情報を使って "asktgt" を実行するため、追加されたRubeusアセンブリを呼び出します。

PICOのエントリポイントのシグネチャは次のとおりです。
HRESULT (*EXECUTE_ASSEMBLY_PICO)(char *assembly, size_t assembly_len, WCHAR *argv[], int argc);
最初の2つの引数には、生の.NETアセンブリへのポインタとそのサイズを指定します。次の2つの引数は、アセンブリが呼び出されるときに文字列パラメータを渡すために使用されます。
このPICOは、指定した引数でアセンブリを呼び出すだけです。出力のキャプチャは一切試みません。
STDINからの入力を提供したり、STDOUTからの出力をキャプチャしたりする必要がある場合は、CreatePipe() や SetStdHandle() などのWIN32 API呼び出しを使用するようにローダーを変更し、プロセスの標準I/Oデバイスを匿名パイプに接続する必要があります。その後は、通常どおりパイプに対して読み書きできます。
clr.h を直接使用しました。