我正在使用调用Core Foundation功能的第三方库。
由于该lib有一个错误,将错误的值传递给CF函数,我需要拦截该调用来修复传递的值。
如何挂钩CF函数调用,以便查看传递的参数,更改它们然后调用实际(原始)函数?
我的印象是我可以使用CFBundleGetFunctionPointerForName
获取实际函数,将CFBundleGetMainBundle()
作为第一个参数并将CF函数的名称作为第二个参数传递。
在我的特定情况下,那将是:
void *p = CFBundleGetFunctionPointerForName (CFBundleGetMainBundle(), "CFRunLoopTimerCreate");
但是返回NULL。
我也试过这个:
void *p = CFBundleGetFunctionPointerForName (CFBundleGetBundleWithIdentifier("com.apple.Cocoa"), "CFRunLoopTimerCreate");
返回一个非空值,但它似乎仍然不是我可以改变的指针,而是函数代码的实际起始地址。
那么,我如何获得一个函数指针的地址到我可以保存的导入的API函数,然后更改为指向我的拦截函数?或者我怎么能挂钩到导入的函数?
答案 0 :(得分:1)
CFBundleGetFunctionPointerForName
将只返回给定包中函数的地址;这永远不会让你改变调用函数的目的地。如果你真的想做类似的事情,请参考Is it possible to hook API calls on Mac OS?请注意,这是强烈建议的。