自学内容网 自学内容网

Python工程加密打包(基于pyinstaller 6.11.1和pyarmor 9.0.5)(202411)

    近期编写的PyQt客户端需要交付了,在交付之前面临如下两个问题:第一是将程序打包成exe,第二是对程序进行加密,毕竟生成的pyc文件是能被反编译出来的,甚至连注释都在。

    联想到同样是脚本语言的Javascript采用混淆技术进行代码保护,因此了解了Python的混淆工具pyarmor。由于pyarmor的更新比较频繁,一些5.*版本的指令已经不适用了,本文当前所采用的pyarmor版本为9.0.5。笔者最开始尝试先混淆再用pyinstaller去打包的方式,但发现依赖没有被打包到exe,会报import error。后来查看--help发现可以通过--pack选项直接打包,而且只要指定入口程序即可,pyarmor会自动将依赖的程序混淆并打包,具体流程如下:

1 安装pyinstaller和pyarmor

pip install pyarmor==9.0.5
pip install pyinstaller==6.11.1

2 混淆和打包

pyarmor gen -O armor --pack onefile -e 100 scripts\main.py

    上述命令中,-O 指定了输出目标文件目录,--pack 指定生成exe文件及生成模式,-e 在这里为程序有效期:100天。运行该命令后,将在工程目录生成.pyarmor\pack目录,用于保存混淆和打包的中间文件。在工程目录还会生成main.spec配置文件,该文件是由pyinstaller在打包时生成的。该命令运行结束后,在armor目录下将成main.exe文件,双击即可运行。如果对pyinstaller的打包过程没有要求,只运行上述命令即可得到加密的exe文件。但是如果需要修改pyinstaller打包配置(如需要修改图标,配置是否显示命令行窗口等),就需要再进行下述额外配置。

3 修改pyinstaller打包配置

# -*- mode: python ; coding: utf-8 -*-
# main.spec

a = Analysis(
    ['.pyarmor\\pack\\dist\\main.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=['.pyarmor\\pack'],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='main',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

在上一步生成的main.spec文件如上所示,该文件为pyarmor程序生成的,采用一个固定的默认打包配置模式,通过修改该spec文件并重新用pyinstaller打包,就可以追加需要的打包配置。如下图所示,配置了不显示命令行和图标配置。

4 用pyinstaller重新打包

pyinstaller --distpath armor main.spec

为使打包配置生效,采用上述重新打包,将在armor目录重新生成追加了打包配置的main.exe文件。

5 反编译验证

通过pyinstxtractor解包main.exe,并反编译了程序引用的一个中间文件,反编译回来的Python文件如下图所示。可见,反编译pyc文件得到的的确是pyarmor混淆过的程序,符合预期。

Trouble Shoting:

1. 反编译时uncompyle6不支持Python 3.10?

查到的一种方法是使用反编译网站PyLingual,该方法亲测可用,如上面反编译的结果所示。另一种方法是hack源码,没有测试。

2. 如何修改main.spec文件?

这里没有去查pyinstaller的源码或是文档,采用的方式是直接用pyinstaller命令去打包main.py,在该打包命令中添加需要的配置。打包过程同样生成一个spec文件,查看和比较该spec文件,即可了解到追加的配置在spec文件中是如何体现的。

pyinstaller --clean --onefile --windowed --icon=assets\icons\app.ico scripts\main.py


原文地址:https://blog.csdn.net/Hunter_H1/article/details/143719085

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!