so文件的.init_array段中添加代码

其实之前的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
// gcc sb.c -fPIC -shared -o libsb.so
#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
// gcc main.c -o main -L. -lsb
#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