2012-05-09 20 views
5

外部のサーバーからTCP経由で他のバイナリアプリケーションファイルを受信して​​実行する小さな "アプリケーションローダー"プログラムを用意したいと思います。別のプロセス内のメモリからプロセスを実行しますか?

送信したファイルをハードディスクに保存し、system()コールを使用して実行すると、これを実行できます。しかし、ハードドライブに触れることなくメモリから新しいアプリケーションを起動することが可能かどうかは疑問だ。

新しいアプリケーションをロードした後、ローダーアプリケーションの状態は問題になりません。私はCに固執する方が好きですが、C++ソリューションも歓迎します。可能であれば、標準のLinux Cの機能に固執し、外部ライブラリを使用しないことも望みます。

+0

はい、可能ですが、やや複雑です。 OSをエミュレートしてバイナリをメモリなどにマップする必要があります。 –

+2

これをRAMディスク上のファイルに書き込むことができます – TJD

+1

私は、やや近年のCPUの*あらゆる*レベルのOSセキュリティは、これが起こり得ないことを保証するのが最善です。これは確かに実行可能ですが、実際のディストリビューションで使うのに本当に苦痛になるでしょう(私が願って) – BRFennPocock

答えて

3

短い回答:いいえ。

長い答え:これをディスクに書き出さずに行うことは可能ですが、ややこしいことです。理論的には、バイナリを読み込み、メモリをマップし、必要に応じてダイナミックリンクを処理し、コントロールを転送する独自のelfローダーを書くことができますが、それは大変な作業ですが、それほど努力する価値はありません。

次善の解決策は、ディスクに書き込み、すぐにリンクを解除することです。ディスクは「本当の」ディスクである必要はなく、tmpfsなどにすることもできます。

最近私が使ってきた別の方法は、完全にコンパイルされたバイナリを渡すのではなく、代わりにLLVMバイトコードを渡すことです。これには、異種環境でアプリケーションを動作させるという利点もあります。

fmemopenfilenofexecveの組み合わせを試してみたくなるかもしれないが、これは二つの理由のために動作しません。

「ファイル:fexecve() manページから

  1. 記述子fdは読み取り専用でオープンする必要があり、呼び出し元は実行する権限を持っている必要があります参照先のファイル "

e.e.e.それはファイルを参照するfdである必要があります。

「これらの関数によって返されたファイルストリームに関連付けられたファイルディスクリプタは、(返されたストリーム上で呼び出された場合、すなわち、 fileno(3)はエラーを返します)がありません」: fmemopen() manページから

  • +0

    ありがとうございました。これはまさに私が探していたものです。私の好奇心を満足させる必要があったのです! – Flip

    +0

    最近では '/ dev/shm /'に 'tmpfs'がマウントされていることが標準的なことであることに注意してください。 – caf

    0

    これは、Cがtmpfsファイルシステムを設定するよりもずっと簡単です。あなたはあなたのプログラム/サーバ/あなたが何かをすることができるだけのハードディスクのインタフェースのすべての利点をexecで持っています。これらのタイプの仮想ファイルシステムは今日では非常に効率的です。実際にはページキャッシュには実行可能ファイルのコピーが1つしかありません。

    Andy氏は、このようなスキームを効率的にするためには、ファイルへのバッファリングされた書き込みを使用せず、(より広い意味では)直接書き込むことを保証する必要があります。あなたがmmapでメモリにファイルをその「マップ」ftruncate

  • とその大きさに、あなたの実行ファイルが
  • あなたのtmpfsの上にファイルを作成
  • 規模になりますどのように大きなそれを知る必要があるだろう

    • 場所にデータを書き込むことがrecvコールに直接対処するバッファのaddrの
    • パスを取得
    • munmapファイル
    • ファイル
    • rmとファイルexecを呼び出します。実行ファイルは、まだあなたが見て、メモリへの実行可能ファイルを解凍UPXを、再利用したいし、それを起動するld-linuxに制御を移すかもしれません
  • +0

    正直なところ、tmpfsは、あなたのストレージがすでに容量を超えていない限り、ネイティブファイルシステムより高速になることはありません。書き込みはすぐにexecve()が単にキャッシュからそれらをマップするように、メモリにバッファされます。あなたが支払う唯一のコストは、最終的に非同期のディスクへのフラッシュです。 –

    +0

    @AndyRoss、そのようなことにバッファリングされた書き込みを使用しないでください、私は私の答えを更新します。 –

    +1

    それだけでもメモリコピーを避けることができます。ここでのパフォーマンスの制約は何ですか?私は、ファイルシステムを介した書き込みの速度が制限されているが、ネットワークを介したパケットの受信速度がそれほど高くない状況を想像している。はるかに複雑すぎるようだ。あなたの普通のファイルシステムをオープン/ライトして、問題を解決してください。 –

    0

    を実行している場合でも行うことができます。

    関連する問題