Bluepill ist ein Dynamik-Rahmen für Open-Source-Analysen zum Umgang mit ausweichenden Malware. Ziel ist es, die für automatischen Analysen erforderlichen Transparenzeigenschaften mit den für die manuellen Analyse erforderlichen feinkörnigen Ausführungsprüfungs- und Patch-Funktionen in Einklang zu bringen.
Bluepill ist ein akademischer Prototyp, den wir in unserer Freizeit beibehalten: Ihr Feedback ist kostbar!
Bluepill kann vielen roten Pillen entgegenwirken, die sich mit Hypervisoren, Debuggern, Werkzeugen von Drittanbietern und Timing-Artefakten auswirken. Es baut auf dynamischen binären Instrumenten (DBI) auf, um Abfragen zu überwachen, die Malware auf der Umgebung nach Artefakten suchen kann, und verändern ihre Ergebnisse, wenn sie das Vorhandensein eines automatisierten Analysesystems oder eines menschlichen Agenten aufzeigen können. Bluepill bietet eine GDB-Remote-Schnittstelle an, um eine Probe zu debuggen und gleichzeitig die Ausweiche des Aufenthalts der Analysten zu sorgen, zusammen mit einem neuen Stealth-Patching-Mechanismen, um Codeänderungen im Debugger vor Selbstprüfungsschemata zu verbergen.
Wir haben Bluepill auf heterogenem PE32-Windows-Malware getestet, die auf 32-Bit-Windows 7 SP1 ausgeführt werden: Wir können beispielsweise ausführbare Ausführbarungen ausführen, die mit neueren Versionen von VMProtect und theIDA und hochentwickelten Proben wie Furtim geschützt sind.
Bluepill wurde in: vorgestellt in:
Um den DBI-Ausweichungen entgegenzuwirken, verwendet Bluepill eine Bibliothek von Minderungen, die wir als Teil unseres Papiers Sok für Intel Pin geschrieben haben: Verwenden von dynamischen binären Instrumenten für Sicherheitsvorschriften (und wie Sie möglicherweise redelisiert werden) von Asiaccs 2019. In Bluepill erweiterten wir die Bibliothek mit weiteren MIT-Handblutungen und Ausnahme von Ausnahmepillen. Sie können mehr über DBI -Auswidrigkeiten in der Arbeit lesen , in der dynamische binäre Instrumentierungssysteme für auffällige Merkmale und Artefakte bewertet werden, die kürzlich in ACM DTRAP (Preprint) erschienen sind.
Unterhalb einer Teilliste der Auswehrbluepill-Bluepill-in unseren Tests auf einem Windows 7 SP1 32-Bit-Virtualbox 5.2-Gerät für eine Vielzahl von ausführbaren Protektoren und gepanzerten Proben:
| Kategorie | Instanzen |
|---|---|
| Hypervisor | Gäste, Dateien, Registrierungseinträge, Bibliotheken und Treiber von VirtualBox |
| Hardware | BIOS- und Firmware -Saiten, MAC -Adresse, cpuid , Scheibengröße, Strom-/Wärmefunktionen |
| Zeit | Verlangsamungserkennung mithilfe von rtdsc und Windows-zeitbezogenen APIs |
| Software | Artefakte gemeinsamer Überwachungstools (Ausführende Prozesse, GUI -Windows), übergeordneter Prozess, HKL -Tastaturlayout, Frozen -Mauszeiger |
| Debuggen | Einzelstufenausnahmen, int 2d , Betriebssystemabfragen für aktive/installierte Debugger (z NtQueryInformationProcess |
| WMI -Fragen | CPU, Festplattengröße, MAC -Adresse, ACPI, MUI -Sprachen, VirtualBox VBOXVIDEO |
| DBI | Zeigerlecks mit FPU -Anweisungen, Speicherinhalten und Berechtigungen (z. B. Schutzseiten, NX Endage) |
HINWEIS: Bevor wir für BH Europe 2019 an die Börse gehen, haben wir radikale Änderungen vorgenommen, die den Umgang mit 64-Bit-Code und (in geringem Maße) des WOW64-Subsystems durchbrach: Bitte betrachten Sie diese Szenarien experimentell, wenn wir die Regressionstests abschließen, und zögern Sie nicht, Probleme zu melden.
Bluepill baut auf Intel Pin (V3.16 empfohlen) auf und erfordert Visual Studio 2015 oder höher für seine Zusammenstellung.
PIN verfügt über einige Abhängigkeiten, die eine manuelle Aufnahme in das Projekt erfordern. Wir haben eine Locals.props -Datei erstellt, die die Projektkonfiguration vereinfacht. Die Standardeinstellungen werden in C:Pin316 installiert und die SDK 8.1 -Header werden verwendet:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
Wenn Sie beispielsweise die SDK 10.0.17763.0 -Header verwenden möchten, sollten Sie nach Änderung der Projekteinstellungen in Visual Studio auch den Wert der WinHPath -Eigenschaft in C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um ändern. AMILARY, Ändern Sie den Eigenschaftswert, wenn Ihre SDK 8.1 -Header in C:/Program Files/ anstelle von C:/Program Files (x86)/ . Der Zweck dieses Feldes ist es, die PIN zu unterstützen, wenn er den absoluten Weg von Windows.h enthält.
Sie sollten jetzt in der Lage sein, Bluepill zu kompilieren. Sobald die Kompilierung endet, finden Sie im PIN -Verzeichnis eine bluepill32.dll -Bibliothek. Wenn Sie auf einen fehlenden msvc_compat.h -Fehler stoßen, stellen Sie sicher, dass $(PinFolder)extrascrtinclude ein gültiger Pfad ist.
Um eine ausführbare Datei unter Bluepill -Verwendung auszuführen:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
Bluepill unterstützt die folgenden Befehlszeilenoptionen:
| Option | Bedeutung |
|---|---|
-evasions | Die meisten unterstützten Ausgänge erkennen und umgehen (siehe unten für DBI) |
-debugger | Aktivieren Sie den Debugger -Modus über die GDB -Remote -Schnittstelle |
-leak | DBI -Evasionen: Behebung von Lecks von echtem EIP (z. B. FPU -Anweisungen) |
-nx | DBI -Evasions: Überprüfen Sie, ob Codeseiten ausführbar sind |
-rw | DBI -Evasions: Seiten verbergen, die zum DBI -Motor gehören |
Zum Beispiel zum Ausführen eines Ausweichprogramms namens sample.exe in einem Sandbox-ähnlichen automatischen Modus versuchen Sie:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
Das Aktivieren der Minderung -leak -Minderung hat eine minimale Leistung, während -nx und letztendlich -rw bei komplexen Packern helfen können, die die Konformitätsprüfung auf den Adressraum des Programms versuchen.
BluePill erstellt eine Datei namens evasions.log unter dem Ordner C:Pin316 (ändern Sie die LOGPATH in pintoolsrclogging.h , um sie zu ändern), die sie ändern), die mögliche Ausweichenversuche während der Ausführung abgefangen haben.
Bluepill unterstützt die Verwendung eines Debuggers zur Steuerung der Ausführung und zur Durchführung von Malware -Dissektion. Wir verlassen uns auf die GDB -Fernschnittstelle von PIN: Bluepill kann somit als Remote -Backend aus Ihrem Debugger -Tool verwendet werden, wenn es das GDB -Protokoll unterstützt. Im Folgenden geben wir Anweisungen zur Einrichtung einer Debugging -Sitzung mit IDA Pro an.
Um die Debugger -Schnittstelle zu aktivieren, müssen Sie zusätzliche Befehlszeilenoptionen für die PIN ( -appdebug -appdebug_server_port <port> ) und Bluepill ( -debugger ) wie folgt bereitstellen:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
Wir werden 10000 als Portnummer in diesem Handbuch verwenden. Die Anwendung bleibt inne, bis Sie einen Debugger an den Socket anschließen: Wenn Sie jedoch versuchen, einen lokalen Debugger an den Prozess anzubringen , werden Sie anstelle der Anwendung die gesamte PIN -Engine debuggen. Die erwartete Ausgabe auf dem Bildschirm ist so etwas wie:

