
Pilote Windows en mode noyau pour la détection en temps réel des techniques d'injection de processus, y compris l'injection de shellcode, de DLL et l'injection réflexive, avec hooking d'appels système et détection d'anomalies.
FalconEye est un logiciel de détection pour terminaux Windows destiné aux injections de processus en temps réel. C'est un pilote en mode noyau qui vise à détecter les injections de processus au moment où elles se produisent (temps réel). Puisque FalconEye s'exécute en mode noyau, il offre une défense plus solide et fiable contre les techniques d'injection de processus qui tentent de contourner divers hooks en mode utilisateur.
Vous pouvez consulter notre présentation au 2021 Blackhat ASIA Arsenal et les diapositives.
Le tableau ci-dessous présente l'état d'implémentation et la logique de détection pour les différentes techniques d'injection de processus. WPM signifie WriteProcessMemory. Pour tester la détection, on peut se référer à la section des références.
| Technique | Statut | Détection | POC Utilisé |
|---|---|---|---|
| Atombombing | ✓ | Hooking de QueueUserAPC et recherche de la famille de fonctions GlobalGetAtom | Pinjectra |
| Instrumentation callback injection | ✓ | Détection si un nouveau thread est créé à partir d'un code flottant | https://github.com/antonioCoco/Mapping-Injection |
| Reflective DLL Injection | ✓ | Détection si un nouveau thread est créé à partir d'un code flottant et si l'en-tête PE est écrit dans la victime | MInjector |
| PROPagate | ✓ | Hooking de SetProp pour obtenir l'adresse de la propriété en cours d'écriture et corrélation avec les appels WPM précédents pour obtenir l'adresse du code flottant | Pinjectra |
| Process Hollowing | ✓ | Détecté via l'écriture de l'en-tête PE dans la mémoire du processus cible | MInjector |
| CreateRemoteThread with LoadLibrary | ✓ | Nouveau thread avec adresse de démarrage pointant vers LoadLibrary. La version MInjector écrit également le chemin de la DLL via WPM, ce qui est aussi détecté | MInjector, Pinjectra |
| CreateRemoteThread with MapViewOfFile | ✓ | Détection si un nouveau thread est créé à partir d'un code flottant | Pinjectra |
| Suspend-Inject-Resume | ✓ | Détection si un nouveau thread est créé à partir d'un code flottant (MInjector). Chemin de la DLL écrit via WPM (MInjector). Détection si le contexte est défini sur un thread précédemment suspendu (Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | Chemin de la DLL écrit via WPM | MInjector |
| QueueUserAPC with memset (Stackbombing) | ✓ | Hooking de QueueUserAPC et recherche de memset | Pinjectra |
| SetWindowLong (Extra window memory injection) | ✓ | Hooking de SetWindowLong pour obtenir l'adresse du pointeur de fonction en cours d'écriture et corrélation avec les appels WPM précédents pour obtenir l'adresse du code flottant | Pinjectra |
| Unmap + Overwrite | ✓ | Alerte si le processus attaquant démape ntdll de la victime | Pinjectra |
| Kernel Ctrl Table | ✓ | Détection si WPM écrase le champ KernelCallbackTable dans le PEB de la victime | https://github.com/odzhan/injection/blob/master/kct |

NOTE : Notre objectif a été la détection et non la création d'un moteur de détection performant. Nous poursuivrons ces efforts après la présentation BlackHat.
.
├── src
│ ├── FalconEye ---------------------------# FalconEye user and kernel space
│ └── libinfinityhook ---------------------# Kernel hook implementation
├── 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 vous est concédé sous la licence open source Apache 2.0.
| USERDATA | ✓ | Vérification si l'adresse cible de WPM se trouve dans la plage de conhost.exe. Si c'est le cas, vérification des pointeurs de fonction pertinents de conhost correspondant à l'adresse WPM précédemment stockée | https://github.com/odzhan/injection/blob/master/conhost |
| Ctrl-inject | ✓ | Détection si l'attaquant effectue un WPM dans la plage de KernelBase.dll de la victime | Pinjectra |
| ALPC Callback | ✓ | Extraction du pid de la victime dans les appels NtConnectPort vers le port ALPC. Pour le tuple pid attaquant-victime, vérification des appels WPM antérieurs et application de la détection de code flottant | Pinjectra |
| WNF Callback | ✓ | WPM suivi d'un appel UpdateWNFStateData | https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | Enregistrement des chemins de modules enregistrés dans le hook NtUserSetWindowsHookEx. Plus tard, lorsqu'un module correspondant à ce chemin se charge dans un processus différent, génération d'une alerte | MInjector |
| GhostWriting | ✓ | Détection si le contexte est défini (NtSetContextThread est appelé) sur un thread précédemment suspendu | Pinjectra |
| Service Control | ✓ | WPM écrasant l'ID de service d'un processus (service) | https://github.com/odzhan/injection/tree/master/svcctrl |
| Shellcode injection | ✓ | Nouveau thread démarré à partir d'un code flottant. Chemin de la DLL écrit par WPM | MInjector |
| Image Mapping | ✓ | Thread démarré à partir d'un code flottant. En-tête PE écrit par WPM. Chemin de la DLL écrit par WPM | MInjector |
| Thread Reuse | ✓ | Thread démarré à partir d'un code flottant. Chemin de la DLL écrit par WPM | MInjector |