init_modue和finit_module
init_module 和 finit_module 使用方法
glibc好像只实现了init_module的接口,没有实现finit_module的接口,故这里用syscall函数+对应的syscall id来模拟这两个函数
/* 函数原型
int init_module(void *module_image, unsigned long len,const char *param_values);int finit_module(int fd, const char *param_values,int flags);ps:从Debian的man文档中找到的
链接:https://manpages.debian.org/buster/manpages-dev/finit_module.2.en.html
*/
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>#include <sys/syscall.h>
/* 用syscall来定义init_module和finit_module */
#define init_module(image,size,args) syscall(__NR_init_module,image,size,args)
#define finit_module(fd,args,flags) syscall(__NR_finit_module,fd,args,flags)/* 定义两个函数的调用函数 */
int call_init_module(int fd);
int call_finit_module(int fd);int call_init_module(int fd)
{void *image;int ret = 0,f_size;struct stat stbuf;if((fstat(fd,&stbuf) != 0) || (!S_ISREF(stbuf.st_mode))){perror("fstat error");return ret;}f_size = stbuf.st_size;// open的文文件的长度image = mmap(NULL,f_size,7,1,fd,0); // 7 = PORT_READ|PORT_WRITE|PORT_EXEC 1 = MAP_SHAREDif(image < 0 ){perror("mmap");return 1;}ret = init_module(image,6000,"");munmap(image,f_size);if(ret < 0){perror("init_module");}else{printf("init_module success\n");}return ret;
}int call_finit_module(int fd)
{int ret;ret = finit_module(fd,"",0);if(ret < 0){perror("finit_nodule");}else{printf("finit_module success\n");}return ret;
}int main(void)
{int fd,ret,buf;printf("请选择操作:1.init_module 2.finit_module\n");scanf("%d",&buf);while(getchar() != '\n');fd = open("./hello.ko",O_RDWR);if( fd < 0){perror("open");ret = 1;return ret;}if(buf == 1){ret = call_init_module(fd);}else if(buf == 2){ret = call_finit_module(fd);}else{ret = -1;printf("输入错误:%d 没有这个选项\n",buf);}close(fd);return ret;
}
这里附上测试用内核模块的代码和Makefile
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>MODULE_LICENSE("GPL");static int __init hello_init(void)
{printk(KERN_INFO "start hello\n");return 0;
}static void __exit hello_exit(void)
{printk(KERN_INFO "exit hello\n");
}module_init(hello_init);
module_exit(hello_exit);
obj-m += hello.o
all:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
模块编译前需要安装相应的内核开发包,具体可以百度。
ps:init_module应该也可以通过匿名内存映射的方式去加载模块,推测可以将内存映射出来后,读取ko文件的流,然后复制到映射的内存,再init_module去加载。
finit_module的fd,在某些情况(推测是高版本的内核)下对打开的权限有要求,需要添加 O_CLOEXEC 的标志位,
如:fd = open("./hello.ko",O_RDONLY|O_CLOEXEC); 否则,将无法加载到内核空间
init_modue和finit_module相关推荐
- 加载 linux 内核模块卡在 finit_module 系统调用处的问题
问题描述 在学习内核中 notifier_chain 的过程中,需要编写内核模块测试注册的 die notifier_handler 是否生效,就编写了一个非常简单的内核模块,在内核模块初始化函数中向 ...
- linux内核添加c代码,如何从C代码加载Linux内核模块?
Ciro Santill.. 19 最小的可运行示例 使用这个简单的参数打印机模块在QEMU + Buildroot VM和Ubuntu 16.04主机上进行了测试. 我们使用init_module/ ...
- linux 3.5.0-23-generic内核版本系统调用数目,Linux操作系统分析(三)- 更新内核与添加系统调用...
环境:Ubuntu 12.10 学号:SA****199 1.更新内核: 直接安装的系统内核版本一般不是最新,用 uname -a 查看一下 自己的版本,OK,我的是: Linux chenh ...
- docker strace ptrace 报错 Operation not permitted 解决方法
docker中gdb在进行进程debug时,会报错: (gdb) attach 30721 Attaching to process 30721 ptrace: Operation not permi ...
- docker 安全性_未来的Docker安全性
docker 安全性 当我开始在Opensource.com上撰写有关Docker安全性的系列文章时,我说" 容器不包含" . Red Hat和Docker的主要目标之一就是使这一 ...
- Linux系统调用表:x86和x86_64
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- Linux系统调用表(system call table)
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- strace实现原理:ptrace系统调用
<GDB调试之ptrace实现原理> <C语言程序调用栈:backtrace+backtrace_symbols+backtrace_symbols_fd> 目录 strace ...
- 小谈android/Linux rootkit(基于LKM)
最近又学习了一下,感觉还有好多东西不知道,以后积累多一点再从新写一个. 在android上捣鼓了一下linux的内核rootkit,虽然中途遇到了无数坑,至今也没有完全写完,打算先好好啃一段时间lin ...
最新文章
- 话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
- js——全选框 checkbox
- python中ret是什么意思_数据结构图在python中的应用
- 摇杆控制方向原理_医用无油空压机的送料作用及工作原理
- c语言rtu crc16,Modbus-RTU-crc16校验方法C语言实现
- 纪中A组模拟赛总结(2021.7.12)
- 什么是序列化? 您需要通过示例解释的有关Java序列化的所有知识
- scrapy使用(无头)浏览器爬取动态网页
- 数据结构之红黑树(三)——删除操作
- 第二十四章:页面导航(六) 1
- java分形树_java画分形树实例
- android快牙原理,快牙的使用原理是什么_快牙怎么使用_3DM手游
- 微信数据解密-dat查看
- 基于Labview开发TestStand用户界面时ConnectCommand List
- 衣米魔兽世界怀旧服:相关网友和测试玩家的提问,王乾亨以及衣米魔兽官方的解释与回答内容精选
- Android读取手机存储文件,android 手机存储文件夹学习
- 用FFmpeg保存JPEG图片
- 全球与中国量身定制生产线市场深度研究分析报告
- 高级软件程序员养成记
- keil startup_stm32f10x_hd.s编译报错
热门文章
- 2021.3.2版本idea配置maven出现org.codehaus.plexus.component.repository.exception.ComponentLookupException
- 增加打字音效让码字变成一种享受
- 曾经连过的WiFi密码查询
- Oracle中游标Cursor介绍
- Python3 --- Tornado之模板
- 什么鬼,Kubelet 重启之后容器也跟着重启了?
- java 控制台实现文本查看,行数可调,回车翻页
- BUUCTF:很好的色彩呃?
- 《林超:给年轻人的跨学科通识课》导图 06:复杂性科学模型
- 新一代超高精度双回路张力控制器