FalconEye是一款针对Windows端点的实时进程注入检测软件。它是一个内核模式驱动程序,旨在实时捕获进程注入(实时进行)。由于FalconEye运行在内核模式下,它针对试图逃避各种用户模式挂钩的进程注入技术提供了更强且可靠的防御。
您可以查看我们在2021 Blackhat ASIA Arsenal上的演示以及幻灯片。
下表展示了各类进程注入技术的实现状态和检测逻辑。WPM代表WriteProcessMemory。如需测试检测功能,可参考参考文献部分。
| 技术 | 状态 | 检测逻辑 | 使用的POC |
|---|---|---|---|
| Atombombing | ✓ | 挂钩QueueUserAPC并查找GlobalGetAtom系列函数 | Pinjectra |
| Instrumentation callback injection | ✓ | 检测新线程是否从浮动代码中创建 | https://github.com/antonioCoco/Mapping-Injection |
| Reflective DLL Injection | ✓ | 检测新线程是否从浮动代码中创建,以及PE头是否正被写入目标进程 | MInjector |
| PROPagate | ✓ | 挂钩SetProp以获取正在写入的属性的地址,并与之前的WPM调用关联以获取浮动代码的地址 | Pinjectra |
| Process Hollowing | ✓ | 通过检测PE头被写入目标进程内存来发现 | MInjector |
| CreateRemoteThread with LoadLibrary | ✓ | 新线程的起始地址指向LoadLibrary。MInjector版本还会使用WPM写入DLL路径,该操作也会被检测 | MInjector, Pinjectra |
| CreateRemoteThread with MapViewOfFile | ✓ | 检测新线程是否从浮动代码中创建 | Pinjectra |
| Suspend-Inject-Resume | ✓ | 检测新线程是否从浮动代码中创建(MInjector)。通过WPM写入DLL路径(MInjector)。检测先前挂起的线程上是否设置了上下文(Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | 通过WPM写入DLL路径 | MInjector |
| QueueUserAPC with memset (Stackbombing) | ✓ | 挂钩QueueUserAPC并查找memset | Pinjectra |
| SetWindowLong (Extra window memory injection) | ✓ | 挂钩SetWindowLong以获取正在写入的函数指针的地址,并与之前的WPM调用关联以获取浮动代码的地址 | Pinjectra |
| Unmap + Overwrite | ✓ | 若攻击者进程正在从目标进程中取消映射ntdll,则发出警报 | Pinjectra |
| Kernel Ctrl Table | ✓ | 检测WPM是否正在覆盖目标PEB中的KernelCallbackTable字段 | https://github.com/odzhan/injection/blob/master/kct |
| USERDATA | ✓ | 检查WPM目标地址是否在conhost.exe范围内。如果是,则检查conhost中相关的函数指针是否与先前存储的WPM地址匹配 | https://github.com/odzhan/injection/blob/master/conhost |
| Ctrl-inject | ✓ | 检测攻击者是否在目标的KernelBase.dll范围内执行WPM | Pinjectra |
| ALPC Callback | ✓ | 在NtConnectPort调用中提取目标进程ID以连接ALPC端口。对于攻击者-目标进程ID元组,检查之前的WPM调用并应用浮动代码检测 | Pinjectra |
| WNF Callback |

注意:我们的重点是检测,而非创建一个高性能的检测引擎。我们将在BlackHat演示之后继续这些努力。
.
├── src
│ ├── FalconEye ---------------------------# FalconEye用户和内核空间
│ └── libinfinityhook ---------------------# 内核挂钩实现
├── 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 notification facility, 2018
A paradox: Writing to another process without opening it nor actually writing to it, 2007
Windows process injection: Service control handler, 2018
FalconEye 根据 Apache 2.0 开源许可证授予您使用权限。
| ✓ |
| WPM后调用UpdateWNFStateData |
| https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | 保存NtUserSetWindowsHookEx挂钩中注册的模块路径。当匹配此路径的模块在不同进程中加载时,生成警报 | MInjector |
| GhostWriting | ✓ | 检测在先前挂起的线程上是否设置了上下文(调用了NtSetContextThread) | Pinjectra |
| Service Control | ✓ | WPM覆盖进程(服务)的服务ID | https://github.com/odzhan/injection/tree/master/svcctrl |
| Shellcode injection | ✓ | 新线程从浮动代码启动。通过WPM写入DLL路径 | MInjector |
| Image Mapping | ✓ | 线程从浮动代码启动。通过WPM写入PE头。通过WPM写入DLL路径 | MInjector |
| Thread Reuse | ✓ | 线程从浮动代码启动。通过WPM写入DLL路径 | MInjector |