svespalec/Faultline

GitHub: svespalec/Faultline

利用工作集页面错误监控与调用栈遍历,检测绕过常规加载器的用户态线程劫持与代码注入行为。

Stars: 4 | Forks: 0

# Faultline 一个通过监控工作集页面错误并遍历可疑线程调用栈来检测从手动映射内存执行行为的反作弊概念验证。 ## 工作原理 Windows 通过工作集监视 API(`InitializeProcessForWsWatch` / `GetWsChangesEx`)按进程跟踪页面错误。每当一页被载入工作集时,操作系统会记录触发错误的指令指针(`FaultingPc`)。 Faultline 轮询这些事件,检查每个 `FaultingPc` 是否落在已知加载的模块内,并标记那些可执行但未在 PEB 中注册任何模块的内存区域中的执行。当检测到可疑错误时,会挂起出错线程并遍历其调用栈以捕获完整的调用链。 这可以捕获通过手动映射、shellcode 注入或其他类似技术注入的代码,这些技术生成的执行内存从未向 Windows 加载器注册。 ``` flowchart LR subgraph Attacker["Attacker (external process)"] A1[Manual map DLL] A2[Write shellcode] A3[SetThreadContext] A4[APC injection] end subgraph Target["Target process"] B[Execution from\nunregistered memory] C[Page fault] D[OS records FaultingPc\nin working set buffer] end subgraph Faultline E[Poll GetWsChangesEx] F{FaultingPc in\nknown module?} G[Suspend thread\n+ stack walk] H[Flagged] end A1 --> B A2 --> B A3 --> B A4 --> B B --> C --> D --> E --> F F -- No --> G --> H F -- Yes --> I[Ignore] ``` ## 捕获用户态线程劫持 这也涵盖线程劫持。如果外部进程通过 `SetThreadContext` / `NtSetContextThread`、APC 注入或类似手段将线程重定向到注入的内存,页面错误仍然会触发。`FaultingPc` 仍然落在任何已知模块之外,Faultline 会捕获它。 实际检测到的是副作用:从未加载模块的内存中执行,而非重定向本身。没有用于上下文变更的内核回调,ETW 可以追踪相关系统调用但最多只是间接的。Faultline 完全跳过拦截问题,仅监视线程最终执行的位置。如果它是未注册的内存并触发了页面错误,就是可见的。 ## 组件 | 目录 | 描述 | |------|------| | `anticheat/` | 核心检测 DLL。监控工作集错误、分类内存区域并遍历调用栈 | | `host/` | 加载检测 DLL 的最小目标进程 | | `injector/` | 手动映射器,将测试载荷注入宿主进程 | | `payload/` | 测试 DLL,从手动映射内存执行以触发检测 | | `shared/` | 公共头文件(日志记录、RAII 句柄、工具函数) | ## 用法 1. 启动 `host.exe` 2. 在另一个终端运行 `injector.exe` 3. 宿主端控制台将记录任何检测到的可疑执行及其堆栈跟踪 注入器支持两种模式: - **远程线程**(默认):`injector.exe` 通过 `CreateRemoteThread` 在宿主进程中创建新线程 - **线程劫持**:`injector.exe --hijack` 通过 `SetThreadContext` 重定向现有宿主线程 两者都会触发检测,但宿主运行一个后台游戏循环线程作为劫持目标 ## 演示 https://github.com/user-attachments/assets/333cd0b7-32e7-4dbb-8cbe-7b2b7125527e ## 限制 - 工作集监视 API 仅在页面首次访问时触发。一旦页面驻留在工作集中,对其后续执行不可见。 - 检测是反应式的。错误被观察到时,注入代码已经执行过。 - 代码洞穴或合法模块内的补丁不会被捕获,因为 `FaultingPc` 会解析为已知模块范围。 - 基于轮询的设计意味着短生命周期的线程可能在堆栈遍历完成前退出。
标签:APC 注入, EDR 绕过, FaultLine, GetWsChangesEx, InitializeProcessForWsWatch, NtSetContextThread, PEB 模块遍历, SetThreadContext, Shellcode 注入, Shell模拟, URL发现, Windows 工作集 API, 云资产清单, 内存注入检测, 反作弊, 可执行内存检测, 安全检测, 工作集页错误监控, 手动映射, 端点可见性, 线程上下文篡改, 线程劫持, 调用栈回溯, 逆向工程, 页替换, 页错误检测