如何使用cx_Freeze将某些.py文件“隐藏”到.exe中?

时间:2019-06-26 15:27:44

标签: python python-3.x pyinstaller cx-freeze decompiling

Env:

Windows 10
python 3.6.6
cx-Freeze 5.0.2

Git hub example

安装需要.msi

示例项目结构:

/package_name
        /some_packet
            /__init.py
            /module_name.py  # for an example contains valiable in code "module_1"
    /main.py
    /setup.py
    /some_module.py  # for an example contains valiable "module_2"
    /some_other_module.py  # for an example contains valiable "module_3"

setup.py(简体)的示例

import cx_Freeze

cx_Freeze.setup(
    name="example",
    options={
        "build_exe": {
            "packages": ["asyncio"],
            "include_files": ["static\some_static_file.png"]
        },
        "bdist_msi": {
            "upgrade_code": "{492de237-1853-4599-a707-c283d567699f}"
        }
    },
    executables=[cx_Freeze.Executable("main.py")]
)

当前行为

用于创建.msi安装文件->运行命令python setup.py bdist_msi。它将生成.msi个文件用于安装应用程序。

安装此应用程序后:目录(安装应用程序的位置)将包含:

  • main.exe
  • lib\some_packet目录
  • lib\some_packet\module_name.pyc文件
  • 其他文件

有以下语句:

1)从根目录(安装了应用程序)开始搜索(通过Ubuntu来宾系统下的grep -Rna命令,对我来说更方便),并且可以在目录中找到易变的module_1lib\some_packet\module_name.pyc)和module_2 / module_3中找不到。
详细信息:

(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ grep -Rna "module_1" 
lib/some_packet/module_name.pyc:2:B�!]�@dZdS)module_1N)r�rr�PG:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py<module>s 
(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ grep -Rna -a "module_2" 
(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ grep -Rna -a "module_3"

2)文件lib\some_packet\module_name.pyc可以通过以下方式轻松转换为原始文件(无注释): python-uncompyle6
详细信息:

(v_decompile) any@any-pc:/mnt/hgfs/shar/example_installed$ uncompyle6 lib/some_packet/module_name.pyc 
# uncompyle6 version 3.3.3 
# Python bytecode 3.6 (3379) 
# Decompiled from: Python 3.6.6 (default, Jul 20 2018, 15:39:05) 
# [GCC 4.8.4] 
# Embedded file name: G:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py 
# Compiled at: 2019-07-07 11:28:50 
module_1 = 'module_1' 
# okay decompiling lib/some_packet/module_name.pyc

3)(用this question解决)这两点:文件包含源路径G:\heroes\installer-with-cx_Freeze\sources_of_project\some_packet\module_name.py,这使我有些困惑。应用程序是从.msi安装的,据我所知,应该不了解用于创建最后一个目录的源目录(关于路径)。

问题:

  1. 是否有办法将some_module.py中的some_other_module.pymain.exe恢复到原始文件?(就像可以使用lib\some_packet\module_name.pyc一样)

  2. 如何将应用程序中的其他文件“隐藏”到main.exe或以某种方式避免将.pyc转换为原始文件。(也许是cx_Freeze中的某些属性?)

注意:

应该用cx_Freeze完成。

PS:我不想创建单个.exe。我尝试找到一种方便的方法来指定应将哪些文件存储在main.exe中,就像使用some_module.pysome_other_module.py一样

PSS:此刻,我只能以一种方式看到:将所有文件置于main.py级别:)但是对于大型项目来说,这看起来很奇怪。

3 个答案:

答案 0 :(得分:2)

引用How to obfuscate Python source code

  

这两种方法[使用pyobfuscate和分配字节码]实际上只是一种威慑力,而不是一种安全的隐藏代码的方式。

     

如果您想要更强大的功能,应该看看Nuitka,它将Python代码编译为C ++,因此您可以对其进行编译并仅分发可执行文件。它似乎与不同的库和不同版本的Python广泛兼容。

另请参阅Python Code Obfuscation

答案 1 :(得分:0)

video可能会有所帮助。 它讨论了cxfreeze以及如何使用cxfreeze使其成为可执行文件,而且我知道它适用于3.4+,因为视频使用python 3.4,但实际上您的方法应该没问题...

答案 2 :(得分:0)

如果我正确理解了您的问题,则可能是您想要的答案-Python cx_Freeze for two or more python files (modules)