其实之前的Android linker文章中有提到,但是没有实际写过时间长了就忘记了。so文件是一个elf格式的文件,在so被加载之前,会执行init段的代码。在结束的时候,会执行fini段的代码。这个技术一般是用来解密加壳文件的,我遇到的场景是加沙箱,下面就介绍一下实现方法。
1.so源文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> void sandbox_init(void) __attribute__((constructor)); void sandbox_fini(void) __attribute__((destructor));
void log_func(const char *m) { printf("log_func: %s\n", m); }
void sandbox_init(void) { printf("sandbox init\n"); }
void sandbox_fini(void) { printf("sandbox fini\n"); }
|
2.头文件
1 2 3 4
| #ifndef _MY_SO_HEADER_ #define _MY_SO_HEADER_ void log_func(const char *m); #endif
|
3.main文件
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> #include "sb.h"
int main(int argc, char* argv[]) { printf("main start\n"); log_func("main"); printf("main exit\n"); return 0; }
|
4.执行
1 2 3 4 5 6
| $ ./main sandbox init main start log_func: main main exit sandbox fini
|