首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于rootkit的syscall实现

用于rootkit的syscall实现
EN

Stack Overflow用户
提问于 2021-12-28 02:16:44
回答 1查看 60关注 0票数 1

我计划在rootkit中使用我自己版本的getdents()。代码在这里:

代码语言:javascript
复制
asmlinkage int new_getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count)
{
    int nread;
    int bpos;
    struct linux_dirent *d;
    int (*orig_func)(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
    t_syscall_hook *open_hook;

    open_hook = find_syscall_hook(__NR_getdents);
    orig_func = (void*) open_hook->orig_func;

    nread = (*orig_func)(fd, dirp, count);
    d = dirp;

    for (bpos = 0; bpos < nread;) {
      d = (struct linux_dirent *) ((char*)dirp + bpos);
      printk(KERN_INFO "%s\n", d->d_name);
      bpos += d->d_reclen;
    }

    return nread;
}

我无法理解这一行中的类型转换:d = (struct linux_dirent *) ((char*)dirp + bpos);

ddirp都保存linux_dirent结构的内存地址。d_reclen包含条目的长度。如果我们收到作为3,5,7的d_reclen,那么条目将出现在dirp,dirp+3 /size(linux_dirent),dirp+3

所以这一行应该是这样的:d = (struct linux_dirent *) ((dirp + bpos)/size(linux_dirent));

我们为什么要转换成(char *)?

代码语言:javascript
复制
typedef struct {
        unsigned long   d_ino;
        unsigned long   d_off;
        unsigned short  d_reclen;
        char            d_name[1];
} linux_dirent;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-28 02:46:42

,所以这一行应该是这样的:d= (struct linux_dirent *) ((dirp +bpo)/size(Linux_dirent));

No - dirp / sizeof(linux_dirent)没有什么意义,dirp0的偏移量与结构大小无关。内存地址除以结构的大小..。只是一些不相关的地址。

您的意思是,例如,只将偏移量与内存位置分开,然后将结果指针添加到指针中。嗯,一直到:

代码语言:javascript
复制
(char*)dirp + ((char*)(dirp + bpos) - (char*)dirp)/sizeof(linux_dirent)
                       ^^^^^^^^^^^                                       = (char*)dirp + bpos * sizeof(linux_dirent)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                        = bpos * sizoef(linux_dirent)

              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  = bpos
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  = (char*)dirp + bpos

但是..。与在dirp步骤中递增sizeof(linux_dirent)指针不同,您只需用1字节的步骤来增加它。char*的演员就是这么做的。sizeof(char)总是1。以下是符合此值的内容:

代码语言:javascript
复制
dirp + bpos == (char*)dirp + bpos * sizeof(linux_dirent)

为什么我们要转换成(char *)?

我们将转换为char *,以更改+运算符将增加的字节数。简短的例子:

代码语言:javascript
复制
int *a = 20;
       a + 5 == 20 + 5 * sizeof(int)
(char*)a + 5 == 20 + 5 * sizeof(char)   // sizeof(char) = 1, so:
(char*)a + 5 == 25

指针算法是一个很好的研究课题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70502181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档