我需要创建一个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')
好的,我在这个文件中找到了调用图的根,但下一步该做什么?我如何实际获得此代码对象?
答案 0 :(得分:0)
功能类型是你想要的。您可以从types
模块(types.FunctionType
)或type(lambda:0)
获取该模块。在类型上执行help()
以查看创建函数对象所需的参数。
构建函数所需的主要内容是代码对象。您可以使用f
从现有函数f.func_code
获取该函数。如果要修改字节码,则需要创建一个新的代码对象来包含它。它的类型可以使用type()
和函数一样获得,并且对类型执行help()
将告诉您需要传递的内容。
如果您将新功能基于现有功能,那么您可以从现有功能中挖掘出您需要的大部分内容。请参阅inspect
模块文档中的this table,了解函数和代码对象的哪些属性包含您感兴趣的内容。