技术背景
目前针对Python中主流的加密方案有以下几种:
序号 | 工具 | 方法描述 | 优缺点 |
---|---|---|---|
1 | Nuitka | .py 文件先被转成了 .c 文件,然后被编译成 .o 文件,最后合并成 .bin 可执行文件,从 bin 到 C 是不可逆的,从 C 到 Python 也是不可逆的,因此代码是安全的 | 工作量小,安全性高,使用加密之后的Python便捷;编译时间长,过程复杂 |
2 | 发行.pyc文件 | 通过compileall模块将.py文件转为.pyc文件,该文件是二进制,无法直接看源代码,而python解释器可以直接执行.pyc文件 | 台兼容性好,.py 能在哪里运行,.pyc 就能在哪里运行;解释器兼容性差,.pyc 只能在特定版本的解释器上运行。有现成的反编译工具,破解成本低 |
3 | 代码混淆(oxyry,pyobfuscate) | 让人看不懂代码,移除注释和文档,改变缩进,在tokens中间加入一定空格,重命名函数、类、变量,在空白行插入无效代码 | 提高了一点源码破解门槛。兼容性好,只要源码逻辑能做到兼容,混淆代码亦能;只能对单个文件混淆,无法做到多个互相有联系的源码文件的联动混淆 |
4 | py2exe | 将源码编译为 .pyc 文件,加之必要的依赖文件,一起打包成一个可执行文件。最终 py2exe 打包出的是二进制文件。 | 直接打包成 exe,方便分发和执行。破解门槛比 .pyc 更高一些;兼容性差,只能运行在 Windows 系统上。生成的可执行文件内的布局是明确、公开的,可以找到源码对应的 .pyc 文件,进而反编译出源码。 |
5 | Cython | 将 .py/.pyx 编译为 .c 文件,再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows) | 生成的二进制 .so 或 .pyd 文件难以破解。同时带来了性能提升;兼容性稍差,对于不同版本的操作系统,可能需要重新编译。虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高。 |
6 | Pyinstaller | 打包为exe文件, | 将Python文件转换为exe文件,以及dist文件夹和build文件夹,如果要移植到其他电脑上运行,也是只需要将这两个文件夹复制到对方电脑上,即使对方没有python环境,也可以运行程序,具有较好的兼容性;pyinstxtractor.py可以进行反编译 |
对于上述这些加密,在工作中,常见将一些Python写的脚本、程序使用Pyinstaller打包为exe文件的居多,因为即使对方没有python环境,也可以运行程序,具有较好的兼容性。
想要了解这些脚本、程序的逻辑、对其功能进行分析,最好的方法是其进行反编译解包。
解包思路
1.对exe文件进行解包
方法1:使用pyinstxtractor.py
执行python pyinstxtractor.py <待解包文件名> ,如果成功,即可获得<待解包文件名>_extracted 文件夹。
方法2:使用archive_viewer.py
执行python archive_viewer.py <待解包文件名> ,会打印EXE文件中包含的所有文件信息
使用x <文件名>命令将想要提取出的文件提取出来,q 命令退出。
区别:
方法1 可以一次性提取出所有文件,方法2只能逐个提取文件。但是在个人使用时,同时执行时会提示python版本问题,想要正常解包必须使用正确的python版本。
方法2 的成功率相对较高。可以先尝试用方法1,失败后用方法2。
2.构建pyc文件
从步骤1中获得的文件是pyc文件,我们还需要进一步反编译获得py文件。在将Python文件打包成exe文件的过程中,会抹去pyc文件前面的部分信息,所以我们在反编译之前需要检查并添加上这部分信息。抹去的信息内容可以从struct文件中获取:
可能会出现两种情况:
情况一:struct 文件中, E3 前 有内容:
这种情况将struct 文件中,E3 之前的 所有内容,复制到目标文件 E3 之前。
情况二:struct 文件中, E3 前 无内容
遇到这种情况后,在前面步骤1中,找到PYZ-00.pyz_extracted文件夹中任意一个pyc文件,记住前面的4个字节,在目标文件第一行输入前4个字节,后续补0。
将目标文件后缀名改为“.pyc”
3.对pyc文件进行反编译
安装uncompyle6后,去dos界面,输入uncompyle6 路径+文件名.pyc > 文件名.py
没有报错就表示成功了。
其他问题
q1:提示PYZ文件加密
在解包exe过程中会提示会出现PYZ中的文件无法正常提取(archive_viewer.py),或者提取出来后显示encrypted(pyinstxtractor.py)的问题
针对这个问题,可以使用上述方法,重新反编译PYZ文件的加密密钥pyimod00_crypto_key.pyc文件,就可以获得秘钥。
Pyinstxtractor不支持加密的pyz档案。目前,可以使用下面的代码片段来解密pyz提取目录中的加密pyc。请注意,下面的脚本是为在Python 2.7上运行而编写的,可以在PyInstaller之前的版本上运行
该脚本可以从任何Python版本反编译加密的pyc。但是,您需要从下面的列表中适当地更改pyc头。具体的事项可以去访问pyinstxtractor说明文档:Frequently Asked Questions · extremecoders-re/pyinstxtractor Wiki · GitHub
文章出处登录后可见!