
Ein PICO für Crystal Palace, das CLR-Hosting implementiert, um eine .NET-Assembly im Speicher auszuführen.
Ein PICO für Crystal Palace, das natives CLR-Hosting implementiert, um eine angehängte .NET-Assembly im Speicher auszuführen – mithilfe derselben Technik wie der donut-Shellcode-Generator. Dadurch kannst du .NET-Tools wie Rubeus oder Seatbelt aus positionsunabhängigem Code laden, ohne sie auf der Festplatte abzulegen.

Du benötigst MinGW GCC, das zip-Dienstprogramm und die CPL-Executables, die zum Linken des Projekts benötigt werden. Ändere config.spec, um die .NET-Assembly anzugeben, die du mit dem Projekt linken möchtest, sowie die Befehlszeilenargumente, die du übergeben möchtest. Ändere Makefile, um den Speicherort von crystalpalace.jar anzugeben.
Um das PICO allein (als COFF) zu bauen, führe make pico aus. Um den Beispiel-Runner zu bauen und mit dem PICO zu linken, führe make runner aus.
Der Beispiel-Runner wird nach out/runner.bin geschrieben. Die Standardkonfiguration ruft eine angehängte Rubeus-Assembly auf, um beim Ausführen "asktgt" mit einigen generischen Dummy-Zugangsdaten auszuführen:

Die Signatur des Einstiegspunkts des PICO lautet:
HRESULT (*EXECUTE_ASSEMBLY_PICO)(char *assembly, size_t assembly_len, WCHAR *argv[], int argc);
Die ersten beiden Argumente sollten einen Zeiger auf eine rohe .NET-Assembly und deren Größe enthalten. Die zweiten beiden Argumente werden verwendet, um der Assembly Zeichenfolgenparameter zu übergeben, wenn sie aufgerufen wird.
Dieses PICO ruft die Assembly lediglich mit den von dir bereitgestellten Argumenten auf. Es unternimmt keinen Versuch, die Ausgabe zu erfassen.
Wenn du Eingaben über STDIN bereitstellen oder die Ausgabe von STDOUT erfassen musst, solltest du deinen Loader so ändern, dass er WIN32-API-Aufrufe wie CreatePipe() und SetStdHandle() verwendet und die Standard-I/O-Geräte deines Prozesses mit einer anonymen Pipe verbindet. Danach kannst du wie gewohnt von ihr lesen und in sie schreiben.
clr.h direkt im PICO verwendet.