linux 隐藏进程主要通过内核模块或直接篡改内核数据结构实现,发现方法包括:交叉验证 /proc 与 ps 输出、遍历内核任务链表(crash/systemtap)、检查调度调试信息、监控异常系统调用与网络行为(如无 pid 监听端口)、审计内核模块完整性。

Linux 系统中隐藏进程通常通过内核模块(如 rootkit)或直接操作内核数据结构实现,绕过标准命令(如ps、top、ls /proc)的检测。发现它们的关键在于:不依赖用户态工具的输出,而是从底层数据源交叉验证,关注异常行为与内核一致性。
检查 /proc 目录与进程列表是否匹配
/proc是内核提供进程信息的虚拟文件系统,但部分 rootkit 会 hook 内核函数(如 getdents64),让ls /proc 跳过特定 PID 目录。需手动遍历并比对:
- 运行
ls -l /proc | grep '^d' | wc -l统计目录数,再用ps aux | wc -l对比——若/proc目录明显多于ps显示的进程数,可能有进程被隐藏 - 用
find /proc -maxdepth 1 -name '[0-9]*' -type d | wc -l避免ls被劫持的影响 - 对可疑 PID(如数字很大但无对应
ps条目),尝试cat /proc/PID/status或ls -l /proc/PID/exe——若返回“Permission denied”或“No such file”,需警惕(正常情况应可读或明确报错“No such process”)
比对内核任务链表与 /proc 数据
内核中所有进程以双向链表形式存在于 init_task(PID=0)的tasks 成员中。用户态工具无法直接访问,但可通过以下方式间接验证:
- 使用
crash工具(需 vmlinux和内存转储):加载 core 后执行ps -G,它遍历真实 task_struct 链表,可发现ps漏掉的进程 - 无 dump 时,用
systemtap脚本遍历init_task.tasks(需内核调试符号):
probe kernel.function(“iterate_processes”) {printf(“PID: %dn”, pid) }
输出结果与ps比对 - 检查
/sys/kernel/debug/sched_debug(需 debugfs 挂载且开启调度调试):其中的rq队列包含所有就绪 / 运行态 task,可人工检索异常 PID
监控系统调用与网络异常行为
隐藏进程常伴随异常系统调用模式或网络活动,即使进程名不可见,其行为仍可捕获:
- 用
auditctl监控敏感调用:auditctl -a always,exit -F arch=b64 -S execve,openat,connect,再查ausearch -m execve -i看是否有无主进程的执行记录 - 用
ss -tunlp和netstat -tunlp对比端口监听者——若存在监听端口但无对应 PID/ 进程名(显示“-”或“????”),极可能被隐藏 - 检查 raw socket 使用:
cat /proc/net/packet中若出现非 root 用户创建的 PACKET_RX_RING,结合lsof -i缺失条目,提示隐蔽网络后门
检查内核模块与系统完整性
大多数隐藏技术依赖恶意内核模块(LKM),因此模块审计是关键入口:
- 运行
lsmod,对照正常系统模块列表,识别未知 / 混淆名称模块(如ip_tables被替换成iptbls) - 检查
/lib/modules/$(uname -r)/kernel/下模块签名(若启用 module signing):modinfo -n module_name | xxd -p | head -c 128比对哈希 - 用
dkms status查看第三方模块状态;用cat /proc/kallsyms | grep "t syscall" | wc -l统计系统调用表项——若少于预期(通常约 330+),说明 syscall table 被 hook






























