更改 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 二进制文件中的函数引用的主要内容,如果未能解决你的问题,请参考以下文章