内嵌汇编的一些黑科技:访问自身Mach-O、调用函数等

从dyld里面学来的

获取代码段的起始、结束位置

可以用来做代码段校验

typedef void (*Initializer);
extern const Initializer  inits_start  __asm("section$start$__TEXT$__text");
extern const Initializer  inits_end    __asm("section$end$__TEXT$__text");

NSLog(@"inits_start:%p", &inits_start);
NSLog(@"inits_end:%p", &inits_end);

调用构造函数

__attribute__((constructor)) void init_funcs()
{
    printf("--------init funcs.--------\n");
    
    printf("--------init done--------\n");
}

__attribute__((constructor)) void init_funcs2()
{
    printf("--------init funcs2.--------\n");
    
    printf("--------init done2--------\n");
}

typedef void (*Initializer)(int argc, const char* argv[], const char* envp[], const char* apple[]);
extern const Initializer  inits_start  __asm("section$start$__DATA$__mod_init_func");
extern const Initializer  inits_end    __asm("section$end$__DATA$__mod_init_func");

NSLog(@"inits_start:%p", &inits_start);
NSLog(@"inits_end:%p", &inits_end);

for (const Initializer* p = &inits_start; p < &inits_end; ++p) {
    (*p)(argc, argv, NULL, NULL);
}

获取函数地址并调用

不仅能获取节的数据,还能获取函数地址并调用。

int Func(int a, int b) {
    return a + b;
}
int myFunc(int a, int b) __asm("_Func");

int myprintf(const char * __restrict, ...) __asm("_printf");

myprintf("%s", "www.dlllhook.com");
NSLog(@"ret=%d", myFunc(1, 2));

还可以干很多事啊,你们自己玩。。。嘿

你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。