我在我的代码中挂了几个函数,直到今天才开始使用漂亮的代码,然后由于回调函数我遇到了一个错误。
让我们说..
如果我做的话
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方法。
我是对的吗?如果是这样,任何人都可以建议我解决方法吗?
答案 0 :(得分:0)
假设您正在使用LD_PRELOAD
挂钩函数,当您使用指针puts
时,指针可能绑定到链接器在链接时知道的版本,在标准库中,并且在预加载的库存在时不会被覆盖。我想不出任何绕过这个的方法。
答案 1 :(得分:0)
如果我们通过查看符号表并替换函数地址来挂钩,只要我们使用符号表中的符号条目进行函数调用,那么对应于符号条目就会起作用。如果我们直接使用函数地址(回调函数),它将无法工作。