Chinaunix
标题:
系统调用的拦截
[打印本页]
作者:
zhu_9527
时间:
2013-07-02 22:47
标题:
系统调用的拦截
有谁知道如何拦截系统的调用。比如open,write,execve,mkdir,rmdir,ls,等等。我现在拦截了mkdir,rmdir.但是通过加载内核模块拦截了open后,然后rmmod就显示错误,因为rmmod好像用到了open的调用。所以我自己也打不开文件了。所有的操作都不能进行,只有关机重启了。不知道怎么进行???求高手指点。本人在做个系统调用的拦截。菜鸟中的菜鸟,希望高手帮忙。。
作者:
Godbach
时间:
2013-07-02 22:59
回复
1#
zhu_9527
我之前总结过一次拦截系统调用的文章,LZ 看到没有。可以去置顶精华帖里面找一下。
作者:
zhu_9527
时间:
2013-07-03 08:57
求个链接?高手。
作者:
Godbach
时间:
2013-07-03 13:07
回复
3#
zhu_9527
这篇文章
http://bbs.chinaunix.net/thread-1946913-1-1.html
作者:
zhu_9527
时间:
2013-07-03 14:56
我把你的代码直接编译的有错误。链接里的是完整的代码吗??还有我想问你下,拦截open系统调用后,我自己还能操作吗?因为我跟踪了open的执行情况,strace open发现它首先调用execve,还有read,write等,我自己写了一个劫持mkdir可以,但是像open,write,read,我insmod后就死机,像windows的蓝屏一样。这是什么情况?
作者:
zhu_9527
时间:
2013-07-03 15:38
我能加下你的QQ吗??
作者:
Godbach
时间:
2013-07-03 15:56
本帖最后由 Godbach 于 2013-07-03 15:56 编辑
回复
5#
zhu_9527
使用别人的 kernel module 在自己的环境中编译有错误是很常见的问题。
你要确定一下你的 kernel 版本是否和实例中的一致,然后再看具体错误是什么。
作者:
卖萌犯法
时间:
2013-07-03 16:04
回复
1#
zhu_9527
1.你的新系统调用中是否继承了原有实现,如果原实现未被继承,肯定会出现错误,毕竟还有大量的用户应用程序需要使用这些系统调用。
2.你的新系统调用实现部分都做了些什么,是否本身就有错误的代码,从而导致内核崩溃。
作者:
zhu_9527
时间:
2013-07-03 16:50
确实没有继承原有的实现。请问怎么实现原有的实现呢?我的hack_open很简单。如下:
int hack_open(const char * path) //自定义一个替换函数,它将用来替换某个系统调用
{
printk("<0> this is in hack_open\n");
return 0;
}
作者:
zhu_9527
时间:
2013-07-03 17:08
#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;
unsigned int ret;
asm volatile("movl %%cr0, %%eax"
:"=a"(cr0)
);
ret = cr0;
cr0 &= 0xfffeffff;
asm volatile("movl %%eax, %%cr0"
:
:"a"(cr0)
);
return ret;
}
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_open; //挟持
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; //恢复open系统调用
setback_cr0(cr0);
}
module_init(begin);
module_exit(end);
复制代码
贴上源代码,求大神指点。。。或者说open只对root和经过密码认证的开放权限??怎么实现呢??
作者:
zhu_9527
时间:
2013-07-03 19:08
给自己顶下。。。。。。大神快显灵。。。。。。
作者:
Godbach
时间:
2013-07-03 23:23
回复
10#
zhu_9527
操作系统大量的操作都要调用 open,不要轻易替换成你自己的。可以把入口改成你自己的函数,但是你的函数内要在调用kernel 原始的。
这样,你就可以在不影响系统的情况下个,做很多调试和分析工作。
作者:
zhu_9527
时间:
2013-07-04 08:59
回复
12#
Godbach
能说具体嗲吗?有代码最好,我不是理解你说的。我也知道open调用会牵涉到许多调用,不像mkdir那样。那网上拦截的open有什么意义呢?对了,那如何拦截某个命令呢?比如ls,strace,cat,或者拒绝访问某个文件等。。???
作者:
Godbach
时间:
2013-07-04 09:40
回复
13#
zhu_9527
代码不是示例中有吗?
作者:
zhu_9527
时间:
2013-07-04 10:25
#define REPLACE(x) old_##x = my_table[__NR_##x];\
my_table[__NR_##x] = new_##x
代码中的##x是什么意思??
作者:
Godbach
时间:
2013-07-04 10:42
回复
15#
zhu_9527
这是 C 语言的基础知识,要发挥自己的主观能动性。
没有什么东西,别人可以手把手的教你的。
作者:
zhu_9527
时间:
2013-07-12 17:21
高手????
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2