Python代码加密方案

Leon
2024-04-19 / 0 评论 / 11 阅读 / 正在检测是否收录...

Python代码加密

方案调查

方案缺点
Pyarmor、Nuitka收费
py2sec,将 .py 编译成so文件太老了https://github.com/cckuailong/py2sec https://github.com/ArvinMei/py2so
pywhlobf,发行wheel混淆包不符合需求https://github.com/vkit-x/pywhlobf
置换CPython的opcode(定制解释器)可行,但实现复杂https://zhuanlan.zhihu.com/p/25850970
编译成 pyc很容易逆向python3 -O -m compileall demo
使用ast和astor进行混淆ast和astor不支持python3.10+部分语法,编写混淆器成本较大。
pyinstaller打包为二进制可执行文件可行
Python语言翻译为C,编译为dll实现较为复杂
代码跑起来之后把代码删了。--
  1. 【收费】Pyarmor、Nuitka。
  2. 【太老了】py2sec 一款轻量的脚本工具,基于 Cython 将 .py 编译成 run-time libraries 文件:.so (Linux && Mac),或 .pyd (Win)。一定程度上实现了“加密”保护源代码的需求。

https://github.com/cckuailong/py2sec

  1. 【不符合需求】pywhlobf 是一个 Python 代码混淆工具,输入一个 wheel 格式分发包 (也就是说,您首先得执行如 python -m build --wheel 的命令将项目打成 wheel 包,然后才能使用本工具),输出一个混淆后的 wheel 包,包中所有的 .py Python 文件将会编译替换为目标平台的二进制文件,从而达到混淆/保护代码的目的。https://github.com/vkit-x/pywhlobf
  2. 【方案可行,但需要深入实现】置换CPython的opcode(定制解释器)https://zhuanlan.zhihu.com/p/25850970
  3. 【很容易逆向】编译成 pyc
  4. 【可用pyinstaller】来自v2的phrack提供的python代码加密思路。

https://fast.v2ex.com/t/348602#r_4150953

  1. 【--】代码跑起来之后把代码删了。

使用Pyinstaller编译发行二进制可执行文件

  • 编写spec文件
# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    # 主程序
    ['app.py'],
    pathex=[],
    binaries=[],
    datas=[],
    # python引用不到、pyinstaller不支持的包需要在此声明。
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    # 输出的二进制文件名
    name='pack',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    # 使用upx压缩,否则失败。
    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,
)
  • 保持环境纯净,新建venv来打包。
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
  • 执行命令即可打包,二进制文件生成在dist中。
pyinstaller pack.spec
  • 直接执行sudo ./pack即可运行。
  • Docker部署,将pack放置于根目录即可。
FROM ubuntu:latest
WORKDIR /app
COPY . /app

CMD ["./pack"]
docker build -t pack .
docker run -d -p 5000:5000 pack
0

评论 (0)

取消