终端防御规避技术-3.进程与线程创建通知

EDR 在内核里订阅了两类事件:进程创建和线程创建。事件一发生,它就能拿到程序的路径、命令行,以及是谁启动的。攻击者要做的,要么是让这些字段变成假的,要么是让事件根本不发生。这一章讲的是第一类传感器,第四章讲的是另一类:谁打开了谁、拿到了什么权限。

1. 通知发生在哪一层

用户态
  CreateProcessW  /  NtCreateThreadEx
        |
        | syscall
        v
内核
  建立 EPROCESS / ETHREAD,映射映像
        |
        | 遍历全局回调链
        v
  进程创建通知 / 线程创建通知
        |
        v
  主线程执行第一条指令

回调的窗口在"对象已经存在、代码还没开始运行"之间。EDR 在这个窗口里能读到映像路径、命令行、父进程,也能直接拒绝创建;攻击者拿到进程句柄后,同样能在这个窗口里改内存、改入口、排队 APC。

回调的工作方式更像小区门口的报警器:物业(内核)装上它之后,只要有人搬进来(创建进程),它就把"谁搬来的、住哪一户、从哪个门进"报给保安(EDR)。报警器不拦人,只报信;拦不拦、怎么拦,是保安后面的事。

回调不是 Hook
Hook 是在别人家门口挖个坑,改的是代码路径;回调是在门口装个门铃,只订阅事件。回调不碰 ntdll 的字节,所以 Unhook、直接系统调用、重新映射 ntdll 都绕不过它;但回调只能拿到内核传进来的字段,看不到用户态接下来要执行什么。

参与讨论