如何完全反汇编Python源代码

时间:2015-08-13 13:38:58

标签: python python-2.7 disassembly

我一直在使用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) 库来反汇编一些Python源代码,但我发现这并没有递归到函数或类中:

 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()

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

byte_code

我无法弄清楚如何在不更改源文件和执行它的情况下执行此操作。我希望能够从已编译的dis.dis()中提取相关字节,并将它们传递给def sub_byte_code(byte_code, function_or_class_name): sub_byte_code = xxxxxx dis.dis(sub_byte_code)

dis.dis()

我考虑过包装源代码并执行source_code_dis = "import dis\n%s\ndis.dis(foo)\n" % (source_code) exec(source_code_dis) ,如下所示,但我不想执行脚本:

dis.dis(byte_code, recurse=True)

是否可能有一个技巧来调用它?例如typedef leap::float64 (DataReader::*getFonction)(); std::vector<getFonction> vec; std::vector<getFonction>::iterator it; vec.push_back(&DataReader::getLa); vec.push_back(&DataReader::getLon); for(it = vec.begin(); it<vec.end(); it++) std::cout << *it << std::endl;

2 个答案:

答案 0 :(得分:6)

将文件作为模块导入,并在该模块上调用dis.dis()

import dis
import test

dis.dis(test)

您也可以从命令行执行此操作:

python -m dis test.py

引用documentation for dis.dis

  

对于模块,它会反汇编所有函数。

答案 1 :(得分:4)

迟到的答案,但我很乐意在需要时找到它。如果要完全反汇编带有 函数而不导入 的脚本,则必须实现问题中提到的sub_byte_code函数。这是通过扫描byte_code.co_consts来查找types.CodeType文字来完成的。

以下内容完成了问题的脚本:

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)

结果将是这样的:

  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

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

相关问题