아니 정확히 대답 아니기 때문에,이를 넣어,하지만 어쩌면 그것이 올바른 방향으로 넣어 볼 수있는 곳 정말 확인합니다. 여기에 C로 작성된 fork()
의 심/후크 코드가 있습니다.이 경우에는 샌드 박스 프로그램이 두 번 이상 포크로 찍혔는지 여부를 감지하도록 작성되었지만 필요에 따라 동작을 수정할 수 있습니다. 경우 사람에
#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
가 심/후크 코드가 포함 된 파일입니다
및 watch.c
이 fork()
이 shimmed되는 과정입니다 (그 watch
의 모든 하위 프로세스에서도 shimmed입니다. "/lib64/libc.so.6"
은 fork()
이 포함 된 so
입니다.이 프로젝트에서 여러 기능을 사용하고 있기 때문에 MAKE_CALLTHROUGH
매크로로 작성되었습니다.