【发布时间】:2021-07-27 14:27:54
【问题描述】:
有一个钩子函数socketHook.c可以拦截socket()调用:
#include <stdio.h>
int socket(int domain, int type, int protocol)
{
printf("socket() has been intercepted!\n");
return 0;
}
gcc -c -fPIC socketHook.c
gcc -shared -o socketHook.so socketHook.o
还有一个简单的程序getpwuid.c (1),它只调用getpwuid() 函数:
#include <pwd.h>
int main()
{
getpwuid(0);
return 0;
}
gcc getpwuid.c -o getpwuid
getpwuid() 在内部进行 socket() 调用。 在 CentOS 上:
$ strace -e trace=socket ./getpwuid
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
socket(AF_UNIX, SOCK_STREAM, 0) = 4
在 Ubuntu 上:
$ strace -e trace=socket ./getpwuid
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
运行(1)时,socket()在CentOS上被拦截,在Ubuntu上不被拦截。
CentOS. 来自 socketHook.c 的 printf() 存在:
$ uname -a
Linux centos-stream 4.18.0-301.1.el8.x86_64 #1 SMP Tue Apr 13 16:24:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ LD_PRELOAD=$(pwd)/socketHook.so ./getpwuid
socket() has been intercepted!
Ubuntu(Xubuntu 20.04)。 socketHook.c 中的 printf() 不存在:
$ uname -a
Linux ibse-VirtualBox 5.8.0-50-generic #56~20.04.1-Ubuntu SMP Mon Apr 12 21:46:35 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ LD_PRELOAD=$(pwd)/socketHook.so ./getpwuid
$
所以我的问题是:
- 它取决于什么?我认为这是由于 socket() 不是直接从可执行文件调用,而是从 getpwuid() 调用,如果我理解正确的话,它又从 libc.so 调用。李>
- 如何在 CentOS 中实现与在 Ubuntu 中相同的行为?我不想拦截来自 libc 的间接调用
【问题讨论】:
标签: linux ubuntu centos hook ld-preload