
本文介绍如何使用正则表达式从 Linux /proc/[pid]/maps 类输出中精准匹配每个共享库或可执行文件首次出现的内存地址范围(即首行映射地址),适用于逆向分析、调试和自动化内存取证场景。
本文介绍如何使用正则表达式从 linux `/proc/[pid]/maps` 类输出中精准匹配每个共享库或可执行文件首次出现的内存地址范围(即首行映射地址),适用于逆向分析、调试和自动化内存取证场景。
在 Linux 进程内存映射(如 /proc/[pid]/maps)输出中,同一文件可能被映射到多个不连续的内存区域(例如代码段 r-xp、数据段 rw-p、只读数据段 r--p 等)。若需为每个唯一文件路径提取其首次出现的内存地址范围(即该文件在映射列表中第一次被加载的起始地址段),仅靠简单匹配行尾路径是不够的——必须确保匹配的是该路径的首条记录,且地址格式合法、结构完整。
推荐使用以下增强型正则表达式(兼容 PCRE/Python/JavaScript 等主流引擎):
^([a-f0-9]{8}-[a-f0-9]{8})\s+[rwxp-]{4}\s+[a-f0-9]{8}\s+[a-f0-9]{2}:[a-f0-9]{2}\s+\d+\s+(\/(?:bin|lib|usr\/lib|etc|sbin|opt\/.*|var\/lib)\/[^[:space:]]+)$✅ 关键设计说明:
- ^([a-f0-9]{8}-[a-f0-9]{8}):捕获 8 位十六进制起始地址 + - + 8 位结束地址(如 b3f35000-b3f36000),严格限定长度,避免误匹配长哈希或 UUID;
- \s+[rwxp-]{4}:匹配权限字段(如 r-xp),支持任意顺序但要求恰好 4 个字符;
- \s+[a-f0-9]{8}:匹配 offset 字段(8 位十六进制);
- \s+[a-f0-9]{2}:[a-f0-9]{2}:匹配 device 字段(主次设备号);
- \s+\d+:匹配 inode 编号;
- \s+(\/(?:...)\S+):路径部分采用 \S+ 替代模糊的 [^.]*,更鲁棒地支持含多级点号的文件名(如 libcrashlog.so.0.0.0),同时限定路径以 / 开头、不含空白符。
? 使用示例(Python):
import re
text = """7d60f000-7d67b000 r-xp 00000000 fb:00 11 /bin/busybox.nosuid
7d68b000-7d68c000 r--p 0006c000 fb:00 11 /bin/busybox.nosuid
...
b3f47000-b3f5d000 r-xp 00000000 fb:00 1628 /lib/ld-2.31.so"""
pattern = r'^([a-f0-9]{8}-[a-f0-9]{8})\s+[rwxp-]{4}\s+[a-f0-9]{8}\s+[a-f0-9]{2}:[a-f0-9]{2}\s+\d+\s+(\/(?:bin|lib|usr\/lib|etc|sbin|opt|var\/lib)\/\S+)$'
matches = {}
for line in text.splitlines():
m = re.match(pattern, line.strip())
if m:
addr, path = m.groups()
# 仅保留每个路径的首次匹配(自动去重)
if path not in matches:
matches[path] = addr
for path, addr in matches.items():
print(f"{path} → {addr}")⚠️ 注意事项:
- 该正则默认区分大小写,而实际 /proc/maps 中地址均为小写,建议添加 re.IGNORECASE 标志以增强兼容性(尽管输入通常全小写);
- 路径白名单 (?:bin|lib|usr/lib|...) 可根据目标系统扩展(如加入 home/username/.local/lib),避免匹配伪文件(如 [heap]、[stack]、[vdso]);
- 若需处理 64 位系统(地址为 16 进制 16 位,如 7f8b3a123000-7f8b3a124000),应将 {8} 改为 {16} 并启用 re.ASCII 模式;
- 不可依赖行序稳定性:/proc/[pid]/maps 的顺序由内核决定,但同一文件的首次映射始终是其可执行段(r-xp),因此本正则优先匹配 r-xp 行(可通过在权限组后加 (?=r-xp) 正向先行断言进一步强化)。
通过此方案,你可在 Shell、Python、Perl 或任何支持 PCRE 的工具中一键提取各动态库/二进制文件的基地址段,为符号解析、内存补丁或崩溃分析提供可靠输入。

















