gpt4 book ai didi

gcc - 拦截 GNU tar 的 openat() 系统调用

转载 作者:行者123 更新时间:2023-12-04 21:22:48 25 4
gpt4 key购买 nike

我正在尝试拦截 openat()使用自定义共享库在 Linux 上进行系统调用,我可以通过 LD_PRELOAD 加载该库.一个例子intercept-openat.c有这个内容:

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h>

int (*_original_openat)(int dirfd, const char *pathname, int flags, mode_t mode);

void init(void) __attribute__((constructor));
int openat(int dirfd, const char *pathname, int flags, mode_t mode);

void init(void)
{
_original_openat = (int (*)(int, const char *, int, mode_t))
dlsym(RTLD_NEXT, "openat");
}

int openat(int dirfd, const char *pathname, int flags, mode_t mode)
{
fprintf(stderr, "intercepting openat()...\n");
return _original_openat(dirfd, pathname, flags, mode);
}

我通过 gcc -fPIC -Wall -shared -o intercept-openat.so intercept-openat.c -ldl 编译它.然后,当我运行这个小示例程序时:
int main(int argc, char *argv[])
{
int fd;
fd = openat(AT_FDCWD, "/home/feh/.vimrc", O_RDONLY);
if(fd == -1)
return -1;
close(fd);
return 0;
}
openat()调用通过库重写:
$ LD_PRELOAD=./intercept-openat.so ./openat 
intercepting openat()...

但是,GNU tar 不会发生同样的情况,即使它使用相同的系统调用:
$ strace -e openat tar cf /tmp/t.tgz .vimrc  
openat(AT_FDCWD, ".vimrc", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW|O_CLOEXEC) = 4
$ LD_PRELOAD=./intercept-openat.so tar cf /tmp/t.tgz .vimrc

所以自定义 openat()来自 intercept-openat.so没有被调用。这是为什么?

最佳答案

它使用相同的系统调用,但显然它没有通过相同的 C 函数调用它。或者,它可能确实如此,但它是静态链接的。

无论哪种方式,我认为您已经证明它永远不会动态链接函数名称“openat”。如果您仍想继续使用此选项,您可能希望查看它是否与该功能的特定版本相关联,但这是一个很长的问题。

您仍然可以通过编写程序来使用 ptrace 来拦截系统调用。 .这与 strace 和 gdb 使用的接口(interface)相同。不过,它会有更高的性能损失。

http://linux.die.net/man/2/ptrace

关于gcc - 拦截 GNU tar 的 openat() 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9161116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com