【问题标题】:files's binary data stored as variable inside python file文件的二进制数据作为变量存储在 python 文件中
【发布时间】:2011-02-06 03:47:56
【问题描述】:

假设有一个 program.exe,我将创建一个 python 脚本

  • 以二进制方式读取program.exe并保存在变量数据中
  • 以二进制追加模式打开 mypytonprog.py
  • 将数据附加到 mypythonprog.py (?)

在此之前,mypythonprog.py 将被准备为:

program_data='''

之后,mypythonprog.py 将继续:

'''
programs continues....

(我想以某种方式将该程序代码放入 program_data 变量中)

这,当然可以,但是可以通过某种方式完成吗? 我想要的基本上是:mypythonfile.py 能够创建一个 exe 文件,其中存储有二进制数据。

我想我必须将该数据编码为 shellcode,以便能够将其放入 mypythonfile.py,
对吧?

【问题讨论】:

    标签: python encoding exe binary-data


    【解决方案1】:
    >>> 'some binary data'.encode('base64')
    'c29tZSBiaW5hcnkgZGF0YQ==\n'
    >>> 'c29tZSBiaW5hcnkgZGF0YQ==\n'.decode('base64')
    'some binary data'
    

    【讨论】:

      【解决方案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)。然后我意识到还有第二个问题;对除 3 字符长的倍数以外的块进行编码会导致 '=' 填充输出,这会过早地截断解码。我已将块大小更改为 6KB = 512 字节(默认 NTFS 块大小)* 3 字符 * 4(任意倍数);这似乎按预期工作。

      希望有帮助!

      【讨论】:

      • 嗯,这肯定比@Ignacio 的答案好(它没有给我任何错误……关于非 ASCII 字符……)但是当我以(二进制?)模式编写该 program_data 时归档(并关闭)窗口给了我一个错误,它不是一个有效的 Win32 应用程序......
      • 你能描述一下它在做什么吗?为什么块大小 = 8096 ?我看到它在做什么,但为什么?你的策略是什么? :-) 谢谢
      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多