在用户空间中编写系统调用包装程序。
最近,我在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