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]/memなどと同様に、プロセスに属さないメモリを読み取るには、PTRACE_PEEKrootのような権限()が必要です。CAP_SYS_PTRACE

関連情報