3

C プログラムで単純な ELF ファイルを操作する必要があります。外部ライブラリは使用できませんが、elf.h.

ソースとして hello.o ファイルを見てみましょう:

int Hello() { return 3; }

Helloファイルしかない別のCプログラムにアクセスするにはどうすればよいhello.oですか?

mmapおそらく、またはこのように sthを使用してメモリにロードする必要があります。最後に、非常に複雑な ELF ファイルを処理する必要がありますが、今はどうやって開始すればよいかわかりません。

更新:学習目的のため、説明したとおりにこれを行う必要があります。全体の問題は、私が説明したものよりも複雑です。

この質問では、メソッドを書く必要があると仮定します:

int HelloFromElfO(const char* helloFile);

Hello実装された関数を実行しhelloFileます。

私は完全な答えを望んでいません。コードは必要ありません。何か始める必要があります。

ELF ファイル構造に関する基本的な知識はありますが、このようなパーサーや sth を使用せずに C でバイナリ ファイルを操作する方法がわかりません。

UPDATE2: OK、readelf のようなアプリは非常に複雑です。hello.oだから多分私はこの方法を試してみてください:でメモリにマップしたとしましょうptrHello関数へのポインタを取得するにはどうすればよいですか?

から構造化データを取得するにはどうすればよいhello.oですか? つまり、純粋なバイトではなく、操作できるものです。

4

1 に答える 1

5

これはあなたが思っているよりずっと簡単です。ELF はあなたの問題とは何の関係もありません (mmap()さらに遠い...)。hello.oELF ファイルではなく、オブジェクトファイルです。

オブジェクト ファイルを実行可能ファイルにリンクするだけで、Hello(). プログラムを としてオブジェクト ファイルにコンパイルしたと仮定すると、これをyourCode.o次のようにリンクします。yourCode.ohello.o

cc yourCode.o hello.o -o yourExecutable

ここを参照してください。

編集

ファイルをリンクせずに動的にロードする場合は、

  1. mmap()オブジェクトファイル
  2. Hello()メモリ内のアドレスを取得します。これを静的に分析hello.oし (例: を使用objdump) Hello()、ファイル内のエントリ ポイント オフセットを取得できます。
  3. によって返されたアドレスにこのオフセットを追加して、アドレスmmap()を取得しHello()ます。
  4. Hello()アドレスを関数ポインタにマップする
  5. 関数を呼び出します。
  6. ???
  7. 利益
于 2013-03-23T12:15:41.917 に答える