python字节码文件_从字节码重新组装.py文件

关于uncompyle6的作用有一些混乱。它以Pythonbytecode开头,如果是python3.6或更高版本,则更准确地说是“wordcode”。或者,它通常用于反编译Python编译的包含字节码的文件。在

从上面所展示的内容来看,我相信您要做的是从Python正在运行的版本附带的(并且只完全适用于)特定于版本的反汇编程序生成的字节码的text表示。在

下面是您从uncompyle6得到上述奇怪的“Import Error”消息的原因。它查看文本文件的开头,这个文件被奇怪地称为Python编译的文件。该文件以ASCII编码的字符串“1”开头,uncompyle6根据特定的format for Python compiled file进行解释,其中文件的开头包含某种Python编码的版本字符串,技术上称为“幻数”。在

别担心,我已经写了一些工具,让你更接近你想去的地方。具体地说,我编写了一个Python交叉版本的汇编程序来匹配Python的内置反汇编程序。在

这是我的github项目python-xasm。在

使用它,您可以生成可以运行的真正的Python字节码。如果你写的代码确实像Python吐出来的代码,那么它很可能可以反编译回高级Python。在

然而,xasm目前确实需要比上面提到的更多的帮助。具体地说,它不会从操作码名称猜出它们属于哪个Python版本。将操作码名称与可接受的Python版本相匹配比您想象的还要困难。如果您看到LOAD_CONST,您还需要考虑这条指令是占用2个字节还是3个字节。如果为2,则为python3.6或更高版本,否则为Python<3.6。如果这还不够难的话,某些版本的Python会更改特定操作码名称的操作码值!因此,您可能无法准确确定某个程序集来自哪个Python解释器。但我假设你不在乎,只要你提出的是一致的。在

所以,有了以上的问题,现在回来解决你的问题。在

首先生成真正的字节码。你可以这样做import py_compile

py_compile.compile("/tmp/test.py", "/tmp/test.pyc", 'exec')

现在,不要使用内置的python反汇编程序,而是使用我编写的跨版本反汇编程序,它与xdis一起名为pydisasm,并使用asm选项,该选项将以xasm友好的方式输出程序集:

^{pr2}$

注意文件顶部注释中的所有附加信息,其中包含一些非常神秘的东西,比如“堆栈大小”和“标志”。这个

其他大部分内容都需要存储在Python字节码文件中。在

所以把它保存到一个文件中,然后然后就可以将其组装成字节码。然后反编译它。在$ ./xasm/xasm_cli.py /tmp/test.pyasm

Wrote /tmp/test.pyc

$ uncompyle6 /tmp/test.pyc

# uncompyle6 version 3.2.6

# Python bytecode 3.6 (3379)

# Decompiled from: Python 3.6.5 (default, Aug 12 2018, 16:37:27)

# [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]

# Embedded file name: exec

# Compiled at: 2019-04-05 15:34:01

# Size of source mod 2**32: 23 bytes

a = 1

b = 2

print(a + b)

# okay decompiling /tmp/test.pyc

我在哥伦比亚省麦德林市的Pycon2018上做了一次闪电式的演讲。很抱歉你错过了,但是你可以在这里找到它的视频http://rocky.github.io/pycon2018-light.co

它展示了如何:从ASCII编码的Python源文本生成Python编译文件

修改它以删除尾部递归

把它写回Python编译的文件中,然后

运行代码。在

当然,你不能反编译它,因为Python很难很好地模仿这一点,它是手工修改的。在

最后,您似乎还对字节码和源代码之间的关系感兴趣。因此,我将提到uncompyle6有选项tree和更详细的grammar,它将显示从Python字节码重建Python所采取的步骤。在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值