在用户空间中编写系统调用包装程序。

本文探讨了在用户空间中编写系统调用包装程序的方法,以记录Linux中删除文件的用户信息。通过编写unlink函数的包装器,并利用dlsym函数获取原始系统调用地址,实现了在用户空间拦截和记录系统调用的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用户空间中编写系统调用包装程序。

最近,我在Linux / Unix部分中看到一个帖子,以了解在Linux中删除该文件的用户。 当前在linux中没有什么可以实现这一目标的。 有一些工具可以描述文件系统上的活动,但是没有一个工具可以提供特定的用户信息。 所有这些工具的主要任务是检查系统性能。

首先,我想为什么不挂上取消链接系统调用并记录要删除文件的用户。 这应该在内核模式下完成。

将系统调用挂接到内核中有一定的限制。

1.系统调用表在2.6内核中不可导出。

2.登录删除文件的用户是简单的任务,因此可以使用内核模块来完成。 任何人都不应期望在内核中编写新的系统调用,否则将以内核编译结尾。

3.即使有人设法开发出可以记录用户信息的内核模块,也很难管理代码与所有内核版本的可移植性和兼容性。

因此,为什么不以用户模式编写某些内容来实现此任务。 使用此方法,您可以在用户空间中的任何系统调用周围编写包装器。

Unlink是系统调用,最终会从文件系统中删除文件。

因此,这里我们仅以示例为例,尝试在其上编写包装。

该方法非常简单。 我们首先编写自己的unlink函数,它将执行必要的日志记录任务,最后它将调用原始的unlink函数。

我们可以通过dlsym()函数从libc.so(不确定)获取原始取消链接系统调用的地址。 我们将编译代码并构建共享对象文件。

重要的任务是在原始库之前加载库,这将确保out unlink函数得到调用。 我们可以通过将环境变量LD_PRELOAD设置到我们的库中来实现。

让我们做一些编码...


//wrapper.c
#include <dlfcn.h>
#include <stdio.h> 
int unlink(const char * path) //original signature of the unlink system call.
{
    //you can perform any task here..
printf("\nDon’t get lost in processing….\n");
typedef int (*FP_unlink)(const char*);
FP_unlink org_unlink = dlsym(((void *) -1l), "unlink");
return org_unlink(path);
} 

将该文件编译为:

gcc -fPIC -c -Wall wrapper.c -o wrapper.o

gcc -shared wrapper.o -ldl -lstdc ++ -o wrapper.so

现在,我们将设置LD_PRELOAD变量。 我们可以通过编写任何shell脚本或在shell上直接导出命令来实现。

导出LD_PRELOAD = $ LD_PRELOAD:./ wrapper.so

要测试此包装器,只需创建任何文件,然后尝试使用rm命令将其删除。

$> echo“ hi”> hello.txt

$> rm –rf hello.txt

不要在处理中迷路…。

$>

From: https://bytes.com/topic/unix/insights/853069-writing-system-call-wrappers-user-space

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值