繁体   English   中英

无法挂钩回调功能?

[英]Cannot hook Callback function?

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

让我们说..

如果我做的事情

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方法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM