如何从字节码中获取函数代码对象?

时间:2017-10-03 18:35:22

标签: python disassembly

我需要创建一个python函数的调用图,然后修改一些函数的字节码。

我开始使用反汇编,发现函数是由MAKE_FUNCTION操作码生成的,代码对象以某种方式传递给它

 32          96 LOAD_CONST              25 ((None, None, True, 'off', None, False))
             98 LOAD_CONST              15 (<code object foobar at 0x7fc46bff6d20, file "foo.py", line 25>)
            100 LOAD_CONST              16 ('foo')
            102 MAKE_FUNCTION            1
            104 STORE_NAME              15 ('fun')

好的,我在这个文件中找到了调用图的根,但下一步该做什么?我如何实际获得此代码对象?

1 个答案:

答案 0 :(得分:0)

功能类型是你想要的。您可以从types模块(types.FunctionType)或type(lambda:0)获取该模块。在类型上执行help()以查看创建函数对象所需的参数。

构建函数所需的主要内容是代码对象。您可以使用f从现有函数f.func_code获取该函数。如果要修改字节码,则需要创建一个新的代码对象来包含它。它的类型可以使用type()和函数一样获得,并且对类型执行help()将告诉您需要传递的内容。

如果您将新功能基于现有功能,那么您可以从现有功能中挖掘出您需要的大部分内容。请参阅inspect模块文档中的this table,了解函数和代码对象的哪些属性包含您感兴趣的内容。