2011-02-06 3 views
0

持っPROGRAM.EXEを言うことができます、私は意志ファイルのバイナリデータ

  • はバイナリモードでPROGRAM.EXEを読み込み、変数データ
  • に保存Pythonスクリプトを作成します。 (?):

    バイナリー追加モードで開いmypytonprog.py
  • がmypythonprog.pyにデータを追加する前に、この

、mypythonprog.pyように調製されるだろう

program_data=''' 

ようにした後、mypythonprog.pyは続けるだろう:

''' 
programs continues.... 

これを(私はprogram_data変数にそのプログラムコードを置くために何とかしたい)もちろん、ない作業を行い、それは何らかの方法で行うことができますか? 私が基本的に望むのは、mypythonfile.pyは、内部にバイナリデータが格納されたexeファイルを作成できるようにすることです。

私は、そのデータをシェルコードにエンコードする必要があります。これは、mypythonfile.pyの中に入れることができます。
が正しいですか?

答えて

2
import base64 

exe = 'c:/users/me/program.exe' 
script = 'c:/users/me/newpython.py' 
chunksize = 6144 
linelength = 80 

with open(exe,'rb') as inf, open(script,'w') as outf: 
    outf.write('program_data = """') 

    while True: 
     progdata = inf.read(chunksize) 
     if len(progdata): 
      progdata = progdata.encode("base64") 
      outf.writelines(progdata[i:i+linelength] for i in range(0, len(progdata), linelength)) 
     else: 
      break 

    outf.write('""".decode("base64")') 

編集:

アイデアは、入力の便利なチャンク内のファイルではなく、メモリ内に潜在的に巨大なファイルの読み込みを処理することです。

チャンクをbase64でエンコーディングした後、それを80文字の行に分割します(これは基本的にはテキストエディタで管理しておきます)。

program_data = "" ".." "" .decode( "base64")にデータをラップすると、Pythonがファイルを読み込んだときにデータが自動的に解読されます - program_dataには、

8096は脳のおならでした - 私は8192バイト(8KB)を使用することを意図していました。それから2番目の問題があることを認識しました。 3文字の長さの倍数以外のチャンクをエンコードすると、 '=' - パディングされた出力となり、デコードが途中で切り詰められます。チャンクサイズを6KB = 512バイト(デフォルトのNTFSブロックサイズ)* 3文字* 4(任意の倍数)に変更しました。これは期待どおりに動作するようです。

希望に役立ちます!

+0

これは確かに@Ignacioの回答よりも優れています(非ASCII魅力的な人たちについては私には何の問題もありません...)しかし、program_dataを(バイナリ?)モードでファイルに書き込むとそれは)窓は私にそれが有効なWin32アプリケーションではないという不公平を与えます... – Kristian

+0

何をしているのですか?なぜチャンクサイズ= 8096?私はそれが何をしているのか見ていますが、なぜですか?あなたの国家は何ですか? :-) どうも – Kristian

3
>>> 'some binary data'.encode('base64') 
'c29tZSBiaW5hcnkgZGF0YQ==\n' 
>>> 'c29tZSBiaW5hcnkgZGF0YQ==\n'.decode('base64') 
'some binary data' 
関連する問題