Sie können jetzt die ausführbare Datei in IDA öffnen und das Remote-GDB-Debugger- Backend aus Debugger->Switch debugger auswählen. Überprüfen Sie, ob die Optionen (z. B. Portnummer) mit Debugger->Process options wie im folgenden Screenshot korrekt sind:

Zu diesem Zeitpunkt hilft es, einen Breakpoint für eine Adresse in den wichtigsten ausführbaren Abschnitt mit ausführbarem Wert aufzunehmen, beispielsweise auf dem Einstiegspunkt. Dann können Sie Ihre Debugging-Sitzung mit Debugger->Start process beginnen. IDA wird Ihnen benachrichtigen, dass "bereits von der Fernbedienung ein Prozess debuggiert wird. Möchten Sie ihn anhängen?" . Klicken Sie einfach auf Ja und die Debugging -Sitzung beginnt, wobei EIP irgendwo in ntdll.dll ist.
Da Speicherzuordnungsinformationen standardmäßig über das GDB -Remote -Protokoll nicht verfügbar sind, haben wir einen benutzerdefinierten Debugger -Befehls vmmap hinzugefügt, der Bluepill anweist, eine solche Karte zu erstellen. Wir haben diesen Vorgang mit einem Skript addSegments.py im scripts/ Ordner zur Verfügung gestellt: Laden Sie ihn einfach in IDA mit File->Script file . Das Skript füllt die Segmente von IDA mit den Speicherlayout -Informationen (dh Abschnitten und deren Berechtigungen) für jedes Codemodul ein. Hinweis: Wir werden bald Code hinzufügen, um die Modul -Unteransicht zu aktualisieren, die derzeit veraltet bleibt.
Sie können jetzt Ihr Beispiel debuggen, als Bluepill Sie vor vielen Ausgängen schilft :-)
Bitte beachten Sie, dass die Ausnahmebehandlung eine Problemumgehung für den aktuellen GDB -Serverunterstützung in der PIN erfordert. Wenn eine Ausnahme nicht an die Anwendung weitergegeben werden sollte (z. B. 0xc0000008 für ein ungültiges Handle, das an CloseHandle übergeben wurde), senden Sie einen wait in der GDB -Konsole direkt nach dem Empfangen der Ausnahmemeldung und trennen Sie die IDA wieder mit Bluepill. In der Zwischenzeit wird der Debugger -Helfer die ausführbare Datei als Antwort auf den Befehl auf Eis halten.
HINWEIS: Wir haben uns ursprünglich auch auf den Trick der Trennung angewiesen, auch für andere Ausnahmeberechnungen. Für sie führte neu eingeführte Änderungen in einer PIN-Veröffentlichung nach dem 3,5 zu einem internen Behauptungsversagen beim Wiederaufnehmen des Debuggers ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID Connection Wenn Sie sich also einer 0xc0000005 -Ausnahme von einem int 3 Opcode oder einem int 2d -Ausweiche ausstellen, sollten Sie die Ausnahme zur Anwendung geben. Die Debugger -Schnittstelle des PIN wird nicht direkt erkannt, aber der Gegner kann dies auch mit einer Schreibwache tun. Wir denken derzeit an eine Problemumgehung, um solche Artefakte auch zu schützen.
Bluepill implementiert eine eindeutige Funktionalität, um beim Debuggen einen Code -Anteil zu pflücken und gleichzeitig aus dem ausführenden Code zu verstecken. Ein angewandtes Patch bleibt unsichtbar für Anti-Kernschemata (z. Kurz gesagt, wir ernten die JIT -Kompilierung, um Trampoline hinzuzufügen, die die kompilierten (ursprünglichen) Anweisungen überschreiben und durch Codeschutzmechanismen unbemerkt bleiben, da die Speicherlesungen immer wieder in die ursprünglichen Programmanweisungen umgeleitet werden.
Die Schaffung eines Patchs ist in drei Schritte unterteilt:
Betrachten Sie den Codeblock im Bild unten und nehmen Sie an, wir möchten den mov ebp, esp -Anweisungen unter der Adresse 0x771X37A5 mit einem mov eax, esp -Anweisungen ( 89 e0 in Binär) überschreiben, und machen Sie anschließend den Ausführungsresume unter der Adresse 0x771X37A8 .

Wenn Bluepill im Debugger -Modus arbeitet, können wir Pin für Patches über einen benutzerdefinierten GDB -Befehl anweisen: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> , wobei Adressen als Hex -Nummern und Code -Patch -Bytes durch ein Comma getrennt sind. Zum Beispiel können wir: set_771c37a6_771c37a6_771c37a8_89,e0 verwenden.
Patches können dann einfach mit einem anderen benutzerdefinierten GDB -Befehl entfernt werden: rm_<START_ADDR>_<END_ADDR> .
Wenn Sie Bluepill in einem akademischen Projekt verwenden oder glauben, dass es zu einem Diskussionsabschnitt in Ihr Papier passt, wären wir dankbar, wenn Sie unsere Arbeiten mit dem folgenden Bibtex -Eintrag verweisen könnten:
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}