2

これはおそらく、私の C 知識の欠如による問題ですが、誰かが可能な解決策を提供できることを願っています。一言で言えば、メモリに格納されている構造体を読み込もうとしていますが、その物理メモリ アドレスがあります。また、これは 64 ビット Linux システム (Debian (Wheezy) Kernel 3.6.6) で実行されており、言語として C を使用したいと考えています。

たとえば、問題の構造体の現在のアドレスは、物理アドレス: 0x3f5e16000 にあります。

ここで、最初に /dev/mem へのポインターを使用してこのアドレスにアクセスしようとしました。ただし、1024MB を超えるアドレスへのアクセスは許可されていないことを知り、var/log/messages にエラー メッセージが表示され、それに関するすべての情報が表示されます。現在、ユーザー空間アプリからのアクセスが試行されていますが、カーネル モジュールの作成が必要な場合は喜んで検討します。

興味深いことに、「kprobe」として知られるものも発見しました。これにより、1024MB を超える /dev/mem 制限を回避できるとされています。しかし、システムに潜在的なセキュリティの問題を持ち込むことは本当に望んでいません。これを達成するためのより簡単な方法があるに違いないと確信しています。kprobe に関する情報は、 http ://www.libcrack.so/2012/09/02/bypassing-devmem_is_allowed-with-kprobes/ にあります。

私はいくつかの読書を行い、mmapを使用して物理アドレスをユーザー空間にマップして読み取れるようにすることへの参照を見つけましたが、Cでのこれの実装を理解していないことを告白しなければなりません.

物理メモリへのアクセス、または物理アドレスからユーザー空間の仮想アドレスへのデータのマッピングに関する情報を誰かが提供できれば、非常に感謝しています。

私が何をしているのか正確に少し曖昧な場合は、私を許してください.私は鈍感でも何でもありません。

メモリ内の構造は、実行中のカーネル モジュールによってメモリに読み込まれる 4 つの int と 10 の long のブロックです。

私が使用しているアドレスは間違いなく物理アドレスであり、非ページに設定されています。カーネルモジュールは物理アドレスへの変換を実行し、アドレスの演算子は使用していません。

それが構造体の最初の要素であるため、物理的な場所からintを読み取る方法として質問を言い換えるべきかどうか疑問に思っています。それが物事を明確にするのに役立つことを願っています!

編集-さらに読んだ後、この問題の解決策の1つは、カーネルモジュールを構築し、mmap関数を使用して物理アドレスをカーネルモジュールがアクセスできる仮想アドレスにマップすることです。誰でも mmap を使用してこれを達成するためのアドバイスを提供できますか?

4

1 に答える 1

4

私はこの質問に答えるだけです:

それが構造体の最初の要素であるため、物理的な場所からintを読み取る方法として質問を言い換えるべきかどうか疑問に思っています。

いいえ。問題はintvsstructではありません。問題は、C 自体に物理メモリの概念がないことです。OS は MMU と連携して、実行中のすべての C プログラムを含むすべてのプロセスが仮想メモリ サンドボックスで実行されるようにします。OSは、物理メモリへのエスケープ ハッチを提供する場合があります。

物理アドレス で何らかのオブジェクトを管理するカーネル モジュールを作成している場合は0x3f5e16000、そのメモリにアクセスするための API を提供する必要があります。できれば、ファイル記述子またはその他の抽象化を使用して、カーネル メモリ管理の核心を隠す API を提供する必要があります。通信相手のユーザー プログラム。

固定された物理メモリ アドレスにアクセスすることを期待する、設計が不十分なカーネル モジュールと通信しようとしている場合は、厄介なハッキングが関係/dev/memしています。

于 2013-01-10T20:49:44.063 に答える