访问自身Mach-O、调用函数等

2019-01-26  本文已影响2人  介和

转自: https://www.dllhook.com/post/249.html

内嵌汇编的一些黑科技:访问自身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));

上一篇 下一篇

猜你喜欢

热点阅读