更改Mach-o二进制中的函数引用

时间:2012-09-26 20:21:14

标签: dynamic-linking mach-o

我需要将mach-o二进制函数的引用更改为我自己的dylib中定义的自定义函数。我现在关注的过程是,

  1. 将对旧功能的引用替换为新功能。例如_fopen_mopen使用sed。

  2. 我在MachOView中打开mach-o二进制文件,找到我想要更改的实体的地址。然后,我使用十六进制编辑器手动更改二进制文件中的信息。

  3. 有没有办法让这个过程自动化,即编写程序来读取符号,动态加载信息然后在可执行文件中更改它们。我正在查看/usr/include/mach-o处的mach-o头文件,但我不完全确定如何使用它们来获取此信息。存在任何库 - C或python有助于做同样的事情吗?

2 个答案:

答案 0 :(得分:2)

varrunr - 使用DYLD的插入,您可以轻松实现大部分(如果不是全部)功能。您可以创建自己的库,并声明插入函数,如此

// This is the expected interpose structure
typedef struct interpose_s {
    void *new_func;
    void *orig_func;
} interpose_t;

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

..而你只是实现你的开放。在插入函数中,对原始函数的所有引用都将起作用 - 这使得它成为包装器的理想选择。并且,您可以使用DYLD_INSERT_LIBRARIES强制插入您的dylib(与Linux上的LD_PRELOAD原理相同)。

答案 1 :(得分:2)

有趣的问题,我正在尝试做类似于静态的lib;看看this是否有帮助