首先,我想要拦截iOS应用程序的任意标准C函数(如fopen,read,write,malloc,...)。
我有一个带有此代码的libtest.dylib:
typedef struct interpose_s {
void *new_func;
void *orig_func;
} interpose_t;
FILE *vg_fopen(const char * __restrict, const char * __restrict);
static const interpose_t interposing_functions[] \
__attribute__ ((section("__DATA, __interpose"))) = {
{ (void *)vg_fopen, (void *)fopen },
};
FILE *vg_fopen(const char * __restrict path, const char * __restrict mode) {
printf("vg_fopen");
return fopen(path, mode);
}
编译完dylib后,我转到主机iOS应用程序的二进制文件,并将LC_LOAD_DYLIB添加到LC_LOAD_COMMANDS列表的末尾,并将其指向@ executable_path / libtest.dylib
我期望它会覆盖fopen的实现,并在调用fopen时打印“vg_fopen”。但是,我没有得到它,所以插入可能已经失败了。
我想知道可能是什么原因。这仅供内部开发用于学习目的,因此请不要提及有关不当使用的影响或警告我。
提前致谢。
答案 0 :(得分:3)
来自dyld
source:
// link any inserted libraries
// do this after linking main executable so that any dylibs pulled in by inserted
// dylibs (e.g. libSystem) will not be in front of dylibs the program uses
if ( sInsertedDylibCount > 0 ) {
for(unsigned int i=0; i < sInsertedDylibCount; ++i) {
ImageLoader* image = sAllImages[i+1];
link(image, sEnv.DYLD_BIND_AT_LAUNCH, ImageLoader::RPathChain(NULL, NULL));
// only INSERTED libraries can interpose
image->registerInterposing();
}
}
所以不,只有通过DYLD_INSERT_LIBRARIES
插入的库才会应用它们。