2016-07-27 10 views
0

Linuxカーネルモジュールから.eh_frameと.eh_frame_hdrセクシ​​ョンのアドレスを見つけるために、カーネルからプロセスのプログラムヘッダテーブル(またはセクションヘッダー)にアクセスする必要があります。ユーザー空間ではdl_iterate_phdr()を使用しますが、私はカーネル空間の解決策が必要です。可能であれば、elfファイルを通過する必要はありません。カーネルモジュールからダイナミックリンク/ロードされたライブラリのPHDRを見つける方法は?

補助ベクトルにはAT_PHDRフィールドがありますが、動的にリンクされた/ロードされたライブラリのPHDRを見つけるのには役立ちません。

私の他のアイデアは、タスクのメモリに実行可能なmmapを持つすべてのファイルからPHDRアドレスを見つけるためにvm_areasを繰り返し実行することでした。この解決策の問題点は、ロード後にelfファイルを変更または削除できることです。

これは、メモリにのみ依存し、elfファイルには依存しない方法がありますか?

答えて

0

Elfヘッダー(phdrテーブルへのファイルオフセットがあります - 多くの場合、メモリ内のオフセットと同じです)は、常に実行可能なmmapの先頭にあります。私はEhdrの出現に関する文書を見つけることができなかったので、実際には信頼できるものではありませんが、実際には現れているようです。これは、Elfファイルの先頭にある必要があり、ページのサイズと配置によって、実行可能セグメントがオフセット0x0から始まるためです。

我々は実行可能なマッピングは、すべての実行中のプロセスのためのオフセット0x0に開始し、このbashのラインでオブジェクトを共有するにロードされたことを確認することができます:いいえ

sudo cat /proc/*/maps | awk '{ print $2 " " $3 " " $6;}' | egrep '^..x.' | grep -vE '.... 0{8}' 

は、それはすべての実行可能なマッピングを出力し、オフセット0x0に起動しません。出力とは、Ehdrsが実行可能なvm_areasの先頭にあることを意味します。

関連する問題