base64 でエンコードされた文字列として保存されている exe ファイルをメモリにロードし、ディスクに書き込まずに実行するにはどうすればよいですか?
ポイントは、ある種のコントロール/パスワード/シリアル システムを配置し、py2exe でコンパイルすることです。その後、コード内でいつでもその埋め込みファイルを実行できます。
子プロセスを実行するために Python が持つすべてのメカニズムには、ファイル名が必要です。
またCreateProcess
、Win32 API の基礎となる関数も同様であるため、そのレベルまで下げることによってそれを回避する簡単な方法さえありません。
/にドロップダウンすることでこれを行う方法があります。低レベルの NT API の使用方法を知っている場合は、この投稿だけで十分に理解できます。そうしないと…SOの答えで説明するには多すぎます。ZwCreateProcess
NtCreateProcess
あるいは、もちろん、RAM ドライブを作成または使用したり、仮想ファイルシステムをシミュレートしたりすることもできますが、ファイルの作成を回避する試みとしては少しばかげています。
したがって、正しい答えは、exeをファイルに書き込んでから実行することです。たとえば、次のようなものです。
fd, path = tempfile.mkstemp(suffix='.exe')
code = base64.b64decode(encoded_code)
os.write(fd, code)
os.fchmod(fd, 0o711)
os.close(fd)
try:
result = subprocess.call(path)
finally:
os.remove(path)
これは Windows と *nix の両方で動作するはずですが、完全にテストされておらず、おそらく少なくとも 1 つのプラットフォームでバグがあるでしょう。
明らかに、複数回実行したい場合remove
は、完了するまで実行しないでください。または、適切な永続ディレクトリを使用して、欠落しているか古くなっている場合にのみ書き込みます。