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: %d\n", 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










