SimpleReor ("Simple -ator") ist ein innovativer Windows-zentrierter X64-User-Mode-Anwendungsemulator, der mehrere neue Funktionen nutzt, die in Windows 10 Spring Update (1803) hinzugefügt wurden, auch "Redstone 4", mit zusätzlichen Verbesserungen, die in Windows 10. Oktober Update (1809), auch "Redstein 5" vorgenommen wurden.
SimpleReor verlässt sich nämlich auf:
Es ist ein Beweis dafür, wie einfacher und schnelleres Sandbox-Detonationsumgebungen sowie noch mehr ressourcenbegrenzte Container erstellt werden können, die serverlose Workloads (AWS Lambdas / Azure-Funktionen) ausführen könnten, ohne dass ein Gastbetriebssystem erforderlich ist.
SimpleReor kann mit Visual Studio 2017 und dem neuesten Windows SDK (1809) erstellt werden. Beachten Sie, dass ältere SDKs nicht verwendet werden können, da sie die neueren WHVP-Definitionen nicht unterstützen und dass SimpleReor selbst nur 64-Bit-Windows 10-Systeme unterstützt, die Builds 17763 oder höher (Redstone 5/1809).
Das Hauptfenster des Hauptmonitors, das die hier angezeigten Systemaufrufe nachzeichnet und die Konsolenausgabe aus der Test -Gastanwendung anzeigen:
Das Registerfenster, das verwendet werden kann, wenn eine Behauptung/ein Problem mit dem Emulator vorliegt (der UI -Thread friert daher die Nachricht "Nicht antworten"):
Und schließlich, wenn das Flag FLG_SHOW_LDR_SNAPS im PEB aktiviert wird, zeigt das Debug -Fenster Anrufe an DbgPrint aus dem Loader (ansonsten würden alle anderen DBGPRINT -Anrufe unabhängig davon angezeigt):
TBD TBD Fügen Sie Links hinzu
Entwickler schreiben seit Jahrzehnten nach Emulationstechnologien und nutzen sie. Warum also noch einen Emulator schreiben?
Erstens ist die Einführung einer tatsächlichen Virtualisierungs-API im Herzen von Windows eine nicht publizierte dramatische (auf positive Weise) zur vorherigen geschlossenen Natur der Hyper-V-Plattform. Während die VID -Bibliothek (Virtualization Infrastructure Device) APIs und IOCTLs über die VID -Bibliothek (Virtualization Infrastructure Device) gab, ist eine unterstützte und stabile Win32 -Schicht eine willkommene Verbesserung. Bereits unterstützt QEMU jetzt die Verwendung von WHVP für seine Beschleunigung, und VirtualBox 6.0 wird wahrscheinlich auch mit dieser Unterstützung versandt (es wird bereits im Repository implementiert). Nur VMware steht allein und trotzig. Zu diesem Thema ist es nicht unbedingt ein einfaches Thema, zu lernen, wie man diese neue API nutzt, also wollte ich lernen - und mit anderen teilen -, wie diese neuen Schnittstellen funktionieren.
Zweitens gibt es bei der Betrachtung von Emulationstechnologien normalerweise drei moderne treibende Kräfte für die Verwendung:
Mein Hauptinteresse bestand darin, die dritte Kugel zu betrachten-die bisher mit vollem Systememulation erreicht wurde, mit einigen benutzerdefinierten Implementierungen, die über-subscriptionsmodelle verwenden, aber dennoch viel Komplexität bringen-ein Beispiel für die meisten Antiviren-Emulatoren, wie die in Windows-Verteidiger implementierten (siehe einige große Forschung [hier] und [hier]). Darüber hinaus haben Forscher, die Qilin vertraut sind, wahrscheinlich bereits die Vielzahl einfacher Python-Bindungen gesehen, die sich leicht darauf aufbauen, um einen Windows-Prozess mit einem über-subskriptionalen Modell schnell zu „spinnen“, indem QEMU als volles Systememulator jedoch ohne primäres OS-Bild nutzt.
Ich habe mich entschlossen, eine andere Möglichkeit zu erreichen-eine Art von "Benutzer-Modus-Windows", bei der die einzigen Binärdateien im Gastraum des Gastadresses der OS-Loader des Hosts (ntdll.dll) und der Ziel-Binärer sein würden, und in der ein 256-GB-Adressraum für den nativen Zugriff zwischen den virtuellen Gäste und der virtuellen Auswahl von Gäste und dem Host-Virtual-Mapping-APP-Mapping-APP-Maße. Sandboxing). Solange der Emulator die grundlegenden Kernel-konstruierten Datenstrukturen für die Lader- und System-DLLs liefern würde, könnte der Host mit nativen Geschwindigkeiten ausgeführt werden, wobei nur privilegierte Ringübergänge Ausgänge verursachen.
Der Einfachheit halber fängt ein Systemanbieter die Systemaufrufe, die vom Gast -VM getätigt werden, ab und können auf eine von drei Arten arbeiten:
Abhängig davon, wo die Anforderungen zwischen Leistung, Komplexität, Kompatibilität und Sicherheit liegen, sind weniger als 500 Codezeilen erforderlich, um genügend Kugeln 1 und 2 oben zu implementieren, um eine einfache Testanwendung zum Laden zu erhalten, eine "Hello World" -Meldung anzuzeigen und zu beenden, mit vielen potenziellen Sicherheitsproblemen bei der Behandlung der Systemanrufe. Eine Verdoppelung der Codebasis könnte wahrscheinlich die meisten Sicherheitsprobleme in den Systemanrufen realistisch mindern (minus tatsächliche Schwachstellen im Host -OS -Kernel - gegen die eine Sandkiste mildern könnte).
Aber selbst bei 1000 Codezeilen, da alle Systemaufrufe letztendlich nativ an das Betriebssystem gesendet werden, verhält sich SimpleReor eher wie eine 'SecComp' -Implementierung über eine CGroup unter Linux als die viel komplexeren Emulatoren, die wir heute sehen.
Schließlich ist darauf hinzuweisen, dass das Interesse an dem Cloud -Computing-/Containerisierungsraum ein neues Interesse gibt, um die Ressourcen zu minimieren, die für die Ausführung von Workloads wie Amazon Lambdas oder Azure -Funktionen benötigt werden. Mit einer strengeren Kontrolle über die Sicherheitsgrenzen, die SimpleReor bereitstellt, kann man sich vorstellen, dass die Fähigkeit des JVM- oder .NET -Kerns als dedizierte Anwendung ausführt, ohne ein vollständiges Gastbetrieb zu erfordern.
TBD TBD
Es gibt 3 interessante wichtige Teile (für mich) darüber, wie SimpleReor eine einzigartige Gästeausführungsumgebung erreicht, die es viel einfacher macht, Windows -Anwendungen auszuführen:
Die Erstellung eines Peb und TEB mit den gleichen Daten, die die MiCreatePebOrTeb -Funktionen des Kernels aufstellen würden, aber mit spezifischen Flags, um es einfacher zu machen, unter der Gastumgebung zu laufen, einschließlich
Erstellen einer 1: 1 -Kartierung zwischen Gast- und Host -Adressen und Nutzung der neuen Funktionen "Adressanforderungen", um die Zuordnungen für diesen Bereich zu sperren. Beachten Sie, dass SimpleTor im Moment die authentische Region KUSER_SHARED_DATA um 0x7FFE0000 ordnet, was bedeutet, dass der Gast -VM -Ablauf durch die Aktualisierung der SystemTime und InterruptTime -Felder, die vom Host auf dem Laufenden gehalten werden, "gesehen" werden. Das Isolieren dieser Region müsste einen periodischen Timer erfordern, um den Aktualisieren dieses Wertes zu emulieren.
Zuordnen des authentischen Ntdll.dll -Bildes und Nutzung der Host -OS -Systemaufrufe, um den größten Teil des Ladeprozesses nativ auszuführen und Zugriff auf INT 2E , SYSCALL und INT 2C -Ringübergänge zu ermöglichen.
Darüber hinaus besteht SimpleTor aus drei Binärdateien aus Modularität:
Simpleator.exe , das den Debug -Monitor implementiert. Diese Komponente ist dafür verantwortlich, die Benutzeroberfläche für den Monitor, Debug und Registrieren der Fenster anzuzeigen und ein benanntes Rohr zu hosten, mit dem der Emulator mit ihm kommunizieren kann, und den Emulator mit einer geeigneten Umgebung zu laden (heute bedeutet dies, dass die 256 -GB -Adressraumreservierung in Zukunft auch die Sandbox bedeutet).Provider.dll , der den Systemanbieter für Windows 10 1809 (RS5) und Windows 10 1903 (19H1) implementiert, wurde der aktuelle Gebäude unterstützt.Emulator.exe , das den tatsächlichen WHVP-beschleunigten Emulatorcode implementiert. Es ist hauptsächlich dafür verantwortlich, mit dem Debug -Monitor über das Rohr zu kommunizieren, den Ringübergangscode zu bearbeiten, um mit und vom System -Call -Anbieter zu sprechen und die anfängliche Adressraum -Setup und das PE -Laden der Ntdll.dll Loader -Bibliothek und die Zielanwendung Binary durchzuführen. Zunächst müssen Sie die Windows Hypervisor-Plattform installieren, für die auch Hyper-V installiert und aktiviert werden muss. Sie können dies entweder tun, indem Sie die folgende Befehlszeile verwenden:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
Oder durch Start der GUI wie unten:
OptionalFeatures.exe
Und dann die Kontrollkästchen "Hyper-V" und "Windows Hypervisor Platform" überprüfen, wie im Screenshot unten angezeigt.
Sie müssen Verwaltungsrechte für die Nutzung eines dieser Befehle haben.
Bitte stellen Sie natürlich sicher, dass Ihre Hardware die Hardware-Virtualisierungstechnologie (wie Intel VT-X) unterstützt.
Wenn Sie mehr über meine Recherche oder Arbeiten erfahren möchten, lade ich Sie in meinem Blog unter http://www.alex-ionescu.com sowie mein Trainings- und Beratungsunternehmen Winsider Seminars & Solutions Inc. unter http://www.windows-internals.com ein.
TBD TBD
SimpleReor wurde entwickelt, um die Codegröße und -komplexität zu minimieren - dies ist zu einer Kosten für Robustheit und vor allem die Sicherheit. In der aktuellen Implementierung werden beispielsweise NtCreateFile , NtOpenFile und NtWriteFile vollständig an den Host -OS -Kernel weitergegeben, was bedeutet, dass eine „böswillige“ Nutzlast alle Dateien auf der Festplatte überschreiben könnte, auf die der Host -Emulator -Prozess zugreifen kann, da keine zusätzliche Sandboxen um den Host um den Host vorhanden sind.
Beachten Sie außerdem, dass nur die strenge Mindestanzahl von Systemanrufen implementiert wurde, um die Testapp.exe -Anwendung zum Starten, Drucken des Textes und zum Ausgang zu erhalten. Ausführen einer komplexeren Anwendung wie Cmd.exe erfordert wesentlich mehr Arbeit, insbesondere da bestimmte APIs erwarten, dass eine Verbindung zu CSRS über LPC hergestellt wird und bestimmte Daten zurückgegeben werden. Derzeit gibt SimpleReor vor, dass es sich um einen sicheren VTL-1-geschützten Prozess handelt, der signifikant einschränken, was einige der APIs der Gast-APIs versuchen, und daher bestimmte Anrufe direkter Absturz (zum Beispiel einige derjenigen in der Nähe des Gebiets).
Eine komplexere Nachahmung und Änderung des Adressraums des Gastes wäre erforderlich, um eine solche API -Verwendung zu entsperren.
SimpleReor macht nicht viel Fehlerprüfung, Validierung und Ausnahmebehandlung. Es ist keine robuste Software, die für die Produktionsnutzung, sondern eine Referenzcode -Basis entwickelt wurde .
Copyright 2018 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.