IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

通过call_usermodehelper()在内核态执行用户程序

edsionte's TechBlog 2014-11-27 13:10:17 累计浏览 2,850 次
本机暂存

背景

如何在Linux内核中执行某些用户态程序或系统命令?在用户态中,可以通过execve()实现;在内核态,则可以通过call_usermodehelpere()实现该功能。如果您查阅了call_usermodehelper()内核函数的源码实现,就可以发现该函数最终会执行do_execve()。而execve系统调用在经历内核的系统调用流程后,也会最终调用do_execve()。

使用举例

1.无输出的可执行文件测试

加载函数demo如下所示:

1staticint__init call_usermodehelper_init(void)
2{
3    intret = -1;
4    charpath[] = "/bin/mkdir";
5    char*argv[] = {path, "-p", "/home/tester/new/new_dir", NULL};
6
7    printk("call_usermodehelper module is starting..!\n");
8    ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
9    printk("ret=%d\n", ret);
10    return0;
11}

卸载函数demo如下所示:

1staticvoid__exit call_usermodehelper_exit(void)
2{
3    intret = -1;
4    charpath[] = "/bin/rm";
5    char*argv[] = {path, "-r", "/home/tester/new", NULL};
6    char*envp[] = {NULL};
7
8    printk("call_usermodehelper module is starting..!\n");
9    ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
10    printk("ret=%d\n", ret);
11}

2.有输出的可执行文件测试

如果该可执行文件有输出,则可以利用输出重定向,不过此时的可执行文件应该是/bin/bash,而实际的可执行文件则称为bash的参数。比如如果想在内核执行ls -la命令,并且将其输出重定向到ls_output中,则在上述的argv[]={“/bin/bash”, “-c”, “ls”, “-la”, “>”, “/home/tester/ls_output”, NULL};

本文虽然说明的是在内核态如何调用用户态程序,不过可以将这种方法抽象一下,看作是内核态主动向用户态发起通信的一种方式。

同分类推荐文章

  1. Vibe新开源项目 - Vaala AI Gateway (2026-05-17 02:10:19)
  2. SmartPerfetto 架构文章 Q&A:8 个深度技术问答 (2026-04-10 11:00:00)
  3. 让 AI 把我的 PHP 博客重写成 Go (2026-03-27 18:33:54)

查看更多 后端 文章 →

建议继续学习

  1. PHP程序的执行流程 (累计阅读 9,971)
  2. 几个内存相关面试题(c/c++) (累计阅读 9,362)
  3. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,122)
  4. nginx自定义模块编写-实时统计模块 (累计阅读 8,677)
  5. C语言中史上最愚蠢的Bug (累计阅读 8,035)
  6. websocket 连接 C Server的尝试 (累计阅读 7,872)
  7. Linux C语言编程学习材料 (累计阅读 7,031)
  8. 一次简单C程序的性能优化 (累计阅读 6,789)
  9. 如何学好C语言 (累计阅读 6,390)
  10. C的那些事儿 (累计阅读 6,351)