首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何完全反汇编Python源代码

如何完全反汇编Python源代码
EN

Stack Overflow用户
提问于 2015-08-13 21:38:58
回答 1查看 7.3K关注 0票数 10

我一直在尝试使用dis库来反汇编一些Python源代码,但我发现这不会递归到函数或类中:

代码语言:javascript
复制
import dis

source_py = "test.py"

with open(source_py) as f_source:
    source_code = f_source.read()

byte_code = compile(source_code, source_py, "exec")
dis.dis(byte_code)

我看到的所有条目如下:

代码语言:javascript
复制
 54         456 LOAD_CONST              63 (<code object foo at 022C9458, file "test.py", line 54>)
            459 MAKE_FUNCTION            0
            462 STORE_NAME              20 (foo)

如果源文件有一个函数foo(),我显然可以在源文件中添加如下内容:

代码语言:javascript
复制
dis.dis(foo)

如果不改变源文件并执行它,我不知道如何做到这一点。我希望能够从编译后的byte_code中提取相关的字节,并将它们传递给dis.dis()

代码语言:javascript
复制
def sub_byte_code(byte_code, function_or_class_name):
    sub_byte_code = xxxxxx
    dis.dis(sub_byte_code)

我已经考虑过包装源代码并执行dis.dis(),如下所示,但我不希望执行脚本:

代码语言:javascript
复制
source_code_dis = "import dis\n%s\ndis.dis(foo)\n" % (source_code)
exec(source_code_dis)

这是不是有个小窍门呢?例如dis.dis(byte_code, recurse=True)

EN

回答 1

Stack Overflow用户

发布于 2018-06-03 05:29:20

回答晚了,但我会很高兴在需要的时候找到它。如果你想在不导入的情况下完全反汇编一个带有函数的脚本,你必须实现问题中提到的sub_byte_code函数。这是通过扫描byte_code.co_consts来查找types.CodeType文字来完成的。

下面完成了问题中的脚本:

代码语言:javascript
复制
import dis
import types

source_py = "test.py"

with open(source_py) as f_source:
    source_code = f_source.read()

byte_code = compile(source_code, source_py, "exec")
dis.dis(byte_code)

for x in byte_code.co_consts:
    if isinstance(x, types.CodeType):
        sub_byte_code = x
        func_name = sub_byte_code.co_name
        print('\nDisassembly of %s:' % func_name)
        dis.dis(sub_byte_code)

结果会是这样的:

代码语言:javascript
复制
  1           0 LOAD_CONST               0 (<code object foo at 0x02CB99C0, file "test.py", line 1>)
              2 LOAD_CONST               1 ('foo')
              4 MAKE_FUNCTION            0
              6 STORE_NAME               0 (foo)

  4           8 LOAD_NAME                0 (foo)
             10 LOAD_CONST               2 (42)
             12 CALL_FUNCTION            1
             14 STORE_NAME               1 (x)
             16 LOAD_CONST               3 (None)
             18 RETURN_VALUE

Disassembly of foo:
  2           0 LOAD_FAST                0 (n)
              2 UNARY_NEGATIVE
              4 RETURN_VALUE

编辑:从Python3.7开始,dis.dis反汇编函数并递归地执行此操作。dis.dis有一个depth附加参数来控制要反汇编的函数定义的深度。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31989893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档