Linux下程序执行时如何查看RAM中的内容?

Linux下程序执行时如何查看RAM中的内容?

我想查看程序执行时存储在 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]/memPTRACE_PEEK等一样,您需要类似 root 的权限 ( CAP_SYS_PTRACE) 才能读取不属于您的进程的内存。

相关内容