(开发套件使用的是原HASP/SafeNet/金雅拓/泰雷兹加密狗开发工具)
(注:本文为Python程序保护的纯技术贴,欢迎留言探讨)
开发工具下载:
http://www.chinadlp.com/?list-DriveDownload.html
概述
使用圣天诺加密锁保护Python应用程序的方法:
1.Sentinel LDK Envelope 带 Sentinel LDK 数据文件保护(DFP)
此方法结合使用SentinelLDK加密锁Envelope外壳加密工具与版本2数据保护模式的数据文件加密工具(dfcrypt)来保护Python应用程序。这种方法的原理是将应用程序的Python代码视为受Envelope保护的Python解释程序访问的加密数据文件
2.Cython (https://cython.org/)后使用Sentinel LDK Envelope
此方法结合使用Cython与Sentinel LDK Envelope 来保护Python应用程序。这首先要将敏感的Python模块转换为原生模块(PYD/SO文件),然后使用Sentinel Envelope进行保护。
通常,上述第二种方法("Cython")可提供更高的安全级别,因为附加的编译步骤降低了代码的抽象级别,使Sentinel LDK Envelope可以将应用程序作为代码(而非数据)进行保护。这样可获得更复杂的保护措施。但是,第二种方法的设置稍微复杂一些,因为它需要Cython和有效的C编译器。
说明:这两种方法都不能保护应用程序的启动脚本,只能保护其Python模块。因此,建议将应用程序的实际入口点放在一个Python模块中并仅使用启动脚本调用该模块。
以下是详细介绍保护方法
第一种方法:
使用数据文件保护来保护Python应用程序
可以使用Sentinel LDK Envelope结合数据文件加密工具(dfcrypt)(版本2数据保护模式)保护Python应用程序。这种方法的原理是将应用程序的Python代码视为受Envelope保护的Python解释程序访问的加密数据文件。
保护Python应用程序包含以下步骤:
1.收集应用程序的Python字节码(PYC)模块。
2.使用Envelope外壳加密工具保护Python解释程序并包含数据文件保护模块,从而使解释程序可以执行加密的数据文件。
3.使用dfcrypt工具保护应用程序的Python字节码。
可以使用将受保护的解释程序与加密的代码封装在一起的方式分发受保护的应用程序(例如使用pyinstaller)。
说明:一定要保护编译的Python字节码(PYC文件),而不是明文Python源码(PY文件)。Python解释程序先将PY转换成PYC文件,然后再写到磁盘上以加快后续执行速度。如果提供的是受保护的PY文件而不是PYC文件,Python解释程序会生成明文PYC文件,然后将其写到磁盘,然后即可对其进行分析。
您可以在Windows或Linux下执行保护流程。本主题介绍了如何在Windows机器上执行这个流程。
代码示例
安装Sentinel LDK后,可在以下位置找到演示如何在Windows下保护Pyhton应用程序的示例:
%homepath%\Documents\Thales\Sentinel LDK version\Samples\Envelope\Python
此文件夹包含以下文件和文件夹:
>sample_app
此文件夹中包含一个简单的Python命令行应用程序,包括一个开始脚本(main.py)和三个模块(moduleA.py,moduleB.py,moduleC.py)。示例应用程序使用在Python2和Python3下运行完全相同的编写方式。
>data_file_protection
此文件夹包含以下文件:
•build_dfp_protected_python2_app.bat
此脚本使用试用开发商代码(DemoMA)、Sentinel LDK Envelope、dfcrypt和pyinstaller在Windows下为Python2保护和封装示例应用程序。
•envelope_python2.prjx
这是一个Envelope项目文件,指定了使用上面的脚本保护Python2解释程序(python27.dll)的设置。
•build_dfp_protected_python3_app.bat
此脚本使用试用开发商代码(DemoMA)、Sentinel LDK Envelope、dfcrypt 和pyinstaller在Windows下为Python3保护和封装示例应用程序。
•envelope_python3.prjx
这是一个Envelope项目文件,指定了使用上面的脚本保护Python3解释程序(python37.dll)的设置。
保护Python应用程序的流程
使用下面的步骤创建一个受保护的应用程序。
1.收集应用程序的字节码模块
使用"-d noarchive"开关为明文应用程序运行pyinstaller。例如:
pyinstaller -d noarchive main.py
此步骤收集应用程序的依赖关系并将它们编译成为Python字节码。"-d noarchive" 开关指示pyinstaller将编译的Python模块保留为独立的文件,这是后面的加密步骤的要求
此步骤的结果就是包含您的应用程序及其所有依赖关系的独立文件夹(dist/<application_name>)。
说明:较旧的pyinstaller版本不支持开关"-d noarchive"。如果有需要,请如下使用pip更新pyinstaller的版本:
pip install pyinstaller --upgrade
2.使用Envelope保护Python解释程序
使用SentinelLDK Envelope(数据文件保护版本2)保护Python解释程序共享库(DLL/SO)和数据文件保护支持。
在常规选项卡上,确保选择启用数据文件保护。确保已显示版本2。这可以将数据文件保护模块插入受保护的解释程序。这样受保护的Python解释程序可以执行加密的Python模块。
3.加密应用程序的Python字节码
使用dfcrypt工具和版本2数据保护模式加密应用程序的敏感字节码模块。例如:
dfcrypt --encrypt --encver:2 "--key:A secret" --vcf:DEMOMA.hvc --fid:0 dist/<application_name>/moduleA.pyc encrypted/moduleA.pyc
dfcrypt --encrypt --encver:2 "--key:A secret" --vcf:DEMOMA.hvc --fid:0 dist/<application_name>/moduleB.pyc encrypted/moduleB.pyc
虽然它不是强制性的,但建议您使用开关“--key:”为应用程序的所有模块指定公共加密密钥。这样的缓存逻辑可以大幅提高使用很多受保护模块的应用程序的启动速度。如果您不使用"--key:"开关,dfcrypt会为各个文件选择一个随机密钥。
加密字节码模块完成后,将原始文件更换为加密后的相应文件。例如:
copy encrypted/moduleA.pyc dist/<application_name>/
copy encrypted/moduleB.pyc dist/<application_name>/
有关更多信息,请参见 Sentinel LDK软件保护和授权指南中对于dfcrypt的描述。
分发应用程序
将受保护的输出文件复制到文件夹dist/<application_name>。
要部署受保护的应用程序,请复制文件夹dist/<application_name>到目标机器。
然后即可通过执行dist/<application_name>/<application_name>启动受保护的应用程序。
第二种方法:
使用Cython保护Python应用程序
可以结合使用Cython与Sentinel LDK Envelope来保护Python应用程序。这首先要将敏感的Python模块转换为原生模块(PYD/SO文件),然后使用Sentinel Envelope 进行保护。
使用Cython与Sentinel LDK Envelope保护Python应用程序包含以下步骤:
1.使用Cython将Python(PY)模块转换为C代码。
2.使用平台的C编译器将生成的C文件编译为原生Python扩展模块(PYD/SO)。
3.使用Sentinel LDK Envelope保护生成的Python原生扩展模块。
可以通过与应用程序启动脚本一起提供受保护的Python原生扩展模块来分发受保护的应用程序(例如使用pyinstaller)。
您可以在Windows或Linux下执行保护流程。本主题介绍了如何在Windows机器上执行这个流程。
代码示例
安装Sentinel LDK后,可在以下位置找到演示如何在Windows下使用Cython与Sentinel LDK Envelope保护Pyhton应用程序的示例:
%userprofile%\Documents\Thales\Sentinel LDK version\Samples\Envelope\Python\cythonize_and_envelope\
其中的脚本演示了如何保护一个简单的 Python应用程序,可在以下位置找到:
%userprofile%\Documents\Thales\Sentinel LDK version\Samples\Envelope\Python\sample_app
该示例应用程序是一个简单的Python命令行应用程序,包括一个开始脚本(main.py)和三个模块(moduleA.py,moduleB.py,moduleC.py)。为了方便演示Python2和Python3用例,此示例应用程序在两个版本下的行为是相同的。
cythonize_and_envelope文件夹包含:
>build_python2.bat
此脚本使用DEMOMA开发号、Cython、Microsoft Visual C++ Compiler for Python 2.7(https://www.microsoft.com/download/details.aspx?id=44266)、Sentinel LDK Envelope和pyinstaller在Windows下为Python2保护和封装示例应用程序。
>envelope_cythonized_py2modules.prjx
Sentinel LDK Envelope项目文件,该文件指定Envelope设置来保护由build_python2.bat脚本创建的Python原生扩展(moduleA.pyd,moduleB.pyd)。
>build_python3.bat
此脚本使用DEMOMA开发号、Cython、Microsoft Build Tools for Visual Studio 2019(https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019)、Sentinel LDK Envelope 和pyinstaller在Windows下为Python3保护和封装示例应用程序。
>envelope_cythonized_py3modules.prjx
Sentinel LDK Envelope项目文件,该文件指定Envelope设置来保护由build_python3.bat脚本创建的Python本原生扩展(moduleA.pyd,moduleB.pyd)。
保护流程
使用下面的步骤使用Cython和Sentinel Envelope创建一个受保护的应用程序。
1.使用Cython将Python模块(.py)模块转换为C代码。
将Python模块的扩展名从PY更改为PYX。这使cython可以生成Envelope能提供更好的保护的代码。
可以使用pip安装Cython:
pip install cython --upgrade
运行 cython并通过设置以下选项之一指示cython应将代码视为Python2还是Python3:
cython -2 --no-docstrings .\moduleA.pyx
cython -3 --no-docstrings .\moduleA.pyx
结果是将 Python模块表示为C代码(例如:moduleA.c)。
2.将生成的C文件编译为原生Python扩展
说明:C编译器必须与构建CPython的编译器一致。使用下面指定的编译器。
安装所需的编译器:
>Python2:用于Python2.7的Microsoft Visual C++编译器
https://www.microsoft.com/download/details.aspx?id=44266
>Python3:用于Visual Studio 2019的Microsoft构建工具
https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019
打开一个命令行解释器,并通过执行以下命令将其转换为开发提示:
>Python2:
"%userprofile%\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat" amd64
>Python3:
"C:\<vs_build_tools_install_dir>\VC\Auxiliary\Build\vcvarsall.bat" amd64
在开发提示中运行以下命令以编译和链接 C 代码:
>Python2:
cl /nologo /c /MD /Ox /W3 /I C:\Python27\include moduleA.c
link /nologo /dll -out:moduleA.pyd C:\Python27\libs\python27.lib moduleA.obj
>Python3:
cl /nologo /c /MD /Ox /W3 /IC:\Python37\include moduleA.c
link /nologo /dll -out:moduleA.pyd C:\Python37\libs\python37.lib moduleA.obj
结果就是Windows版的原生Python扩展模块(moduleA.pyd)。
3.使用Sentinel LDK Envelope保护生成的Python扩展模块
使用Sentinel LDK Envelope保护生成的Python扩展模块与保护常规DLL文件的方式相同。
附件:下面为添加程序到外壳加密工具的一般方法
添加程序到项目
要保护一个程序,您必须将其添加到Sentinel LDK Envelope项目中。下述步骤适用于Windows应用程序、.NET程序集以及Java可执行程序。
要添加程序:
1.单击“项目”窗格中的程序图标。随即显示“程序”屏幕。
2.单击程序屏幕中的添加程序。随即显示添加程序对话框。
3.在添加程序对话框中,进入目标程序的位置。您可以选择将多个程序添加到项目中。
Envelope支持对下列文件类型的保护:
•Windows和.NET可执行文件(*.exe)
•Windows和.NET动态链接库(*.dll)
•Python DLLs(*.pyd)
•AutoCAD插件(*.arx)(由Windows V3引擎支持)
•Java归档,Web应用程序架构,企业归档(*.jar、*.war、*.ear)
4.选择要保护的程序,然后单击打开。“添加程序”对话框随即关闭,同时,程序条目将显示在“程序”屏幕和“项目”窗格中。
5.对要包括到项目中的所有程序或应用程序重复步骤2到4。
说明:您可以直接将要保护的一个或多个文件拖放到“程序”屏幕和“项目”窗格中。
尝试将.NET程序集添加到项目中时,操作可能会失败,并出现以下错误消息:必要程序集[assemblyProperties]未找到
如果出现这种情况,请转至“设置”对话框(文件>设置)下的“.NET目录”选项卡下。添加一个内含指定程序集的搜索路径,然后尝试将该.NET程序集再次添加至项目中。
Sentinel LDK Envelope将自动确定已添加到项目中的程序的类型。Win32和Windows x64程序、.NET程序集以及Java可执行程序在“项目”窗格中均以特定图标加以标识。
您可以对添加到项目中的每个程序应用程序选项。