不太确定把它放在哪里,因为它不完全是一个答案,但也许它会让你朝着正确的方向前进。这是一些 shim/hooks 的代码fork()
,用 C 语言编写。在这种情况下,它是为了检测沙盒程序是否分叉超过两次而编写的,但显然您可以根据需要修改行为。
#define MAKE_CALLTHROUGH(fx, libfx) \
do{ \
void *handle = NULL; \
if(!libfx){ \
handle = dlopen("/lib64/libc.so.6", RTLD_LAZY); \
if(!handle){ \
fputs(dlerror(), stderr); \
exit(1); \
return 0; \
} \
libfx = dlsym(handle, fx); \
if(dlerror() != NULL){ \
fprintf(stderr, "Could not make handle for function %s\n", fx);\
exit(1); \
} \
} \
}while(0);
const int MAX_FORKS = 2;
int forks = 0;
int fork(){
static int (*libfork) (void) = NULL;
MAKE_CALLTHROUGH("fork", libfork);
if(forks++ > 2){
fprintf(stderr, "Illegally exceeded 2 forks.\n");
killpg(0, 9);
}
return libfork();
}
如果有人好奇,我将其编译如下:
gcc -g -Wall -Wextra -fPIC -c watchshim.c -o watchshim.o
gcc -g -Wall -Wextra -fPIC -shared -ldl watchshim.o -o watchshim.so
gcc -g -Wall -Wextra -pthread -o watch watch.c
watchshim.c
包含 shim/hook 代码的文件在哪里,并且watch.c
是填充的进程fork()
(它也在 . 的所有子进程中填充watch
. "/lib64/libc.so.6"
是so
包含原始fork()
. 我MAKE_CALLTHROUGH
写成一个宏,因为我正在填充多个函数我用这个的项目。