Cを使用して特定のメモリアドレスを取得する方法

問題の 1 つは、メモリが存在する物理アドレスではなく、仮想アドレスを取得していることです。次回起動するとき、マッピングはおそらく同じではありません。

これは Linux のカーネル モジュール内で確実に実行できますが、ユーザー空間で使用できる API はないと思います。

許可がある場合 (このマシンを再起動する場合は、このマシンの root になることができると思います)、/dev/mem を覗いて実際の物理レイアウトを確認できます。おそらく、値をサンプリングして再起動し、それらの値のうちいくつが保持されているかを確認する必要があります。


コールド ブート攻撃が実証されている同様のプロジェクトがあります。ソースコードが利用可能です。そこからインスピレーションを得ることができるかもしれません.

ただし、AFAIRは最初にOSをロードせずにメモリを読み取るため、OSのメモリ保護をいじる必要はありません。ブート後に OS によってメモリが上書きまたはクリアされるのを避けるために、これも試してみてください。

(サイトのビデオもチェックしてください。かなり印象的です;)


Linux での Direct Memory Access という質問では、これを達成するために必要な基本事項のほとんどを解決しました。 mmap() は、他の人が述べた理由とまったく同じ理由で、これに対する答えではないことに注意してください..カーネル内でのみ取得できる仮想アドレスではなく、実際のアドレスが必要です(または、ユーザー空間に中継するドライバーを作成することによって) ).

最も簡単な方法は、有効な開始アドレスまたは終了アドレスを与える ioctl を使用して、読み取りまたは書き込みが可能なキャラクター デバイス ドライバーを作成することです。繰り返しになりますが、カーネルで使用するメモリ管理関数のポインターが必要な場合は、リンクした質問を参照してください..そのほとんどは、最初の (そして受け入れられた) 回答のコメントで解決されました。