使用Cython、pyinstaller防止反编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Cython、pyinstaller防止反编译相关的知识,希望对你有一定的参考价值。

参考技术A 本例在centos7测试通过

1、首先安装pyinstaller 及Cython

pip install pyinstaller

pip installer Cython

2、本例中文件结构:

.其中config.cfg为配置文件,datacheck.py为入口文件,file_config.py、method.py为需要引入文件。

├── config.cfg

├── datacheck.py

├── file_config.py

├── method.py

3、编辑build_pyd.py文件,内容如下:

from distutils.core import setup

from Cython.Build import cythonize

setup(

    name='datacheck',

    ext_modules=cythonize(["method.py", "file_config.py"])

    )

注意 ext_modules只填写引入文件,主运行文件不能写。

编辑后文件结构如下:

├── build_pyd.py

├── config.cfg

├── datacheck.py

├── file_config.py

├── method.py

4、生成so链接文件(如在windows则为pyd文件,未测试)

# python3 build_pyd.py build_ext --inplace

正常情况下会引入文件会生成so文件,文件结构如下:

.

├── build

│   └── temp.linux-x86_64-3.7

│      ├── file_config.o

│      └── method.o

├── build_pyd.py

├── datacheck.py

├── file_config.c

├── file_config.cpython-37m-x86_64-linux-gnu.so

├── file_config.py

├── method.c

├── method.cpython-37m-x86_64-linux-gnu.so

└── method.py

可以新建tmp目录,将datacheck.py及新生成的两个so文件拷贝,并针两个so文件 cpython-gnu去掉。tmp下文件结构如下:

├── datacheck.py

├── file_config.so

└── method.so

5、运行pyinstaller,生成二进制文件

# pythinsatller -F datacheck.py

加-F指生成单个文件。

6、修改datacheck.spec文件

在hiddenimports=加入引入的文件,如不加入,运行程序的时候会有如下提示:

Traceback (most recent call last):

  File "datacheck.py", line 7, in <module>

  File "file_config.py", line 1, in init file_config

ModuleNotFoundError: No module named 'method'

7、再次运行pyinstaller,生成新的二进制文件

# pyinstaller datacheck.spec

8、拷贝dist目录下的二进制文件,使用原来的cfg文件,即可单独运行。

Cython + PyInstaller 创建 EXE 文件

参考

  • Github上的例程

简介

  • 引入Cython的目的是:将部分python源码转译成c,然后编译成.pyd格式的动态链接库,避免软件核心逻辑被轻易反编译
  • 引入PyInstaller的目的,打包成exe,可选单个文件或目录

Python2.7 安装依赖

  • 本地环境是 Python2.7 和 Python3.8 并存,下面通过python2和pip2来引用全局python2.7
  • 安装 VC For Python 2.7
  • 全局安装 Cython,我这里用清华的镜像可以直接装:pip2 install cython
  • 全局安装 PyInstaller。这个稍微麻烦些,适合 python2.7 的最后一版是 3.6,直接用 pip2 install PyInstaller==3.6 未成功,只能手动安装。
  • 方法1:

    1. 从 PyPi 下载 3.6 版的 tar.gz 包,链接在此
    2. 解压到本地某目录,在该目录打开命令行窗口
    3. 执行 python2 setup.py install
  • 方法2:

    1. 下载非官方的 Windows 预编译轮子,在这里查找并下载 PyInstaller3.6 的 whl 文件
    2. 本地直接执行 pip2 install Path\\to\\PyInstaller-3.6-py2.py3-none-any.whl
  • 成功后可以直接命令行中执行 PyInstaller ,如果系统中也安装了 Python3 的 PyInstaller,那么可以用 python2 -m PyInstaller 调用
  • 至此,依赖环境已经就绪

构建

  • 把参考例程克隆到本地

    git clone https://github.com/prologic/pyinstaller-cython-bundling.git
    cd pyinstaller-cython-bundling
  • 项目中的 build.sh 不适用于 Windows,需要自行在命令行执行以下命令:

    1. 原脚本中的 pip install 步骤已经在依赖一节中完成,跳过
    2. 执行 python setup.py develop
    3. 执行 python2 -m PyInstaller -r file_a.so,dll,file_a.so -r file_b.so,dll,file_b.so -D ./bin/hello
      上面用-r参数指定输入文件,类型,名称,多个文件依次传入;-D 表示构建成目录,指定-F 可构建成单个EXE;最后是入口文件
  • 构建完成后可以在 dist 目录中找到生成的 hello.exe

Python3.8 安装VC相关依赖

  • 这个非常折腾,也可能是我自己的环境问题,仅供参考吧
  • 按照py2的步骤,会卡在setup.py步骤,报错说io.h找不到
  • 用everything全盘找了一下,确实没有适用的io.h
  • 按照这篇文章的方案,在VS2017中安装:

    • Visual C ++ Build 工具的核心功能。
    • VC++ 2017 v141工具集(x86,x64)
    • Visual C++ 2017 可再发行组件更新
    • 用于 Desktop C++ 的 Windows 10 SDK(10.0.16299.0)
      这一项非常重要,io.h只在这个版本号的SDK中
  • 需要使用开始菜单中VS2017的子菜单中,点击“适用于 VS2017的xxx命令行”项,在打开的命令窗口中进行构建,主要是要调用vcvarxxx.bat来设置构建环境。

以上是关于使用Cython、pyinstaller防止反编译的主要内容,如果未能解决你的问题,请参考以下文章

PyInstaller打包、解包与反编译.pyc文件

使用PyInstaller构建Cython编译的python代码。

Cython保护python代码

c#如何防反编译

如何有效的防止Java程序被反编译和破解

如何防止Android程序被反编译