为 ELF 二进制文件反编译 Python

逆向工程 Python 反编译器
2021-06-17 08:47:13

有多种解决方案可用于从 Windows 二进制文件中提取 Pyc 文件,然后使用 uncompyle2 或 uncompyle6 反编译它们。

但是,我有一个 Linux ELF 64 位二进制文​​件,它是使用用于 Python 的打包程序之一编译的(可能是 CX Freeze 或 PyInstaller)。我不确定确切的包名称。

更新:

文件命令输出:

bin: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=212a49c7fff7342713aec6af6789abbaf3a8014, stripped

我还有一个名为 libpython2.7.so.1.0 的 .so 文件,我认为它是 python 解释器。

二进制文件中还有一个 .pydata 部分,如下所示:

 [27] pydata            PROGBITS         0000000000000000  00007a48
       00000000000a0c47  0000000000000000           0     0     1

二进制文件中包含字符串,如下所示:

Py_SetPythonHome
Cannot dlsym for Py_SetPythonHome
Error loading Python lib '%s': dlopen: %s
Error detected starting Python VM.
libpython2.7.so.1.0

所以,我很确定它是编译成 Linux 二进制文件的 Python 代码。

这些项目都不适合我。

  • unfrozen_binary - 给出一个错误,因为在 common.py 中它导入了不可用的反编译库。

  • pyThaw - 它利用了radare2,但是当我将它与我的二进制文件一起使用时,它只是挂起并且不提取源代码。

是否有任何替代解决方案可以使用 Linux 的 python 字节码反编译此类精灵二进制文件?

2个回答

可以肯定地说,你的二进制文件是用 PyInstaller 编译的。搜索字符串“检测到启动 Python VM 时出错”。导致PyInstaller repo

现在您知道它是 PyInstaller,您可以查看这里,它描述了 PyInstaller 的工作原理以及二进制文件的打包方式。简而言之,这里是重要的部分

PyInstaller 中使用了两种归档文件。一个是 ZlibArchive,它允许有效地存储 Python 模块,并通过一些导入钩子直接导入。另一个是 CArchive,类似于 .zip 文件,这是一种打包(并可选择压缩)任意数据块的通用方法。它之所以得名,是因为它可以很容易地从 C 和 Python 中操作。这两个派生自一个共同的基类,使得创建新类型的档案变得相当容易。

文档建议使用该工具pyi-archive_viewer来检查 PyInstaller 二进制文件。

使用以下pyi-archive_viewer命令检查任何类型的存档:

pyi-archive_viewer archivefile

使用此命令,您可以检查使用 PyInstaller(PYZ 或 PKG)或任何可执行文件(.exe 文件或 ELF 或 COFF 二进制文件)构建的任何存档的内容

这是你现在可以尝试的。对于 Windows,有等效的工具pyinstxtractor(我是作者),但不幸的是,目前不支持 ELF。

显然,一种这样的替代方法是手动提取 python 代码/字节代码。

由于集成 python 解释器和/或字节码编译器需要一些工程,许多解决方案往往更喜欢简单的方法。尽管作为混淆措施将 Python 代码转换为可执行文件的情况可能并非如此,但对于大多数 Python 到可执行文件的转换器(例如 py2exe、PyInstaller 等)来说,这绝对是这种情况。

我提到的简单方法是将 python 解释器作为一个整体,将原始文件pypyc文件提取到临时目录并使用 python 解释器执行提取的代码。

了解您的样本是否是这种情况应该很容易通过进程监控或调试来完成,并且也应该可以通过静态逆向工程(众所周知,这是硬编码方式)。


附带说明一下,您正在查看的文件可能是使用其中一种可用工具生成的,但随后进行了一些调整,使其无法被常见的提取器识别或解析。您可以尝试通过查看文件结构类似于任何 python 可执行构建器来尝试处理该问题。