当源不可用时调试python字节码

时间:2015-09-09 17:51:16

标签: python debugging reverse-engineering bytecode bytecode-manipulation

我需要调试已编译的python脚本(pyc文件)。 原始来源不可用。

有没有办法直接调试字节码?

我能找到的最接近的事情就是在启用LLTRACE的情况下构建python。这种技术的缺点是我无法控制执行,这不是真正的调试,因为单步执行,设置断点不可用。

另一种可能的技术是this,但同样的原因也不适合。

请注意,由于字节码被混淆,因此无法对pyc进行反编译并调试结果。

2 个答案:

答案 0 :(得分:2)

是的,当没有源代码时,可以调试Python pyc文件。

我写的调试器可以做到这一点。请参见https://rocky.github.io/pycon2018.co/#/18和周围的幻灯片。

混淆是一个单独的问题。问题在于混淆是什么。

如果只是将代码对象“ co_names”表中的品种变量名foo替换为; os.system("rm -fr"),那么这很容易处理,因为; os.system("rm -fr")不是有效的标识符名称。

实际上,这比反编译过程要容易处理。有关这方面,请参见https://github.com/rocky/python-xdis/issues/58

但是即使没有混淆,调试器也可以工作。源文本看起来很时髦。但是,您始终可以使用反汇编来解决源代码的外观。

Python调试器trepan2trepan3k还提供了在调试器中的反汇编功能。

答案 1 :(得分:1)

有一个用 Python 编写的字节码解释器,适用于许多版本的 Python 字节码。它被称为 xpython,并且有一个类似于 gdb 的调试器,称为 trepan-xpy,它允许您逐步执行字节码指令并在逐步执行时查看评估堆栈。

但是请注意,所有这些都是 alpha 质量,并不是 Python 运行时的所有功能都运行良好。 Python 3.4 到 Pyton 3.6 的 Python 字节码的覆盖范围非常好。随着您向前推进,运行时功能的覆盖率会下降。当你向后移动时,2.x 范围内的情况仍然很好。 Python 3.0 一直很奇怪。

尽管代码支持运行 Python 跨版本,例如您可以通过在 Python 3.9 中运行解释器来解释 Python 3.5 字节码,反之亦然,如果您使用正在解释的字节码运行解释器,您将获得最佳结果.

这样做的原因很简单,解释器使用的库与解释字节码中导入的库没有完全分离。

如果有重要的共享库,也可能会变得很糟糕。