Windows下如何记录进程及其子进程发起的所有CreateProcess调用
Windows平台追踪进程CreateProcess调用的CLI方案
有两类成熟的命令行方案可以实现和Linux下strace ./myprogram | grep CreateProcess > log完全一致的效果,都能自动追踪build.bat及其所有层级派生进程的进程创建调用:
- 轻量直连方案(最贴合Linux使用习惯)
直接使用Windows平台移植的strace命令行工具,使用逻辑和Linux版本完全一致,加-f参数即可自动跟踪所有子进程,执行一行命令就能完成日志采集:
命令执行完后生成的log文件,和你在Linux下拿到的输出格式基本一致,会按调用顺序列出所有CreateProcess调用的发起进程、参数、返回值信息。strace -f build.bat | findstr CreateProcess > log - 微软官方工具方案(无兼容问题)
用微软Sysinternals套件里的procmon命令行模式,不需要做适配,稳定性最高:- 管理员身份打开命令行,先启动后台追踪,指定要跟踪的初始进程为build.bat,会自动关联追踪其所有派生进程:
procmon /Quiet /Minimized /BackingFile trace_raw.pml /IncludeProcesses build.bat - 等build.bat及所有子进程执行完毕后,执行过滤导出命令,只保留CreateProcess类事件:
procmon /OpenLog trace_raw.pml /SaveAs log.csv /Filter "Operation","is","Process Create","Include"
- 管理员身份打开命令行,先启动后台追踪,指定要跟踪的初始进程为build.bat,会自动关联追踪其所有派生进程:
- 系统原生无额外安装方案
不想下载任何外部工具的话,可以直接用Windows自带的ETW内核事件追踪功能,全程用系统内置命令完成:- 管理员身份启动进程创建事件追踪会话:
logman start proc_trace -p Microsoft-Windows-Kernel-Process 0x10 -ets -o trace_raw.etl - 正常运行你的build.bat脚本,所有执行流程跑完后停止追踪:
logman stop proc_trace -ets - 把二进制追踪日志转成可读文本,过滤出进程创建事件:
tracerpt trace_raw.etl /of CSV /o trace_full.csv findstr /C:"ProcessStart" trace_full.csv > log
- 管理员身份启动进程创建事件追踪会话:
注意:涉及内核级进程事件采集的操作,都需要用管理员权限启动命令行窗口执行,否则会因为权限不足拿不到完整的事件数据。
内容的提问来源于stack exchange,提问作者warchantua
相关产品推荐
相关产品推荐

