プログラムの実行中に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