内嵌汇编的一些黑科技:访问自身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));
还可以干很多事啊,你们自己玩。。。嘿
发表评论