求助:拦截系统调用write和openwrite的性能问题

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
有谁知道如何拦截系统的调用。比如open,write,execve,mkdir,rmdir,ls,等等。我现在拦截了mkdir,rmdir.但是通过加载内核模块拦截了open后,然后rmmod就显示错误,因为rmmod好像用到了open的调用。所以我自己也打不开文件了。所有的操作都不能进行,只有关机重启了。不知道怎么进行???求高手指点。本人在做个系统调用的拦截。菜鸟中的菜鸟,希望高手帮忙。。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:36
我之前总结过一次拦截系统调用的文章,LZ 看到没有。可以去置顶精华帖里面找一下。
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
求个链接?高手。
论坛徽章:36
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
我把你的代码直接编译的有错误。链接里的是完整的代码吗??还有我想问你下,拦截open系统调用后,我自己还能操作吗?因为我跟踪了open的执行情况,strace open发现它首先调用execve,还有read,write等,我自己写了一个劫持mkdir可以,但是像open,write,read,我insmod后就死机,像windows的蓝屏一样。这是什么情况?
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
我能加下你的QQ吗??
论坛徽章:36
本帖最后由 Godbach 于
15:56 编辑
使用别人的 kernel module 在自己的环境中编译有错误是很常见的问题。
你要确定一下你的 kernel 版本是否和实例中的一致,然后再看具体错误是什么。
家境小康, 积分 1068, 距离下一级还需 932 积分
论坛徽章:0
1.你的新系统调用中是否继承了原有实现,如果原实现未被继承,肯定会出现错误,毕竟还有大量的用户应用程序需要使用这些系统调用。
2.你的新系统调用实现部分都做了些什么,是否本身就有错误的代码,从而导致内核崩溃。
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
确实没有继承原有的实现。请问怎么实现原有的实现呢?我的hack_open很简单。如下:
int hack_open(const char * path) //自定义一个替换函数,它将用来替换某个系统调用
& && &&&printk(&&0& this is in hack_open\n&);
& && &&&return 0;
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
#include &linux/module.h&
#include &linux/kernel.h&
#include &asm/unistd.h&
MODULE_LICENSE(&GPL&);
// addr of sys_call_talbe = 0xc15b6020,这个值是在/boot目录下,System.map或是以System.map打头的文件中找到的。
void ** sys_call_table = (void **)0xc15b6020;
int (*orig_open)(const char *path); //定义一个函数指针,用于保存挟制以前的初始值
int hack_open(const char * path) //自定义一个替换函数,它将用来替换某个系统调用
{
& && &&&printk(&&0& this is in hack_open\n&);
& && &&&return 0;
}
unsigned int clear_cr0(void) // 将WP清0,并返回清0前的值
{
& && &&&unsigned int cr0 = 0;
& && &&&
& && &&&asm volatile(&movl %%cr0, %%eax&
& && && && && & :&=a&(cr0)
& && && && && & );
& && &&&ret = cr0;
& && &&&cr0 &= 0
& && &&&asm volatile(&movl %%eax, %%cr0&
& && && && && & :
& && && && && & :&a&(cr0)
& && && && && & );
& && && && && &
}
void setback_cr0(unsigned int val) // 将cr0设为val
{
& && &&&asm volatile(&movl %%eax, %%cr0&
& && && && && & :
& && && && && & :&a&(val)
& && && && && & );
}
static int __init begin(void)
{
& && &&&unsigned int cr0;
& && &&&orig_open = sys_call_table[__NR_open]; //保存open原来的的地址
& && &&&printk(&&0& sys_call_table[__NR_open] = %x\n&,&&(unsigned int)sys_call_table[__NR_open]);
& && &&&cr0 = clear_cr0();
& && &&&sys_call_table[__NR_open] = hack_ //挟持
& && &&&setback_cr0(cr0);
& &
& && &&&printk(&&0& sys_call_table[__NR_open] = %x\n&, (unsigned int)sys_call_table[__NR_open]);
&&
& && &&&return 0;
}
static void __exit end(void)
{
& && &&&int cr0;
& && &&&cr0 = clear_cr0();
& && &&&sys_call_table[__NR_open] = orig_ //恢复open系统调用
& && &&&setback_cr0(cr0);&&
}
module_init(begin);
module_exit(end);复制代码贴上源代码,求大神指点。。。或者说open只对root和经过密码认证的开放权限??怎么实现呢??}

我要回帖

更多关于 openwrite 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信