在unix环境中拦截系统调用的可能方法有哪些?

时间:2009-05-21 09:50:07

标签: unix system-calls

在unix环境中拦截系统调用的可能方法有哪些? 我希望在AIX中做。

由于

3 个答案:

答案 0 :(得分: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);
}

用我所说的一些代码雕刻出来,如果我说错了就道歉。

答案 1 :(得分:1)

嗯,总是systrace

答案 2 :(得分: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

因此,ffffffff81600180是我机器上sys_call_table的地址。 在您的内核模块中,您只需更改与某个系统调用号码相对应的默认功能(您正在更改)并将其分配给您自己的功能。

e.g。假设您要拦截“打开”#39;在Linux上编号为__NR_open的系统调用。从上面获得sys_call_table地址后,只需将您的函数分配给index __NR_open的{​​{1}}:

sys_call_table

您实施sys_call_table[__NR_open] = your_function; 拦截&#39;打开&#39;系统调用。 从现在开始,每个开放系统调用都将通过此功能。

AIX上的细节会有所不同,但我猜这总体想法是相似的。您只需找出实现此目的的AIX特定过程。