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

ada*_*mar 2 linux rhel ram

我想查看程序执行时存储在 RAM 中的内容。我已经使用过cat /proc/[pid]/meminfo,但它只提供了地址和权限模式详细信息。我也尝试过pmaps -X pid,除了数据之外,它提供了太多细节。如何查看RAM上加载的内容?

小智 6

/proc/[pid]/mem允许您访问进程的虚拟内存。

该文件中的偏移量对应于虚拟地址。/proc/[pid]/maps告诉您哪些地址范围由实际内存支持(以及内存本身由文件支持)。

所有这些都记录在proc(5)联机帮助页中。

进程只能访问与其自身在同一用户下运行且未设置gid/uid 的进程的内存。过去的情况是,您必须ptrace()一个进程才能通过 访问其内存/proc/[pid]/mem,但很长一段时间以来这种情况不再正确(更准确地说,自 2012 年 1 月提交以来(v3.2+),其目的是修复一个安全错误,也在 lwn文章中进行了社论)。

实际例子

在终端窗口中:

% echo $$ # show our pid
6744
% read -sp 'secret pasword: '; echo
secret pasword:
%
Run Code Online (Sandbox Code Playgroud)

然后在另一个终端窗口中:

% 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"
Run Code Online (Sandbox Code Playgroud)

人们通常使用调试器来gdb查看正在运行的进程的内存,而不是像这样的基本方法(调试器知道进程使用的结构的格式,可以跟踪指针、列表等),但原理基本上是相同的。

最近的 Linux 内核也有更好的界面/proc/[pid]/mem,而不是像process_vm_readv. 就像/proc/[pid]/memPTRACE_PEEK等一样,您需要类似 root 的权限 ( CAP_SYS_PTRACE) 才能读取不属于您的进程的内存。