6

在 unix 环境中拦截系统调用的可能方法是什么?我正在寻找在 AIX 中做的事情。

谢谢

4

3 回答 3

3

不熟悉 AIX,但以下适用于 Linux 和 Solaris。您可以使用 LD_PRELOAD 环境变量,它告诉 ld.so 在 libc 之前加载一个共享库,然后编写您自己的系统调用版本,并可选择调用原始版本。man ld.so了解更多信息。类似的东西

#include <dlfcn.h>

typedef int (*ioctl_fn)(int, int, void*);

static 
int
my_ioctl(int      fildes,
         int      request,
         void*    argp,
         ioctl_fn fn_ptr)

{
    int result = 0;

    /* call original or do my stuff */
    if (request == INTERESTED)
    {
        result = 0;
    }
    else
    {
        result = (*fn_ptr)(fildes, request, argp);
    }

    return result;
}

/*
 * override ioctl() - on first call get a pointer to the "real" one
 * and then pass it onto our version of the function
 */
int
ioctl(int fildes,
      int request,
      void* argp)
{
    static ioctl_fn S_fn_ptr = 0;

    if (S_fn_ptr == 0)
    {
        S_fn_ptr = (ioctl_fn)dlsym(RTLD_NEXT, "ioctl");
    }

    return my_ioctl(fildes, request, argp, S_fn_ptr);
}

从我周围的一些代码中雕刻出来,如果我做错了,请道歉。

于 2009-05-21T10:32:41.533 回答
1

好吧,总是有systrace

于 2009-05-22T14:49:29.820 回答
0

我不确定 AIX,但我在 Linux 上做过。在 Linux 上,系统调用表包含在sys_call_table数组中。我们需要先找出这张表的地址。现在,这是一件棘手的事情,有多种方法可以做到这一点。

我们可以通过查看 sysmap 文件找到它的地址:

punb200m2labs08vm1:/ # cat /boot/System.map-4.4.21-69-default | grep sys_call_table
ffffffff81600180 R sys_call_table

因此,ffffffff81600180sys_call_table我机器上的地址。在您的内核模块中,您可以更改与特定系统调用号(您正在更改的)对应的默认函数并将其分配给您自己的函数。

例如,假设您要拦截编号__NR_open在 Linux 上的“打开”系统调用。从上面获得 sys_call_table 地址后,只需将您的函数分配给index __NR_openof sys_call_table

sys_call_table[__NR_open] = your_function;

你在哪里your_function实现拦截“开放”系统调用。从现在开始,每一个打开的系统调用都会经过这个函数。

AIX 上的细节会有所不同,但我猜总体思路是相似的。您只需要找出 AIX 特定的过程来实现这一点。

于 2017-06-29T06:53:52.953 回答