通过call_usermodehelper()在内核态执行用户程序
浏览:2317次 出处信息
背景
如何在Linux内核中执行某些用户态程序或系统命令?在用户态中,可以通过execve()实现;在内核态,则可以通过call_usermodehelpere()实现该功能。如果您查阅了call_usermodehelper()内核函数的源码实现,就可以发现该函数最终会执行do_execve()。而execve系统调用在经历内核的系统调用流程后,也会最终调用do_execve()。
使用举例
1.无输出的可执行文件测试
加载函数demo如下所示:
1 | static int __init call_usermodehelper_init( void ) |
2 | { |
3 | int ret = -1; |
4 | char path[] = "/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 | return 0; |
11 | } |
卸载函数demo如下所示:
1 | static void __exit call_usermodehelper_exit( void ) |
2 | { |
3 | int ret = -1; |
4 | char path[] = "/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};
本文虽然说明的是在内核态如何调用用户态程序,不过可以将这种方法抽象一下,看作是内核态主动向用户态发起通信的一种方式。
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
文章信息
- 作者:edsionte 来源: edsionte's TechBlog
- 标签: call_usermodehel
- 发布时间:2014-11-27 13:10:17
近3天十大热文
-
[61] memory prefetch浅析
-
[54] 转载:cassandra读写性能原理分析
-
[51] 深入浅出cassandra 4 数据一致性问
-
[44] MySQL半同步存在的问题
-
[40] 《web前端最佳实践》—高维护性css
-
[40] 获取Dom元素的X/Y坐标
-
[38] 字符引用和空白字符
-
[37] javascript插入样式
-
[37] 基本排序算法的PHP实现
-
[34] MySQL vs NoSQL 效率与成本之争