在OS X上使用注入的dylib覆盖libc函数

时间:2012-10-09 07:58:59

标签: operating-system dylib libc mach-o

我试图用我自己的实现覆盖一些libc函数(例如:puts())。

我在dylib文件中定义了我自己的实现,如下所示。

int puts ( const char * str ); 

当我将我的二进制文件与Xcode中的dylib文件链接并构建时,我的被覆盖版本被调用。

但是,当我将dylib注入到我的二进制文件中时,我发现未调用被覆盖的版本。我已经验证了dylib是通过在dylib的入口点记录内容来加载的。

有人可以指出我需要做些什么来获取被覆盖的版本吗?

1 个答案:

答案 0 :(得分:2)

这是预期的行为,因为当您链接时,您的库优先于libSystem.B.dylib,这是导出puts的位置(作为libsystem_c和朋友的重新导出)。

要在运行时获取此信息,您需要明确使用函数插入。这是DYLD的一大特色。在您的库中,创建一个小部分:

static const interpose_t interposing_functions[] \
    __attribute__ ((section("__DATA, __interpose"))) = {
        { (void *)my_puts,  (void *) puts  } 
    };