无法挂钩回调功能?

时间:2011-10-27 14:53:01

标签: c++ c macos callback hook

我在我的代码中挂了几个函数,直到今天才开始使用漂亮的代码,然后由于回调函数我遇到了一个错误。

让我们说..

如果我做的话

puts("Hi!\n");

效果很好。我可以勾掉这个。

但如果我这样做......

typeof(puts) *fptr = puts;
fptr("Hi \n");

挂钩不起作用?

我正在使用OSX环境并搜索符号以便进行挂钩。 有人会建议我回调函数有什么问题吗?我应该做些什么来挂钩算法?

编辑:我做了一些调试,如果有以下信息可以提供一些意见的人。

我认为这可能是问题的根源?

bool Hook(const char *name, void *impl) {
    ...   
    void **EntryInAdressTable = find(name);
    if(EntryInAdressTable) {
        *EntryInAdressTable = impl;
    }
}
 ...
}

所以,这里发生了什么,我用我的实现更改了相应符号的Entry in地址表,并在我的实现中调用了原始函数。

所以,我的猜测是,如果我们使用回调函数,这意味着我们直接引用函数地址而不通过地址表,这就是为什么不调用hooked方法。

我是对的吗?如果是这样,任何人都可以建议我解决方法吗?

2 个答案:

答案 0 :(得分:0)

假设您正在使用LD_PRELOAD挂钩函数,当您使用指针puts时,指针可能绑定到链接器在链接时知道的版本,在标准库中,并且在预加载的库存在时不会被覆盖。我想不出任何绕过这个的方法。

答案 1 :(得分:0)

如果我们通过查看符号表并替换函数地址来挂钩,只要我们使用符号表中的符号条目进行函数调用,那么对应于符号条目就会起作用。如果我们直接使用函数地址(回调函数),它将无法工作。