Python代码真的不能加密吗?如何实现保护?

廖雪峰说 Python 代码不能加密,转换成 exe 加壳不算加密么?
如果不算,那怎么把转换的 exe 里的源码提取出来呢?
Python代码真的不能加密吗?如何实现保护?

24 回复

Python 不能直接编译成二进制文件,所谓的转换成 exe ,其实就是跟压缩软件打包一样,把代码打包在一起罢了。


Python代码当然可以加密保护,虽然无法做到像编译语言那样完全不可逆,但通过混淆和打包可以有效增加逆向难度。

最实用的方案是使用PyInstaller打包成可执行文件,配合代码混淆工具:

# 安装:pip install pyinstaller pyarmor
# 打包命令示例:
# pyinstaller --onefile --key=yourpassword main.py
# 混淆命令:
# pyarmor obfuscate main.py

对于核心算法,可以用Cython编译成二进制模块:

# setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize("core_module.pyx"))

商业项目常用方案是:PyArmor进行代码混淆 + PyInstaller打包成单文件 + 自定义加壳保护。Web服务部署的话,直接把源码放在服务器端,客户端只保留调用接口。

不过说实话,Python作为解释型语言,真要破解总有办法。关键代码建议用C扩展或者微服务隔离。

总结:混淆打包最实用,核心逻辑放服务端。

你用记事本打开看看,然后看一下其他语言编译的。

自己翻一下书、 google 一下就能搞明白的事情

pyc

我们一个工具因为怕被解密改用 go 写了,感觉不错

那怎么解包呢?

pyc 就看到几行无关紧要的代码

我小白不懂啊,打开 exe 是十六进制的

那取决于你的打包方式

exe 文件是可以解压的 本质上也是压缩包

可以。

我专门研究过这个问题, python 代码加密甚至可以做到比用汇编手写混淆,用 c 手写混淆更加难以解密。具体做法略复杂仅简单说个过程。

第一级别是源码级别的混淆,用 ast 和 astor ,再自己手写一个混淆器,三五百行的脚本直接混淆到几万行,整个文件面目全非,基本可以做到就算直接放脚本给你拿去逆,除非你再写出来一个逆向前面的混淆算法的脚本来逆(在熟悉 python 的情况下需要花几天,且不说需要了解程序构造原理),手动去调试脚本几乎达到不可行的地步(话费时间再乘以 2 )

第二级别是个性化定制 pyinstaller , pyinstaller 会打包所有需要的库,将脚本也包含进打包的 exe ,但是, pyinstaller 有一个 stub ,相当于一个启动器,需要由这个启动器来解密脚本和导入模块,外面有直接导出脚本的工具,但是那是针对 pyinstaller 自带的启动器做的,完全可以自己修改这个启动器再编译,这样逆向者就必须手动调试找到 main 模块。配合第一级别加密,呵呵,中国就算是最顶尖的逆向专家也要花个一两周,来破解我们的程序逻辑了,就我所知,实际上国内对于 py 程序的逆向研究不多。

第三级别是再上一层,将 py 翻译为 c 再直接编译 c 为 dll ,配合第一阶段先混淆再转 c 再编译,在第一步混淆之后,会产生非常多垃圾(中间层)函数,这些中间层函数在 c 这里会和 py 解释器互相调用,脚本和二进制之间交叉运行,本身混淆之后的源码就极难复原,再混合这一层,想逆向,难。

第四级别是利用 py 的动态特性,绝大多数逆向者都是 c ,汇编出身,对于程序的第一直觉就是,程序就是一条一条的指令,后一条指令必然在这一条指令后面,然而, py 的动态特性可以让代码逻辑根本就不在程序里面,这一点不想多讲,涉及到我一个项目里的深度加密。

第五级别,数学做墙。了解过比特币原理的知道要想用挖比特币就得提供大量算力去帮网络计算 hash ,这个成为 pow ,那么既然已经采用 py 了估计已经不考虑太多 cpu 利用率了,那就可以采用 pow (还有其他的手段)确保程序运行时拥有大量算力,如果程序被单步调试,呵呵,一秒钟你也跑不出来几个 hash 直接拉黑这个 ip (这个说法可能比较难理解,因为我第四层的加密没有说明,不过意思就是拒绝执行就对了)

以上讨论基于 windows py2.7 ,不过基本具有通用性,其他平台和版本处理步奏一样。

一般来说,混淆一下,然后 cython 编译,基本够用了。

请问 python 编译过后性能和未编译过是否有区别?当然是在都不好的基础上。

好复杂的样子, Google 的 Grumpy 可以把一般的 python 程序转译到 Go

计算密集型的过程,会加速,因为变成 c 代码编译了。你就当顺便提了个速。

关键代码还是建议换语言写,然后调用。普通的程序无所谓了,你把 python 的空格搅乱我就不想看了……

15 楼的方法亲测可行,而且成本比较低,写个脚本每次从源码生成 ELF 。不过代码里不能动态加路径到 sys.path ,记得 cython 好像不会处理这种情况,不知道是不是记错了。

廖雪峰 for president

以前在什么地方逛到过一个叫做 Nuitka ( http://nuitka.net/pages/overview.html )的东西,通过将 Python 代码编译成 C 程序,并通过调用 libpython 来实现,我没用过,但应该也可以起到一定混淆和加密的作用吧

加密方式

对 Python 加密时可能会有两种形式,一种是对 Python 转成的 exe 进行保护,另一种是直接对.py 或者.pyc 文件进行保护,下面将列举两种形式的保护流程。

1、 对 python 转 exe 加壳

下载最新版 Virbox Protector 加壳工具,使用加壳工具直接对 demo.exe 进行加壳操作

2、对.py/.pyc 加密

第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置后直接点击加壳。

第二步,对.py/.pyc 进行加密,使用 DSProtector 对.py/.pyc 进行保护。


安全技术:

l 虚拟机外壳:精锐 5 的外壳保护工具,创新性的引入了预分析和自动优化引擎,有效的解决了虚拟化保护代码时的安全性和性能平衡问题。

l 碎片代码执行:利用自身成熟的外壳中的代码提取技术,抽取大量、大段代码,加密混淆后在安全环境中执行,最大程度上减少加密锁底层技术和功能的依赖,同时大量大段地移植又保证了更高的安全性。

l Virbox 加密编译引擎:集编译、混淆等安全功能于一身,由于在编译阶段介入,可优化空间是普遍虚拟化技术无法比拟的,对代码、变量的混淆程度也有了根本的提升。

l 反黑引擎:内置 R0 级核心态反黑引擎,基于黑客行为特征 的(反黑数据库)反制手段。精准打击调试、注入、内存修改等黑客行为,由被动挨打到主动防护。

加密之后再尝试解压 log322.exe 失败,已经无法进行反编译,使用常规反编译工具也是无法进行分析的。


欢迎加群交流加密技术,获取 python 加密工具及文档:群号 730803578

回到顶部