【问题标题】:Overriding a libc function using an injected dylib on OS X在 OS X 上使用注入的 dylib 覆盖 libc 函数
【发布时间】:2012-10-09 07:58:59
【问题描述】:

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

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

int puts ( const char * str ); 

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

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

这里有人可以指出我需要做什么才能调用我的覆盖版本吗?

【问题讨论】:

    标签: operating-system dylib libc mach-o


    【解决方案1】:

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

    要在运行时获得此功能,您需要显式使用函数插入。这是DYLD的一大特色。在您的库中,创建一个小部分:

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

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2013-04-05
      • 2015-03-29
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多