2011-01-06 12 views
2

これは少し奇妙な問題です。ファイルからの動的バイナリ

私は、特定のプラットフォームで実行されているC++コードがあります。このコードの唯一の目的は、バイナリ、NATIVEを含むファイルをそのプラットフォームに実行することです。

今、私の質問です - どのように私は、このデータが実行部分になるように私のコードを実行しているマシンのメモリに、これらのファイルからのデータを取得することができますか? ?

つまり、私は命令ポインタを指すことができるどこかにデータを得ることができますか?

はいの場合はどうですか?

私はこのためにアセンブラを使用する必要はありません - それだけで動作するようになります。

編集:申し訳ありませんが、私は十分ではありませんでした。

基本的には、ロードするファイルデータは、.exe、Mach-O実行可能ファイルまたはELFのような形式ではありません。これは生のバイナリデータです(私のコードで削除されたカスタムヘッダー付き)。このバイナリデータは、特定のマシンコードであり、現在のマシン上で実行されているプロセッサに適しています。

これは技術的には、通常のOSエグゼキュータを参照してバイナリを直接ロードしたいということです。私はそれを解釈することができますが、それは最高でも3倍ほど遅くなります。

別の子プロセスでデータを実行する必要がある場合は気になりませんが、データがOSが自動的に実行できる形式ではないため、通常のプロセスオープナーを使用できません(やはり、 .exe、Mach-O、ELFのように)。

+0

実行すると別のバイナリを実行する場合、 'fork()'と 'system()'には何が問題なのですか? – Nim

+0

あなたはあなたの目標について何も言わないが、これは非常にターゲットに依存する。 – AProgrammer

+0

世界では、実行するバイナリチャンクを取得していますが、言語やプラットフォームはありません。 – Mordachai

答えて

4

あなたは、メモリへのファイルの読み込み(これはWindowsの例VirtualProtect()のために、プラットフォーム固有です)実行可能ファイルとしてこのメ​​モリをマークし、そして関数としてそれを呼び出す必要があります。もちろん、コードの((void(*)())ptr)();

ファイルにposition-independentする必要があります。

+1

私はこのコードブロックからのリターンをセットアップする必要があることを除いて、これが機能することを期待します。おそらく、自分自身で実行しているバイナリチャンクには、スタック設定/引き裂き規則はなく、コードへのジャンプが予想されます。したがって、上記と現在のプラットフォームに適したreturn-from-functionコードを手動で追加するだけで十分です。 – Mordachai

+0

Mordachaiのコメントを展開する:読み込まれたファイルの実行可能ビットがCのように見える場合、Abyxの提案が有効になります。 'dlsym' _et al._そのように動作します。しかし、 "生の"チャンクで "ちょうど彼らのコードに飛び込むことを期待する"なら、カスタム 'jmp_buf'を構築し、Cの' longjmp() 'を使うことができます。 –

+0

@Mordachai、JCSalomon - はい、私は理解しています - バイナリチャンクはこの種の読み込みの準備ができており、コンテキストから取り出されるだけではありません。また、 - Abyx - 主要なプラットフォームでは、実行マーキングでより具体的になりますか?これらのOS固有の機能は私が本当に必要としているようです。 –

0

ソリューションの汎用性はどの程度ですか?

OSローダーは、通常、特定のファイル形式を処理する方法と、それらをメモリにロードする方法を知っています。通常、OSローダーを使用してエントリポイントを呼び出すことができますが、エントリポイントとは何かを知る必要があります。そのためには、とにかくファイルフォーマットを理解する必要があります。私はそのためのポータブルな解決策は考えられません。

あなたが何をしたいのかについてもっと詳しく説明すれば、解決策を提供することができます。

関連する問題