
프로세스 인젝션 기법(셸코드, DLL, 리플렉티브 인젝션 포함)을 실시간 탐지하기 위한 커널 모드 Windows 드라이버로, 시스템 콜 후킹 및 이상 탐지를 제공합니다.
FalconEye는 실시간 프로세스 인젝션을 위한 윈도우 엔드포인트 탐지 소프트웨어입니다. 커널 모드 드라이버로서, 프로세스 인젝션이 발생하는 즉시(실시간으로) 탐지하는 것을 목표로 합니다. FalconEye는 커널 모드에서 실행되므로, 다양한 사용자 모드 후크를 회피하려는 프로세스 인젝션 기술에 대해 더 강력하고 신뢰할 수 있는 방어를 제공합니다.
발표 자료는 2021 Blackhat ASIA Arsenal과 슬라이드에서 확인할 수 있습니다.
아래 표는 다양한 프로세스 인젝션 기술에 대한 구현 상태와 탐지 로직을 보여줍니다. WPM은 WriteProcessMemory를 의미합니다. 탐지를 테스트하려면 참고 문헌 섹션을 참조하세요.
| 기술 | 상태 | 탐지 방법 | POC Used |
|---|---|---|---|
| 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). DLL 경로가 WPM을 통해 작성됨(MInjector). 이전에 일시 중단된 스레드에 컨텍스트가 설정되었는지 탐지(Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | DLL 경로가 WPM을 통해 작성됨 | 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 |

참고: 우리의 초점은 탐지에 있었으며 성능이 뛰어난 탐지 엔진을 만드는 것이 아닙니다. 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는 Apache 2.0 오픈 소스 라이선스에 따라 라이선스가 부여됩니다.
| ✓ |
| ALPC 포트에 대한 NtConnectPort 호출에서 피해자 PID를 추출. 공격자-피해자 PID 쌍에 대해 이전 WPM 호출을 확인하고 플로팅 코드 탐지 적용 |
| Pinjectra |
| WNF Callback | ✓ | WPM 후 UpdateWNFStateData 호출 | https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | NtUserSetWindowsHookEx 후크에 등록된 모듈 경로를 저장. 이후 이 경로와 일치하는 모듈이 다른 프로세스에 로드되면 경고 생성 | MInjector |
| GhostWriting | ✓ | 이전에 일시 중단된 스레드에 컨텍스트가 설정되었는지(NtSetContextThread 호출) 탐지 | Pinjectra |
| Service Control | ✓ | WPM이 프로세스(서비스)의 Service ID를 덮어씀 | https://github.com/odzhan/injection/tree/master/svcctrl |
| Shellcode injection | ✓ | 플로팅 코드에서 시작된 새 스레드. DLL 경로가 WPM에 의해 작성됨 | MInjector |
| Image Mapping | ✓ | 플로팅 코드에서 시작된 스레드. PE 헤더가 WPM에 의해 작성됨. DLL 경로가 WPM에 의해 작성됨 | MInjector |
| Thread Reuse | ✓ | 플로팅 코드에서 시작된 스레드. DLL 경로가 WPM에 의해 작성됨 | MInjector |