首页 > 编程语言 >内存映射中指定文件路径的起始地址段提取

内存映射中指定文件路径的起始地址段提取

来源:互联网 2026-07-14 08:08:10

针对进程内存映射文件/proc/[pid]/maps中同一文件对应多个不连续地址段的问题,提出增强型正则表达式,精确匹配并提取每个文件路径首次出现的起始地址段,确保地址格式合法、结构完整,支持符号解析与内存分析。

从事逆向分析、调试或自动化内存取证的开发者,通常需要与 /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 实现示例

在 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 位十六进制(如 7f8b3a123000-7f8b3a124000),需将 {8} 改为 {16},并启用 re.ASCII 模式。
  • 不要依赖行序稳定性/proc/[pid]/maps 的顺序由内核决定,但同一文件的首次映射通常是其可执行段(r-xp)。因此该正则优先匹配 r-xp 行,也可以在权限组后添加 (=r-xp) 正向先行断言来进一步强化匹配。

借助这套方案,无论是 Shell、Python、Perl 还是其他支持 PCRE 的工具,均可一键提取各动态库和二进制文件的基地址段。这对于符号解析、内存补丁或崩溃分析而言,是非常可靠的输入数据。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。