お世話になります。
通常ファイル名を指定して別プロセスを起動すると思いますが
メモリにしかない(メモリストリームとかバイト配列とか)ものを
実行できますでしょうか?
以上よろしくお願いします。
敢えてできなし。と言っておきましょう。
理由
一般的にデータセグネントにはコードセグメント
としての実行権限が付与されない。
※ ある時点より古い時代では、可能だった・・・
以上。
※ 追伸・・・
最近、キーボードおかしいのかな〜
敢えてできない。云々・・・
以上。
データ領域中に持っているコードのバイナリイメージを実行、とは書いていないような気がする。
HOGE.ZIP 中にある HOGE.EXE ファイルをメモリ上に展開し (ディスクには置かない)
そのメモリ中にしかないファイルイメージで CreateProcess できるかどうか
という質問であるならば・・・
できるのかねぇ?
とりあえず CreateProcess の解説にはできると書いていないなぁ・・・
Explorer で ZIP 中の EXE を起動すると、作業ディレクトリ上に EXE ファイルを展開している。
printf("<%s>\n", argv[0]); する EXE を ZIP 化して実行すると
<C:\Documents And Settings\User\Local Settings\Temp\hoge.zip の一時ディレクトリ\hoge.exe>
と表示されるのは確認した。
.NETでdllならAssembly.Loadできるようですね。
VB、VCは無理で.NETもdllしか無理なのでしょうか・・・
もう少しご意見をお待ちします。
質問がよくわからん
質問が変わってるし
実行イメージを名前付き共有メモリに置いて自分自身をCreateProcessする。
子プロセス側で共有メモリーの内容をチェックして、無ければ通常処理。
あった場合、共有メモリーの内容を別領域にコピーして共有メモリーを破棄。
(ミューテックスとか使う必要があるかも)
実行イメージの再配置情報やらモジュールのロードやらを自前で処理してエントリーポイントへジャンプ。
(モジュールの自前ロードのサンプルは探せばあります)
名前付き共有メモリのUNCパスをCreateProcessのプログラム名の
設定に渡すことで動作するならそれも可能かと。
未確認ですが・・・(時間があればやってみよう〜)
ただ、EXEヘッダーからモジュールの展開を自前でやる・・・のは
DOSのころに比べれば非常に厄介なことです。
が、それを安易にできるとは言いたくなかった・・・
※ OSの種類に依存する部分があるので、気をつける必要が
あります。Win95系とWinNT系
Win95系なら別の方法で可能〜
ただし、その方法使える環境が、もう生き残っていないと
思われるが。(WinMeは使ったことないので解りません)
よって、WinNT系のみに特化した方法と言うことになります。
以上。
追伸
もうWindowsでは使われていない・・・と思っていたソフトで
『UPX』と言うものがあります。
EXE/DLLファイルを圧縮・暗号化します。
で、出来上がったEXEは実行すれば、テンポラリに多分解凍した
元ファイルを吐き出さないでそのままメモリ上で起動します。
要は、原理的にメモリ上でEXEヘッダーを解釈しながら解凍と、
復号化してモジュールを展開・配置して、最後に実行。
可能ですネ!
以上。
> 『UPX』と言うものがあります。
> 可能ですネ!
それは、メモリイメージでプロセスを作ってるんじゃなくて、既にあるプロセスのメモリ空間に実行可能データを読み込んでるだけでしょう。
最初の「敢えてできない」とまったく同じ方式です。
共有メモリが可能ならそれが質問に近い気がする。
別にデバッガを作ろうってことじゃないよな。
意図やメリットがわからん
CreateProcessの第一引数は共有メモリーの使用も想定しているかのようにも見えますが、
Win2kで確認した限りでは不可能でした。(出来れば楽なんですけどね)
それより新しいバージョンではひょっとしたら有効かもしれません。
UPX等パッカーのように、別プロセスでなく自前のプロセスでよければ共有メモリーやCreateProcessは不要ですね。
その代わり実行イメージローダーは多分自前になると思います。
リビルド出来ないプロセスが複数必要な場合にファイルをひとまとめにしたい場合に必要かもしれません。
(アーカイブから一時ファイル無しに起動するとか)
おおよそそれらは他者による再頒布パッケージなので場合によっては問題があるかもしれません。
HASP等のようにバイナリを暗号化して知的所有権保護を施したい場合等も
この手の技術が必要になってきます。