gpt4 book ai didi

c - 我怎么能拦截 linux 系统调用?

转载 作者:IT王子 更新时间:2023-10-29 00:26:01 26 4
gpt4 key购买 nike

除了 LD_PRELOAD 技巧和用您提供的系统调用替换某个系统调用的 Linux 内核模块之外,是否有可能拦截系统调用(例如打开),以便它在到达实际打开?

最佳答案

为什么你不能/不想使用 LD_PRELOAD trick

此处示例代码:

/*
* File: soft_atimes.c
* Author: D.J. Capelis
*
* Compile:
* gcc -fPIC -c -o soft_atimes.o soft_atimes.c
* gcc -shared -o soft_atimes.so soft_atimes.o -ldl
*
* Use:
* LD_PRELOAD="./soft_atimes.so" command
*
* Copyright 2007 Regents of the University of California
*/

#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <sys/types.h>
#include <bits/fcntl.h>
#include <stddef.h>

extern int errorno;

int __thread (*_open)(const char * pathname, int flags, ...) = NULL;
int __thread (*_open64)(const char * pathname, int flags, ...) = NULL;

int open(const char * pathname, int flags, mode_t mode)
{
if (NULL == _open) {
_open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
}
if(flags & O_CREAT)
return _open(pathname, flags | O_NOATIME, mode);
else
return _open(pathname, flags | O_NOATIME, 0);
}

int open64(const char * pathname, int flags, mode_t mode)
{
if (NULL == _open64) {
_open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
}
if(flags & O_CREAT)
return _open64(pathname, flags | O_NOATIME, mode);
else
return _open64(pathname, flags | O_NOATIME, 0);
}

据我了解...这几乎是 LD_PRELOAD 技巧或内核模块。没有太多的中间立场,除非你想在一个模拟器下运行它,它可以捕获你的函数或者在实际的二进制文件上重写代码以捕获你的函数。

假设您不能修改程序并且不能(或不想)修改内核,LD_PRELOAD 方法是最好的方法,假设您的应用程序相当标准并且实际上不是恶意尝试的越过你的拦截。 (在这种情况下,您将需要其他技术之一。)

关于c - 我怎么能拦截 linux 系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69859/

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