
Winstrument is a framework of modular scripts to aid in instrumenting Windows software using Frida for reverse engineering and attack surface analysis.
Winstrument ist ein Framework aus modularen Skripten, die bei der Instrumentierung von Windows-Software mit Frida für Reverse Engineering und Angriffsflächenanalyse helfen sollen.
Dieses Projekt unterstützt Python 3.7. Vorausgesetzt, Sie haben bereits Python und pip installiert, führen Sie einfach Folgendes aus:
pip install winstrument
und führen Sie dann zur Ausführung des Programms Folgendes aus:
winstrument
Beachten Sie, dass das Tool derzeit experimentell ist und manchmal einfrieren oder andere Stabilitätsprobleme haben kann.
In einigen Fällen, z. B. bei einer frischen Windows-10-Installation, kann beim Installieren von Frida ein SSL-Fehler in pip auftreten. Wenn dies passiert, siehe Fehlerbehebung unten.
Um die Winstrument-REPL auszuführen, führen Sie einfach winstrument aus.
Hier ist ein kurzes Beispiel für die Instrumentierung von notepad.exe mit dem Modul registry. Vollständige Informationen zu den verfügbaren CLI-Befehlen finden Sie im CLI-Abschnitt unten.
PS C:\winstrument> winstrument
> set target C:\Windows\System32\notepad.exe
> use registry
> run
Spawned 1144
instrumented process with pid: 1144 and path: C:\Windows\System32\notepad.exe
<User closes notepad from GUI>
detached from 1144 for reason process-terminated
> show registry
module time target function hkey subkey value
-------- ----------------- ------------------------------- ---------------- ------------------ --------------------------------------------------------------------------- ---------------------------------
registry 2019-08-19 07:03:07 C:\Windows\System32\notepad.exe RegGetValueW 0x2f4 SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize AppsUseLightTheme
<...>
Im obigen Beispiel gibt der Benutzer den Zielprozess an, in diesem Fall notepad.exe. Anschließend gibt er an, dass er das Modul registry verwenden möchte, das die vom Programm gemachten Systemaufrufe bezüglich der Registrierung aufzählt. Nachdem der Prozess abgeschlossen ist (der Benutzer schließt Notepad), kann die gespeicherte Ausgabe mit show registry angezeigt werden.
Die Haupt-Python-Datei winstrument.py initialisiert das Frida-Device und startet eine Instanz des Zielprozesses.
cmdline.py stellt eine Befehlszeilenschnittstelle unter Verwendung von cmd2 bereit. Dies ist der Haupteinstiegspunkt des Skripts, wenn Winstrument direkt über die Befehlszeile ausgeführt wird. Die Befehle sind unten dokumentiert.
Anschließend geht es durch jedes aktivierte Modul, instanziiert es und ruft die load_scripts()-Methode des Moduls auf, um den Prozess zu instrumentieren.
Schließlich ruft es für jedes Modul get_output() und on_finish() auf, wenn die Verbindung zum Ziel getrennt wird.
Die Module sind in .py-Dateien im Verzeichnis modules/ enthalten. Ein Modul besteht aus einer Unterklasse von base_module.BaseInstrumentation, die den zu injizierenden Code, die Nachrichtenbehandlung für diesen injizierten Code und die Ausgabe definiert.
Die Modul-APIs werden weiter unten im Abschnitt „Module“ beschrieben.
Jedes Modul speichert Metadaten wie seine Beschreibung in modules/metadata.toml. Der Abschnitt sollte mit dem Namen des Moduls (Groß-/Kleinschreibung wird nicht beachtet) als Überschrift versehen sein.
Zum Beispiel hier der Abschnitt, der dem dlls Modul entspricht:
[DLLS]
description = """Hooks LoadLibrary-family system calls and outputs DLL loads where part of the search path might be
writable by the current user or a low-privileged user group."""
Das Programm speichert Einstellungen in settings.toml in %APPDATA%/winstrument.
Da die meisten, wenn nicht sogar alle, Module JavaScript in den Zielprozess injizieren, enthält das Verzeichnis modules/js/ Frida-JavaScript-Ausschnitte, die von den Modulen geladen und injiziert werden.
Diese Dateien sollten denselben Namen wie das Modul haben, d. h. das Modul dlls.py würde JS aus js/dlls.js verwenden.
Wie oben beschrieben, ist jedes Modul eine Unterklasse von BaseInstrumentation aus base_module.py.
Jedes Modul sollte seinen Namen (den Namen der Python- und JS-Dateien ohne Erweiterung) als statisches Klassenattribut namens modulename definieren.
Module können die folgenden Methoden von BaseInstrumentation verwenden oder überschreiben:
__init__(self,*args,**kwargs) - Zusätzlich zu jedem modulspezifischen Initialisierungscode sollte dieser Konstruktor super().__init__(*args,**kwargs) aufrufen.load_script(self) - Diese Methode muss im Allgemeinen nicht überschrieben werden, da die Implementierung in BaseInstrumentation für die meisten Anwendungsfälle ausreichen sollte. Um an Frida-Ereignisse anzuknüpfen, überschreiben Sie stattdessen register_callbacks(). load_script sollte verwendet werden, um die zu instrumentierende JavaScript-Datei zu laden, session.create_script von Frida aufzurufen, gewünschte Callbacks hinzuzufügen und dann die load()-Methode des Skriptobjekts zur Instrumentierung aufzurufen.register_callbacks(self) - Wird von BaseInstrumentation.load_script aufgerufen, bevor das Skript in den Zielprozess geladen wird. Wird verwendet, um Ereignisse wie _session.on('message') usw. zu registrieren. Die -Version fügt standardmäßig einen Hook für on_message hinzu.Die Winstrument-Shell bietet die folgenden Befehle:
list - Zeige alle verfügbaren und geladenen Module an.load <modulename>/use <modulename> - Aktiviere das Modul mit dem angegebenen Namen.unload <modulename> - Deaktiviere das Modul mit dem angegebenen Namen.set [setting [value]] - Ohne Argumente werden alle Einstellungen und ihre Werte angezeigt. Mit einem Argument wird der Wert von setting angezeigt. Mit zwei Argumenten wird setting auf value gesetzt. Die Einstellungen bleiben über mehrere Läufe hinweg erhalten.show [modulename [format]] - Zeigt gespeicherte Eingaben von modulename im angegebenen format an. Ohne Argumente ausführen, um eine Liste der Formatierer zu sehen.info <modulename> - Gibt eine Beschreibung des Moduls mit dem angegebenen Namen aus.Dies scheint hauptsächlich bei einer neuen Windows-Installation aufzutreten. Das setup.py von Frida versucht, eine .egg-Datei von https://files.pythonhosted.org zu laden. In einigen Fällen schlägt dies fehl, weil das SSL-Zertifikat für diese Domäne nicht verifiziert werden kann. Dies scheint ein Nebeneffekt der Art zu sein, wie Windows Root-CAs lädt. Windows scheint bei einer Standardinstallation nicht alle Root-CAs mitzuliefern, sondern zieht sie stattdessen bei Bedarf nach, wenn Websites besucht werden. Infolgedessen ist die Root-CA, die das SSL-Zertifikat von files.pythonhosted.org signiert hat, möglicherweise nicht im System-Trust-Store vorhanden.
Um dieses Problem zu beheben, besuchen Sie https://files.pythonhosted.org manuell in Edge oder Chrome, damit Windows die Root-CA zu seinem Trust-Store hinzufügt, und versuchen Sie dann pip install erneut.
Beachten Sie, dass der Besuch der Seite in Firefox nicht funktioniert, da Firefox seinen eigenen Trust-Store und nicht den System-Trust-Store verwendet.
Winstrument ist unter GPLv3 lizenziert. Weitere Einzelheiten finden Sie in der Datei LICENSE.
BaseInstrumentationwrite_message(message) - Nimmt eine JSON-ähnliche Nachricht als Dict, schreibt sie in die SQLite-Datenbank und speichert sie für die spätere Ausgabe.post_load(self) - Wird von BaseInstrumentation.load_script aufgerufen, nachdem das Skript im Zielprozess geladen wurde. Dies könnte beispielsweise verwendet werden, um vom Skript exportierte RPC-Methoden aufzurufen.get_output(self) - Wird vom Hauptskript aufgerufen, wenn das Ziel getrennt wird. Diese Methode sollte eine Liste zurückgeben, wobei jeder Eintrag ein MoudleMessage-Objekt ist (aus data/module_message.py). Sie muss im Allgemeinen nicht überschrieben werden.on_message(self,message,data) - Callback zur Behandlung des Frida-message-Ereignisses, das durch send im injizierten JavaScript ausgelöst wird.on_finish(self) - Callback, das vom Hauptskript aufgerufen wird, wenn das Ziel getrennt wird. Führen Sie hier alle erforderlichen Bereinigungsoperationen durch.run - Instrumentierung starten.q/quit/exit - Beendet die CLI (offensichtlich).