我想查看程序执行时存储在 RAM 中的内容。我已经使用过cat /proc/[pid]/meminfo
,但它只提供了地址和权限模式详细信息。我也尝试过pmaps -X pid
,除了数据之外,它提供了太多细节。如何查看RAM上加载的内容?
答案1
/proc/[pid]/mem
允许您访问进程的虚拟内存。
该文件中的偏移量对应于虚拟地址。/proc/[pid]/maps
告诉您哪些地址范围由实际内存支持(以及内存本身由文件支持)。
所有这些都记录在过程(5)联机帮助页。
进程只能访问与其自身在同一用户下运行且未设置gid/uid 的进程的内存。过去的情况是你必须ptrace()一个进程,以便通过 访问其内存/proc/[pid]/mem
,但这是不再真实很长一段时间以来(更准确地说,自从这犯罪从 2012 年 1 月开始(v3.2+),其目的是修复一个安全错误,也在 lwn 中进行了编辑文章)。
实际例子
在终端窗口中:
% echo $$ # show our pid
6744
% read -sp 'secret pasword: '; echo
secret pasword:
%
然后在另一个终端窗口中:
% grep heap /proc/6744/maps
01bb7000-01c3e000 rw-p 00000000 00:00 0 [heap]
% dd if=/proc/6744/mem bs=1 skip=$((0x01bb7000)) count=$((0x01c3e000-0x01bb7000)) status=none |
strings | less
...
% dd if=/proc/6744/mem bs=1 skip=$((0x01bb7000)) count=$((0x01c3e000-0x01bb7000)) status=none |
strings | grep qwerty
qwertyuiop # here is the "secret password"
人们通常使用调试器gdb
来查看正在运行的进程的内存,而不是像这样的基本方法(调试器知道进程使用的结构的格式,可以跟踪指针、列表等),但原理基本上是相同的。
最近的 linux 内核也有更好的界面/proc/[pid]/mem
,而不是像process_vm_readv
。就像/proc/[pid]/mem
或PTRACE_PEEK
等一样,您需要类似 root 的权限 ( CAP_SYS_PTRACE
) 才能读取不属于您的进程的内存。