preload示例
# preload示例
参考csapp
preload_send.c
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <fcntl.h>
// #include <sys/socket.h>
int send(int s, const void * msg, int len, unsigned int falgs) {
// static int [1024];
static int index = 0;
// static psend = NULL;
typedef int (*sendfunc_t)(int, const void *, int, unsigned int);
// static int (*psend)(int, const void *, int, unsigned int) = NULL;
static sendfunc_t psend = NULL;
if(!psend) {
psend = (sendfunc_t)dlsym(RTLD_NEXT, "send");
if(!psend) {
printf("dlsym send fail\n");
exit(0);
}
int flags = fcntl(s, F_GETFL, 0);
printf("flags&O_NONBLOCK=%x, O_NONBLOCK=%x, flags=%x, len=%d\n", flags&O_NONBLOCK, O_NONBLOCK, flags, len);
}
int ret = len;
ret = psend(s, msg, len, falgs);
printf("ret=%d, len=%d\n", ret, len);
index++;
return ret;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
编译 (注:用g++编译会进行name mangling,符号名不是send)
gcc -o preload_send.so --shared -fPIC preload_send.c
1
运行
LD_PRELOAD=./preload_send.so ./program
1
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54