linux下如何改变系统调用
时间:2011-07-18
来源:互联网
大虾,我最近改变linux的系统调用,比如吧sys_open改成自己的函数,模块加载了后出现“已杀死”,卸载模块的时候出现“模块正在使用”。
想请问这是怎么个回事。代码我贴下来:
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/sched.h>
#include<asm/unistd.h>
#include<linux/types.h>
#include<linux/dirent.h>
#include<linux/string.h>
#include<linux/file.h>
#include<linux/fs.h>
void **sys_call_table = 0xc0596150;//这个常量是我在/proc/kallsyms中找到的sys_call_table的对应值
asmlinkage long (* orig_open)(const char __user *filename, int flags, int mode);//存储原来sys_open的值
asmlinkage long my_sys_open_call(const char __user *filename, int flags, int mode);//自己定义的用来替代原来sys_open的函数
asmlinkage long my_sys_open_call(const char __user *filename,int flags,int mode)
{
return orig_open("111.txt",flags,mode);//调用原来sys_open函数打开文件
}
static int __init my_init(void)
{
orig_open = sys_call_table[__NR_open];
sys_call_table[__NR_open] = my_sys_open_call;
return 0;
}
static void __exit my_exit_call(void)
{
sys_call_table[__NR_open] = orig_open;
}
module_init(my_init);
module_exit(my_exit_call);
想请问这是怎么个回事。代码我贴下来:
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/sched.h>
#include<asm/unistd.h>
#include<linux/types.h>
#include<linux/dirent.h>
#include<linux/string.h>
#include<linux/file.h>
#include<linux/fs.h>
void **sys_call_table = 0xc0596150;//这个常量是我在/proc/kallsyms中找到的sys_call_table的对应值
asmlinkage long (* orig_open)(const char __user *filename, int flags, int mode);//存储原来sys_open的值
asmlinkage long my_sys_open_call(const char __user *filename, int flags, int mode);//自己定义的用来替代原来sys_open的函数
asmlinkage long my_sys_open_call(const char __user *filename,int flags,int mode)
{
return orig_open("111.txt",flags,mode);//调用原来sys_open函数打开文件
}
static int __init my_init(void)
{
orig_open = sys_call_table[__NR_open];
sys_call_table[__NR_open] = my_sys_open_call;
return 0;
}
static void __exit my_exit_call(void)
{
sys_call_table[__NR_open] = orig_open;
}
module_init(my_init);
module_exit(my_exit_call);
作者: jiexiaoqihanxuebaoma 发布时间: 2011-07-18
可能是("111.txt" 这个参数的原因吧。
人家是 const char __user *filename
来自用户空间的,使用copy-from-user 获取,你这个是内核空间的所以不行
人家是 const char __user *filename
来自用户空间的,使用copy-from-user 获取,你这个是内核空间的所以不行
作者: lvyinghong 发布时间: 2011-07-19
不妨参考一下系统的open函数是怎么处理这个参数的
作者: lvyinghong 发布时间: 2011-07-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28