在运行时更改Mac OS进程中的功能参考



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

我尝试处理__linkedit段以获取动态符号表和字符串表。我用了以下指针,1. __linkedit段的vmaddrress,2. Mach_header和vmaddr_slide从" _dyld_register_func_for_add_image"回调,3. Symtab_command的Symoff和Stroff。

但我无法在__linkedit段中获取符号表和字符串表。有人可以对此提供一些启示吗?预先感谢。

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

  // 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网站政策,我们无法将您链接到它们。也就是说,上述代码段应该可以使用。请记住,这对其他迪利布(Dylibs)执行的打开电话将不起作用(尽管还有更多复杂的方法可以得到这一点)

最新更新