maps 里能看到什么
/proc/PID/maps 列出进程的全部内存映射段,每行包含地址范围、权限、偏移、设备与文件路径。出现 /tmp、/dev/shm 下的 .so,或带执行权限的匿名段,是用户态劫持与内存马的典型信号。
怎么用最有价值
maps 适合与 ld.so.preload、进程环境变量联动核查:先从映射发现异常库,再顺着 /etc/ld.so.preload 与 environ 找到注入来源,最后核对库文件哈希与来源包。
基本信息
| 查看 | cat /proc/<PID>/maps |
|---|---|
| 字段 | 地址范围、权限、偏移、设备、inode、路径 |
| 可疑点 | 匿名可执行段、非系统路径的 .so |
| 关联文件 | /etc/ld.so.preload、/proc/PID/environ |
| 权限要求 | root 或同用户可读 |
| 进阶 | /proc/PID/smaps 提供更细的内存占用信息 |
典型使用场景
- 排查用户态劫持与内存马
- 确认进程加载了哪些非常规库
- 与 ld.so.preload 联动定位全局注入源
- 分析进程崩溃或异常行为的库依赖
- 取证时记录进程内存映射清单
过滤非标准路径的库
过滤非标准路径的库
awk '{print $6}' /proc/1234/maps | sort -u | grep -vE '^$|^/(usr|lib|lib64)' | head -n 30
grep -E 'rwxp' /proc/1234/maps | grep -E '/tmp|/dev/shm|/var/tmp' | head
awk '$2 ~ /x/ && $6 == "" {print}' /proc/1234/maps | head -n 10 # 可执行匿名段
ls -l /proc/1234/exe /proc/1234/cwd
cat /proc/1234/maps | grep '(deleted)' | head逐列读法
| 字段 | 含义 | 正常/异常 |
|---|---|---|
| 权限位 | r/w/x/p 组合 | 出现 rwxp 这种可写可执行组合需要解释 |
| 路径 | 被映射的库或文件 | 指向 /tmp、/dev/shm 需重点核查 |
| 匿名段 | 无路径的可执行映射 | 少数运行时正常使用,可疑进程中出现需追查 |
| inode | 映射文件的 inode 号 | 为 0 表示匿名段,非 0 可据此定位文件 |
匿名可执行段不总是恶意:部分运行时(如 JIT 引擎)会正常使用;判定要结合进程身份、启动时间与整体行为,而不是只看一行映射。
标记为 (deleted) 的映射说明文件已被删除但仍在运行:这是恢复被删库与溯源的重要材料,动手清理前先把它从 /proc/PID/map_files 复制出来。
分析顺序建议:先把映射中的文件路径去重,再筛出非标准路径,最后逐个核对来源与哈希;直接通读完整输出容易在几百行里迷路。
关联检查清单
- 检查 /etc/ld.so.preload 是否引用该库
- 检查进程 environ 中的 LD_PRELOAD 与 LD_LIBRARY_PATH
- 核对库文件哈希与包管理器归属
- 记录库文件创建时间与入侵时间窗的关系