免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2386 | 回复: 5
打印 上一主题 下一主题

[内核模块] 请教关于proc目录下进程的cwd信息 [复制链接]

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-02-10 09:23 |只看该作者 |倒序浏览
比如某个进程号是1234,那么在/proc/1234目录下,会有一个符号链接cwd对应于该进程的执行路径,我想请问一下,如何在内核模块里通过代码来获取到这个信息?谢谢各位大侠。

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
2 [报告]
发表于 2017-02-10 12:36 |只看该作者
回复 1# sky__sea

你不用这么麻烦,只要找到这个PID对应的task_struct ,用这个结构中的 fs中找到相对应的代码就可以了。
这里你可以参考 fs/dcache.c中的代码
  1. /*
  2. * NOTE! The user-level library version returns a
  3. * character pointer. The kernel system call just
  4. * returns the length of the buffer filled (which
  5. * includes the ending '\0' character), or a negative
  6. * error value. So libc would do something like
  7. *
  8. *        char *getcwd(char * buf, size_t size)
  9. *        {
  10. *                int retval;
  11. *
  12. *                retval = sys_getcwd(buf, size);
  13. *                if (retval >= 0)
  14. *                        return buf;
  15. *                errno = -retval;
  16. *                return NULL;
  17. *        }
  18. */
  19. SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
  20. {
  21.         int error;
  22.         struct path pwd, root;
  23.         char *page = __getname();

  24.         if (!page)
  25.                 return -ENOMEM;

  26.         rcu_read_lock();
  27.         get_fs_root_and_pwd_rcu(current->fs, &root, &pwd);

  28.         error = -ENOENT;
  29.         if (!d_unlinked(pwd.dentry)) {
  30.                 unsigned long len;
  31.                 char *cwd = page + PATH_MAX;
  32.                 int buflen = PATH_MAX;

  33.                 prepend(&cwd, &buflen, "\0", 1);
  34.                 error = prepend_path(&pwd, &root, &cwd, &buflen);
  35.                 rcu_read_unlock();

  36.                 if (error < 0)
  37.                         goto out;

  38.                 /* Unreachable from current root */
  39.                 if (error > 0) {
  40.                         error = prepend_unreachable(&cwd, &buflen);
  41.                         if (error)
  42.                                 goto out;
  43.                 }

  44.                 error = -ERANGE;
  45.                 len = PATH_MAX + page - cwd;
  46.                 if (len <= size) {
  47.                         error = len;
  48.                         if (copy_to_user(buf, cwd, len))
  49.                                 error = -EFAULT;
  50.                 }
  51.         } else {
  52.                 rcu_read_unlock();
  53.         }

  54. out:
  55.         __putname(page);
  56.         return error;
  57. }
复制代码
看到其中的current的指针,换成你所得到的task_struct的指针就可以了。


论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
3 [报告]
发表于 2017-02-10 15:09 |只看该作者
谢谢楼上,但是我拷过来编译的时候会报错,因为有的函数并没有导出,我这边就总是报没有定义,吧这个没有定义的函数拷过来再编译又报其他函数没有定义,一层套一层,感觉不行啊。

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
4 [报告]
发表于 2017-02-11 14:18 |只看该作者
回复 3# sky__sea
还有一个思路,就是对那个进程进行注入,这样像DLL的库中一样,运行得到,这个会更好的做法。

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-11-29 06:20:00
5 [报告]
发表于 2017-02-13 14:48 |只看该作者
进程不是固定的,任意进程都有可能,只能在内核里获取。

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
6 [报告]
发表于 2017-02-13 20:53 |只看该作者
回复 5# sky__sea

这个我当然知道了。但你可以看一下内核如何处理SIGNAL的方式,你就知道,我要你怎么处理了。其实就是在系统返回的时候加入代码,得到cwd了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP