在运行时更改Mac OS Process中的函数引用

时间:2012-11-04 03:55:14

标签: macos mach-o

我需要在运行时将Mac OS进程中的函数引用更改为我自己的自定义dylib中定义的自定义函数。我保持新的功能签名与原始签名相同。 例如,我需要将“打开”功能更改为“myopen”功能。

我尝试处理__LINKEDIT段以获取动态符号表和字符串表。 我使用了以下指针, 1.来自__LINKEDIT段的VMAddrress, 2.来自“_dyld_register_func_for_add_image”回调的mach_header和vmaddr_slide, 3. symtab_command的symoff和stroff。

但是我无法获得__LINKEDIT细分中提到的符号表和字符串表。 有人可以对此有所了解吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果有问题的函数是库函数,而不是静态编译到可执行文件中,则不需要执行任何操作 - 您可以使用函数插入。具体来说,将其添加到您的库中:

  // The attribute creates a Mach-O Section in your library - q.v. libgmalloc.dylib for 
  // a nice example
    static const interpose_t interposing_functions[] \
        __attribute__ ((section("__DATA, __interpose"))) = {
            { (void *)my_open,  (void *)open  },
            { (void *)my_close, (void *)close }, // .. etc
        };


int  my_open(const char *path, int flags, mode_t mode)
{

    int rc;
    // Prolog - do something before open

    rc = open(path, flags, mode); // call real open

    // Epilog - record rc, etc..    

    return rc;
}

有几本关于OS X内部的优秀书籍可以为您提供样本,但显然根据S.O网站政策,我们无法将您链接到他们。也就是说,上面的代码片段应该可行。请记住,这对于其他dylib执行的打开调用不起作用(尽管有更复杂的方法可以实现这一点)