Skip to content

Python 逆向指南

PyInstaller 逆向

使用 pyinstxtractor 工具进行解包,得到 Python 版本,然后使用对应版本的 Python 运行 pyinstxtractor.py 文件,即可解包。

首先,下载 pyinstxtractor.py 文件。

bash
python pyinstxtractor.py xxx.exe

可以使用下一代的 pyinstxtractor 项目,pyinstxtractor-ng,可以解包全版本的 PyInstaller 生成的文件,包括加密的文件。

逆向会得到很多 .pyc 文件,可以使用 Python 的反编译工具进行反编译。

字节码文件逆向

Python 使用 .pyc 文件存储字节码,与 Java 字节码类似,这种字节码并不安全,可以轻松反编译为 Python 源代码。

使用 Python 全版本的反编译 Decompyle++ 进行反编译,需要到 decompyle-builds 项目下载编译好的可执行文件,如 pycdc.exe

bash
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 文件编译为原生的库文件,从而防止代码被直接逆向。这是最简单实用的方法。
  • 通过混淆工具混淆代码/字节码,使得反编译工具无法识别。
  • 通过加密算法对核心文件进行加密,运行时解密。
  • 通过程序加壳,或者使用自定义虚拟机运行。