Python 逆向指南
PyInstaller 逆向
使用 pyinstxtractor 工具进行解包,得到 Python 版本,然后使用对应版本的 Python 运行 pyinstxtractor.py
文件,即可解包。
首先,下载 pyinstxtractor.py
文件。
python pyinstxtractor.py xxx.exe
可以使用下一代的 pyinstxtractor 项目,pyinstxtractor-ng,可以解包全版本的 PyInstaller 生成的文件,包括加密的文件。
逆向会得到很多 .pyc
文件,可以使用 Python 的反编译工具进行反编译。
字节码文件逆向
Python 使用 .pyc
文件存储字节码,与 Java 字节码类似,这种字节码并不安全,可以轻松反编译为 Python 源代码。
使用 Python 全版本的反编译 Decompyle++ 进行反编译,需要到 decompyle-builds 项目下载编译好的可执行文件,如 pycdc.exe
。
pycdc xxx.pyc
uncompyle6 是另外一个知名的反编译工具,可以反编译 Python 2.7 到 Python 3.8 的 .pyc
文件。
库文件逆向
类似 .pyd
文件为 Python 的动态链接库文件,相当于原生的 .dll
文件,可以使用 IDA Pro 进行逆向分析。其代码可能由 C/C++ 编写,也可能原本由 Python 编写,但代码已经完全转换为 C 代码并被编译,无法被直接逆向为源代码。
反混淆
PJOrion 是一个专门用于 Python 混淆代码的工具,已经有许多工具能够对其进行反混淆,如 PjOrion-Deobfuscator bytecode_simplifier。
一般 Python 混淆工具都是通过修改 Python 源码来实现的,例如像 JavaScript 源码压缩,使得变量和调用过程无法被理解。但是仍然能获得源码。
少部分通过混淆字节码的方式,使得反编译工具无法识别。
加密逆向
常见的可能有:
- 被
pyinstaller
自带的--key
加密,可以使用pyinstxtractor-ng
解包 - 资源或者代码被加密算法加密(如 RSA)
- 使用 Cython 编译或使用 Nuitka 等语言转换工具编译
对于前两种情况,一般容易破解,根据加密策略对应找到加密方法进行解密,网上也有很多教程。
反逆向指南
通过上述内容总结,可以得到一些防止 Python 代码被逆向的方法:
- 可以通过 Cython 或 Nuitka 将 Python 文件编译为原生的库文件,从而防止代码被直接逆向。这是最简单实用的方法。
- 通过混淆工具混淆代码/字节码,使得反编译工具无法识别。
- 通过加密算法对核心文件进行加密,运行时解密。
- 通过程序加壳,或者使用自定义虚拟机运行。