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

Posted

技术标签:

【中文标题】更改 Mach-o 二进制文件中的函数引用【英文标题】:Changing function reference in Mach-o binary 【发布时间】:2012-09-26 20:21:13 【问题描述】:

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

    将对旧函数的引用替换为新函数。例如 _fopen_mopen 使用 sed。

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

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

【问题讨论】:

【参考方案1】:

有趣的问题,我正在尝试做一些类似于静态库的事情;看看this 有没有帮助

【讨论】:

【参考方案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  
    ;

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

【讨论】:

谢谢。有没有关于干预的在线文档? 只有我知道的文档在那本书中,我猜你可以找到或购买一本电子书。 Apple 在 libgmalloc(malloc 保护库)中使用了插入,但除此之外,它显然只供开发人员使用。

以上是关于更改 Mach-o 二进制文件中的函数引用的主要内容,如果未能解决你的问题,请参考以下文章

iOS系统分析Mach-O二进制文件解析

为啥 32 位内核可以运行 64 位二进制文​​件?

iOS逆向之Mach-O文件(上)

通过Mach-O文件结构看iOS堆栈信息

通过Mach-O文件结构看iOS堆栈信息

iOS逆向之Mach-O文件(下)