如何拦截应用程序中的OS X API调用

时间:2015-11-25 20:06:01

标签: macos

我正在使用调用Core Foundation功能的第三方库。

由于该lib有一个错误,将错误的值传递给CF函数,我需要拦截该调用来修复传递的值。

如何挂钩CF函数调用,以便查看传递的参数,更改它们然后调用实际(原始)函数?

我的印象是我可以使用CFBundleGetFunctionPointerForName获取实际函数,将CFBundleGetMainBundle()作为第一个参数并将CF函数的名称作为第二个参数传递。

在我的特定情况下,那将是:

void *p = CFBundleGetFunctionPointerForName (CFBundleGetMainBundle(), "CFRunLoopTimerCreate");

但是返回NULL。

我也试过这个:

void *p = CFBundleGetFunctionPointerForName (CFBundleGetBundleWithIdentifier("com.apple.Cocoa"), "CFRunLoopTimerCreate");

返回一个非空值,但它似乎仍然不是我可以改变的指针,而是函数代码的实际起始地址。

那么,我如何获得一个函数指针的地址到我可以保存的导入的API函数,然后更改为指向我的拦截函数?或者我怎么能挂钩到导入的函数?

1 个答案:

答案 0 :(得分:1)

CFBundleGetFunctionPointerForName将只返回给定包中函数的地址;这永远不会让你改变调用函数的目的地。如果你真的想做类似的事情,请参考Is it possible to hook API calls on Mac OS?请注意,这是强烈建议的。

相关问题