
Kernel-mode Windows-Treiber zur Echtzeiterkennung von Prozessinjektionstechniken, einschließlich Shellcode-, DLL- und reflektiver Injektion, mit Syscall-Hooking und Anomalieerkennung.
FalconEye ist eine Windows-Endpunkt-Erkennungssoftware für Echtzeit-Prozess-Injektionen. Es ist ein Kernel-Mode-Treiber, der darauf abzielt, Prozessinjektionen im Moment ihres Auftretens (Echtzeit) zu erkennen. Da FalconEye im Kernel-Modus läuft, bietet es eine stärkere und zuverlässigere Verteidigung gegen Prozessinjektionstechniken, die versuchen, verschiedene User-Mode-Hooks zu umgehen.
Sie können unsere Präsentation auf dem 2021 Blackhat ASIA Arsenal und die Folien einsehen.
Die folgende Tabelle zeigt den Implementierungsstatus und die Erkennungslogik für die verschiedenen Prozessinjektionstechniken. WPM steht für WriteProcessMemory. Zum Testen der Erkennung kann auf den Abschnitt 'Referenzen' verwiesen werden.
| Technik | Status | Erkennung | Verwendeter POC |
|---|---|---|---|
| Atombombing | ✓ | Hook QueueUserAPC und suche nach Funktionen der GlobalGetAtom-Familie | Pinjectra |
| Instrumentation callback injection | ✓ | Erkennen, ob ein neuer Thread aus fließendem Code erstellt wird | https://github.com/antonioCoco/Mapping-Injection |
| Reflective DLL Injection | ✓ | Erkennen, ob ein neuer Thread aus fließendem Code erstellt wird und ob ein PE-Header in das Opfer geschrieben wird | MInjector |
| PROPagate | ✓ | Hook SetProp, um die Adresse der geschriebenen Eigenschaft zu erhalten, und korreliere mit vorherigen WPM-Aufrufen, um die Adresse von fließendem Code zu erhalten | Pinjectra |
| Process Hollowing | ✓ | Erkannt durch in den Zielprozessspeicher geschriebenen PE-Header | MInjector |
| CreateRemoteThread with LoadLibrary | ✓ | Neuer Thread mit Startadresse, die auf LoadLibrary zeigt. Die MInjector-Version schreibt auch den DLL-Pfad mittels WPM, was ebenfalls erkannt wird | MInjector, Pinjectra |
| CreateRemoteThread with MapViewOfFile | ✓ | Erkennen, ob ein neuer Thread aus fließendem Code erstellt wird | Pinjectra |
| Suspend-Inject-Resume | ✓ | Erkennen, ob ein neuer Thread aus fließendem Code erstellt wird (MInjector). DLL-Pfad wird via WPM geschrieben (MInjector). Erkennen, ob ein Kontext auf einen zuvor ausgesetzten Thread gesetzt wird (Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | DLL-Pfad wird via WPM geschrieben | MInjector |
| QueueUserAPC with memset (Stackbombing) | ✓ | Hook QueueUserAPC und suche nach memset | Pinjectra |
| SetWindowLong (Extra window memory injection) | ✓ | Hook SetWindowLong, um die Adresse des geschriebenen Funktionszeigers zu erhalten, und korreliere mit vorherigen WPM-Aufrufen, um die Adresse von fließendem Code zu erhalten | Pinjectra |
| Unmap + Overwrite | ✓ | Warnen, wenn der Angreiferprozess ntdll aus dem Opfer entfernt | Pinjectra |
| Kernel Ctrl Table | ✓ | Erkennen, ob WPM das KernelCallbackTable-Feld im PEB des Opfers überschreibt | https://github.com/odzhan/injection/blob/master/kct |

HINWEIS: Unser Fokus lag auf der Erkennung und nicht auf der Erstellung einer leistungsfähigen Erkennungsengine. Wir werden diese Bemühungen auch nach der BlackHat-Präsentation fortsetzen.
.
├── src
│ ├── FalconEye ---------------------------# FalconEye Benutzer- und Kernelraum
│ └── libinfinityhook ---------------------# Kernel-Hook-Implementierung
├── 2021BHASIA_FalconEye.pdf
└── README.md
BCDEDIT /set nointegritychecks ONAtombombing: Brand new code injection for windows, 2016
Propagate - a new code injection trick, 2017
Windows process injection: Extra window bytes, 2018
Pavel Asinovsky. Diving into zberp's unconventional process injection technique, 2016
Rotem Kerner. Ctrl-inject, 2018
Windows process injection: Consolewindowclass, 2018
Windows process injection: Windows notication facility, 2018
A paradox: Writing to another process without openning it nor actually writing to it, 2007
Windows process injection: Service control handler, 2018
FalconEye ist unter der Open-Source-Lizenz Apache 2.0 lizenziert.
| USERDATA | ✓ | Prüfen, ob die WPM-Zieladresse im Bereich von conhost.exe liegt. Wenn ja, prüfen, ob relevante Funktionszeiger von conhost mit zuvor gespeicherter WPM-Adresse übereinstimmen | https://github.com/odzhan/injection/blob/master/conhost |
| Ctrl-inject | ✓ | Erkennen, ob der Angreifer WPM im Bereich der KernelBase.dll des Opfers durchführt | Pinjectra |
| ALPC Callback | ✓ | Extrahiere die Opfer-PID in NtConnectPort-Aufrufen an den ALPC-Port. Für das Angreifer-Opfer-PID-Tupel überprüfe vorherige WPM-Aufrufe und wende Floating-Code-Erkennung an | Pinjectra |
| WNF Callback | ✓ | WPM gefolgt von UpdateWNFStateData-Aufruf | https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | Speichere Modulpfade, die im NtUserSetWindowsHookEx-Hook registriert sind. Später, wenn ein Modul, das diesem Pfad entspricht, in einem anderen Prozess geladen wird, generiere eine Warnung | MInjector |
| GhostWriting | ✓ | Erkennen, ob ein Kontext (NtSetContextThread wird aufgerufen) auf einen zuvor ausgesetzten Thread gesetzt wird | Pinjectra |
| Service Control | ✓ | WPM überschreibt die Service-ID eines Prozesses (Dienstes) | https://github.com/odzhan/injection/tree/master/svcctrl |
| Shellcode injection | ✓ | Neuer Thread, gestartet aus fließendem Code. DLL-Pfad wird von WPM geschrieben | MInjector |
| Image Mapping | ✓ | Thread gestartet aus fließendem Code. PE-Header wird von WPM geschrieben. DLL-Pfad wird von WPM geschrieben | MInjector |
| Thread Reuse | ✓ | Thread gestartet aus fließendem Code. DLL-Pfad wird von WPM geschrieben | MInjector |