用 /proc 定位真实程序
/proc/<pid>/ 目录下有几个符号链接直接指向进程的真实身份:exe 指向可执行文件,cwd 指向当前工作目录,root 指向进程看到的根目录,fd 目录里是打开的文件与套接字。命令行参数可以伪装,进程名可以改成任意字符,但 exe 指向的文件路径不会跟着变。程序本体被删除后,链接目标会带上 (deleted) 标记——这本身就是重要线索,而且仍可以从该链接把可执行内容复制出来做哈希与逆向。
基本信息
| 路径 | /proc/<pid>/exe、cwd、root、cmdline、environ、fd/、maps、status |
|---|---|
| 查看方式 | ls -l 看链接目标,readlink -f 取绝对路径 |
| 权限要求 | 读取其他用户进程的这些链接通常需要 root |
| 删除标记 | 链接目标带 (deleted) 表示程序本体已被删除 |
| 复制方法 | 从 /proc/<pid>/exe 直接复制可执行内容,注意异常进程可能拒绝读取 |
| 关联信息 | /proc/<pid>/maps 可发现被删除的动态库与内存映射 |
典型使用场景
- 确认可疑进程真正执行的是哪个文件,而非它的显示名称
- 定位程序所在目录,进而在同目录下发现配套脚本与配置文件
- 对已删除的可执行文件做哈希与留存,保留逆向分析的样本
- 通过 cwd 判断进程的运行上下文(例如从 /tmp 启动)
- 检查打开的 socket 与文件描述符,关联外联行为
- 在容器环境中确认进程视角下的根目录范围
查看与提取
查看与提取
# 取进程的真实程序路径与工作目录
ls -l /proc/1234/exe /proc/1234/cwd /proc/1234/root
readlink -f /proc/1234/exe
# 完整命令行与环境变量(注意 environ 可能含敏感信息)
tr '\0' ' ' < /proc/1234/cmdline; echo
tr '\0' '\n' < /proc/1234/environ | head
# 程序本体已删除时,链接目标会带 (deleted),仍可复制留存
ls -l /proc/1234/exe
cp /proc/1234/exe /evidence/bin.1234 2>/dev/null && sha256sum /evidence/bin.1234
# 查看打开的文件与套接字
ls -l /proc/1234/fd | head -20
# 内存映射里可发现已删除的动态库
awk '{print $6}' /proc/1234/maps | sort -u | head -20链接与文件逐项读法
| 对象 | 含义 | 判读要点 |
|---|---|---|
| exe | 可执行文件路径 | 带 (deleted) 说明本体已删,仍可复制留存 |
| cwd | 当前工作目录 | 从 /tmp 或 /dev/shm 启动值得重点核查 |
| root | 进程视角的根目录 | 容器内通常不是宿主机的 /,可用于判断隔离范围 |
| cmdline | 完整命令行参数 | 参数里的地址、路径与编码串是直接线索 |
| fd/ | 打开的文件与套接字 | 可关联外联连接与被写入的文件 |
| maps | 内存映射的文件 | 包含已删除的库文件,常见于内存加载场景 |
从 /proc/<pid>/exe 复制文件前先确认权限与进程稳定性:异常进程可能拒绝读取或立即退出。必要时先做内存采集,再尝试提取可执行文件。
内核线程没有 exe 链接,遇到空链接先确认进程类型,再判断是否异常。同时注意容器内进程的 /proc 视图与宿主机不同,采集时要在正确的命名空间里执行。