首页/安全/取证与溯源速查/ps 进程快照与父子关系
Linux 取证135 条

ps 进程快照与父子关系

ps 是进程侧的抓拍手段:按启动时间排序可确认最近拉起的进程,--forest 还原父子链,是判断“谁起了谁”的起点。

取证与溯源速查安全更新于 2026-10-13

ps 在取证中的位置

ps 从 /proc 读取内核维护的进程视图,输出 PID、父进程、属主、启动时间与命令行。它的价值在于两条线索:一是按启动时间排序后,最近被拉起的进程往往对应攻击者的动作时间点;二是父子关系可以还原「谁起了谁」,把 shell、下载器、后门进程串成一条链。ps 是即时快照类证据,进程退出后命令行与父子关系就消失,因此需要尽早采集并落盘。

基本信息

适用平台Linux、BSD、macOS;busybox 环境参数较少
常用组合ps auxww、ps -ef --forest、ps -eo pid,ppid,user,lstart,etime,cmd
排序支持按启动时间、CPU、内存排序,便于定位最近拉起的进程
关联位置/proc/<pid>/ 下的 cmdline、exe、cwd、fd、environ、status
替代工具pstree -p 看树形结构、top 看实时占用、/proc 目录直接抽样
采集建议固定输出字段后再落盘,两次快照可做差集对比

典型使用场景

  • 定位最近拉起的可疑进程,与文件落地时间互相印证
  • 还原父子链:从 Web 服务进程一路向下找到反弹 shell
  • 确认进程真实程序路径,识破改了名字的伪装进程
  • 通过 /proc/<pid>/cwd 找出程序运行目录,进而定位同目录下的其他文件
  • 两次快照取差集,捕捉短生命周期进程
  • 与 ss 配合:把外联连接对应的 PID 落到具体命令行

进程快照采集

进程快照采集
# 固定字段并落盘:含属主、启动时间、已运行时长与完整命令行
ps -eo pid,ppid,user,lstart,etime,cmd --sort=start_time | tail -30
# 树形视图,重点看异常进程挂在哪个父进程下
ps -ef --forest | head -40
# 完整命令行(w 放大宽度,避免长命令被截断)
ps auxww | grep -v grep | head -30
# 逐个核对可疑进程的真实程序与工作目录
ls -l /proc/<pid>/exe; cat /proc/<pid>/cmdline | tr '\0' ' '; ls -l /proc/<pid>/cwd
# 用 /proc 目录列表反查是否有进程未出现在 ps 输出中
ls /proc | grep -E '^[0-9]+$' | wc -l; ps -e --no-headers | wc -l

输出逐列读法

列含义判读要点
PID/PPID进程号与父进程号PPID 为 1 表示被 init 接管,常见于守护化后门;PPID 不存在说明父进程已退出
USER属主账号服务账号出现交互式 shell 命令需重点解释
LSTART/ETIME启动时间与已运行时长启动时间落在入侵窗口内的进程优先排查
CMD命令行(含参数)参数里的 URL、IP、编码串是最直接的线索
TTY关联终端服务进程带 TTY 说明可能是从终端手工拉起
处置前先记录可疑进程的 PID、完整命令行、程序哈希与父子关系。直接 kill 会让内存中的解密密钥、连接信息与行为痕迹一起消失,应先采集再处置。
ps 显示的是 /proc 的内容,内核级后门可能让某些进程不出现在列表里。排查时用 /proc 目录计数与 ps 行数对比,必要时用静态编译的工具或从另一台机器远程读取。

易错点

  • 只做一次快照,短生命周期进程(下载器、反弹 shell)在两次采集之间已消失
  • kill 掉可疑进程后才想起看命令行,进程表已无法复原
  • 把进程名当身份:直接看 comm 字段会被同名伪装欺骗,必须核对 /proc/<pid>/exe 与 cmdline
  • 忽略 PPID 为 1 的进程,守护化后的后门往往看不出明显父进程
  • 两次快照间隔太久,对比结果里混杂大量正常进程启动,差异失去意义

数据来源与参考

  • man 1 ps(procps-ng)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