第三期:动态行为监控与 API Hooking —— EDR 的“眼睛”与绕过思路

📅 2026/6/20 18:41:37
第三期:动态行为监控与 API Hooking —— EDR 的“眼睛”与绕过思路
引言静态特征可以被抹去文件可以被加密但只要程序想要运行、想要注入、想要联网它就必须在内存中执行动作。本期我们将深入 Windows 内核与用户态的交界处解析 EDR 是如何通过Hook钩子​ 监控一切的以及攻击者常用的Direct Syscalls​ 等绕过原理。一、为什么静态不够动态才是王道作为防御者你必须明白一个铁律代码如果不运行就没有危害一旦运行就必然留下痕迹。监控层级能看到什么代表工具内核层 (Kernel)​进程创建、线程创建、驱动加载、注册表回调Windows ETW, Sysmon, EDR Kernel Driver用户层 (User Mode)​API 调用参数、内存读写、网络连接详情API Monitor, User-mode Hooks二、EDR 的核心武器API Hooking用户态钩子大多数 EDR 并不会直接拦截内核而是通过在用户态插入DLL如EdrClient.dll​ 来实现监控。1. IAT Hooking导入表挂钩原理修改程序的导入地址表IAT。当程序调用CreateFile时实际上跳转到了 EDR 的代码。检测信号在调试器中看到CreateFile指向的不是kernel32.dll而是一个陌生的 DLL。2. Inline Hooking内联挂钩原理直接修改 API 函数开头的前 5-12 个字节改为JMP指令强行劫持执行流。目的EDR 可以检查参数。例如如果发现VirtualAlloc申请的内存属性是RWX立即阻断。3. 防御者视角如何确认被 Hook你可以使用Process Explorer​ 或API Monitor​ 查看进程的模块和钩子。现象某些关键 API 的入口点代码显示为jmp qword ptr [xxxx]。三、攻击者的反制Unhooking 与 Syscall既然 EDR 盯着 API攻击者就决定不调用 API或者绕过 API 直接找系统内核。1. Unhooking脱钩原理从磁盘重新读取干净的ntdll.dll文件覆盖当前内存中被 EDR Hook 了的代码。防御信号检测到进程对ntdll.dll的内存区域进行了写操作WriteProcessMemory或自写。2. Direct Syscalls直接系统调用这是现代免杀的灵魂技术。背景Windows API 调用链通常是User App - ntdll.dll - syscall - kernel。EDR 监控的是ntdll.dll。绕过攻击者直接在代码中硬编码syscall指令跳过ntdll.dll。工具参考SysWhispers2用于生成系统调用存根。防御者笔记Direct Syscalls 会让 EDR 失去 API 参数上下文。例如你只知道程序发起了NtWriteVirtualMemory但不知道它具体写了什么内容。3. Hells Gate / Halos Gate原理动态寻找系统调用号Syscall Number避免在代码中硬编码防止 YARA 规则匹配。四、防御实战Sysmon 配置与 Sigma 规则作为网安工程师你无法阻止 Hooking 的绕过但你可以通过行为关联来发现异常。1. 监控“可疑的 API 调用序列”单一 API 不可怕组合拳才致命。高危行为组合VirtualAlloc(申请内存) WriteProcessMemory(写入内存) CreateRemoteThread(创建远程线程)。2. Sysmon 配置示例请确保你的 Sysmon 监控了Event ID 8 (CreateRemoteThread)​ 和Event ID 10 (Process Access)。Sysmon schemaversion4.50 EventFiltering !-- 监控进程注入行为 -- RuleGroup nameSuspicious Injection groupRelationor CreateRemoteThread onmatchinclude TargetImage conditionend withexplorer.exe/TargetImage TargetImage conditionend withsvchost.exe/TargetImage /CreateRemoteThread /RuleGroup /EventFiltering /Sysmon3. Sigma 规则示例检测 Direct Syscall 行为虽然难以直接检测 Syscall但可以检测异常的内存属性。yamltitle: 检测 RWX (Read-Write-Execute) 内存分配 logsource: category: process_access detection: selection: CallTrace|contains: unknown GrantedAccess: 0x1FFFFF # 所有可能的权限 condition: selection level: high五、工具实操Process Monitor 深度使用ProcMon​ 是你最好的朋友。设置过滤器Operation is CreateRemoteThread then Include。观察细节Source: 谁发起的如powershell.exeTarget: 注入了谁如lsass.exeResult: 成功了还是被拦截了六、总结与下期预告本期我们揭示了 EDR 如何通过Hooking​ 监控动态行为以及攻击者如何通过Direct Syscalls​ 试图“隐身”。请记住防御者不需要堵住所有的 Syscall 漏洞只需要监控 Syscall 之后的异常行为如 LSASS 转储。下期预告第四期无文件攻击与内存驻留Fileless Attacks。我们将聚焦于Reflective DLL Injection​ 和Process Hollowing进程镂空。你将学会如何在没有文件落地的情况下检测潜伏在svchost.exe体内的恶意代码。 思考题如果一个程序调用了NtAllocateVirtualMemory并在lsass.exe中写入了数据但没有触发CreateRemoteThread它可能使用了什么技术提示考虑 APC 注入或早鸟注入。