第4章:进程与线程监控:进程创建与终止、线程注入检测、父子进程关系
4.1 进程创建:EDR的第一道防线
进程创建,说白了就是操作系统里“生孩子”的过程。每次你双击一个exe,或者命令行里敲个notepad,背后都是CreateProcess这个API在干活。EDR监控进程创建,其实就是在监控这个API的调用。
我个人习惯把进程创建分成三个阶段:
- 触发阶段:用户或程序发起创建请求
- 执行阶段:操作系统分配PID、加载镜像、初始化线程
- 回调阶段:EDR的驱动层捕获到创建事件,上报给分析引擎
嗯,这里要注意:EDR不是在进程创建完才去查,而是在创建过程中就截获了。为什么?因为一旦进程跑起来,恶意代码可能已经执行了。我在项目中遇到过,有些勒索软件在创建后0.1秒就开始加密文件,等你事后分析,黄花菜都凉了。
核心监控点:
- 进程路径(是不是从临时目录启动的?)
- 命令行参数(有没有可疑的base64字符串?)
- 父进程是谁(word.exe启动powershell?这不对劲)
- 创建时间(半夜三点创建进程?值得怀疑)
4.2 进程终止:不只是“关掉”那么简单
进程终止看起来简单——点个叉就完了。但在安全视角下,终止行为往往藏着猫腻。
你想想看,正常程序退出会走ExitProcess,清理资源、通知父进程。但恶意软件呢?它可能直接调用TerminateProcess强行杀掉自己,或者被EDR干掉后留下一堆内存残骸。
我曾经处理过一个案例:攻击者用taskkill /f /im svchost.exe试图干掉安全进程。结果呢?EDR捕获到了这个异常终止请求,发现目标进程根本不是svchost(真正的svchost有数字签名),而是一个伪装成系统进程的恶意样本。嗯,这就是监控终止行为的意义。
避坑指南:我曾经以为进程终止后就没啥可查了。后来发现,有些恶意软件会在终止前把敏感数据写入注册表或文件。所以,EDR不仅要监控“谁杀了谁”,还要关联终止前后的文件、注册表操作。
4.3 线程注入检测:藏在合法进程里的“幽灵”
线程注入,是攻击者最爱的技术之一。说白了,就是把自己的代码塞进一个合法进程里执行。你想想看,如果恶意代码跑在explorer.exe或svchost.exe里,安全软件敢随便杀吗?杀了系统就崩了。
常见的注入手法有这几种:
| 注入手法 | 原理 | EDR检测方式 |
|---|---|---|
| DLL注入 | 用CreateRemoteThread加载恶意DLL |
监控跨进程的CreateRemoteThread调用 |
| APC注入 | 把恶意代码塞进线程的APC队列 | 检测异常的QueueUserAPC调用 |
| 进程镂空 | 把合法进程的内存替换成恶意代码 | 监控NtUnmapViewOfSection和WriteProcessMemory |
| 反射式DLL注入 | 不依赖LoadLibrary,自己加载DLL |
检测内存中异常的PE头 |
我个人觉得,最难检测的是APC注入。为什么?因为APC是操作系统正常机制,很多合法程序也会用。我曾经在攻防演练中,攻击者就是用APC注入绕过了某款EDR,直到我们手动分析内存转储才抓到。
注意:不是所有跨进程操作都是恶意的。比如调试器、输入法、杀毒软件本身也会用CreateRemoteThread。EDR需要做白名单和基线学习,否则误报能把你淹死。
4.4 父子进程关系:谁生了谁,很重要
父子进程关系,是EDR分析中最基础也最有效的特征。你想想看,一个正常的word.exe,它的子进程应该是谁?可能是eqnedt32.exe(公式编辑器),但绝不应该是powershell.exe或cmd.exe。
我整理了一个常见的“可疑父子关系”清单:
- Office进程 → PowerShell:大概率是宏病毒
- 浏览器 → cmd.exe:可能是钓鱼下载
- PDF阅读器 → 脚本解释器:可能是漏洞利用
- 系统服务 → 网络连接工具:可能是后门
嗯,这里有个坑:攻击者会通过“进程链混淆”来绕过。比如,先用word启动一个合法的regsvr32.exe,再用regsvr32启动powershell。这样父子关系就变成了word→regsvr32→powershell,看起来没那么可疑。
我的经验:不要只看直接父子关系,要看整个进程链。EDR应该能回溯到最顶层的父进程。我曾经追过一个APT攻击,从powershell一路回溯到钓鱼邮件里的word文档,靠的就是完整的进程树。
4.5 知识体系总览
下面这张图,是我自己梳理的进程与线程监控知识体系。你可以把它当成一张地图,随时回来对照。
4.6 实战中的避坑指南
最后,分享几个我踩过的坑:
- 别信进程名:
svchost.exe不一定是系统进程,notepad.exe也可能是伪装的。一定要校验数字签名和路径。 - 注意进程链深度:有些攻击者会通过多层跳转来隐藏真实意图。我建议EDR至少保留5层父子关系。
- 线程注入不只看API:有些高级注入手法不用
CreateRemoteThread,而是用SetThreadContext或RtlCreateUserThread。监控面要广。 - 误报是常态:杀毒软件、调试器、系统更新都会产生大量跨进程操作。一定要做好白名单和基线学习。
一句话总结:进程与线程监控,说白了就是回答三个问题——谁生了谁?谁杀了谁?谁在谁的肚子里搞事情?把这三个问题搞清楚了,大部分恶意行为都藏不住。