Linuxのプロセスの実行可能オブジェクトファイル(Elf)の中に情報(単純な整数)を埋め込もうとしています。ローダー内のカスタムセクションを読むにはどうしたらいいですか?
私は、ファイル内にバイナリとして整数値を書き込んだ後、objcopyコマンドを使用してバイナリファイルの内容をコピーすることでこれを達成しました。このようにして
objcopy --add-section .customsection=binaryfile processElfFile newProcessElfFile
、newProcessElfFileの内側に私は整数値を含む新しいセクションでプロセスの完全作業コピーを持っている、と私は
readelf -e newProcessElfFile
を使用してセクションを参照してくださいすることができ、私も確認しましたセクション値は、Libelfライブラリの上にあるCコードを使用して正しい値になります。すべてうまく動作します。
ここで、新しいセクションに含まれる整数値を読み込み、elfファイルをロードして実行するときにprintkを実行したいとします。
これを達成するには、私はカーネル側のローダーコードを変更する必要があります。
問題は今ことです:私はlibelfをライブラリを使用して、カーネル内のコードを記述することはできませんので、私は私のユーザー側のプログラムと同じように、私は直接セクション値にアクセスすることはできません
- 。
- load_elf_binary()関数内のlinux-VERSION/fs/binfmt_elf.cに含まれるelfカーネルローダーは、elfセクションを読み取るのではなく、単独ではなくelfセグメントを指すelfプログラムヘッダーにアクセスしますセクション。
問題を解決するために、カスタムセクションをセグメント内でリンクして、アクセスできるようにする必要があると思います。
だから私は2つの関連の質問があります。
- は私が何とかローダー内で直接私のカスタムセクションを読むことができますか?
- そうでない場合、カスタムセクションへのセグメントリンクを作成して、elfファイルのプログラムヘッダーを使用してアクセスできるようにするにはどうすればよいですか?
もう1つの可能性は、既に存在する.rodataセクションの要素として整数値を追加することですが、残念ながらそれを実行する方法とカーネルのそのセクションにアクセスする方法はわかりません。
ただし、セクションヘッダとは異なり、完全に取り除かれたバイナリからは失われてしまいます(カーネルはセグメントのみを使用しています)。 –
ありがとう、これらの情報を使用して、load_elf_binary()カーネル関数を変更してelfバイナリファイルを読むことに成功しました – AndreaB