首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拦截系统调用

拦截系统调用
EN

Stack Overflow用户
提问于 2013-01-19 14:55:57
回答 3查看 3.5K关注 0票数 10

我一直试图在内核级别拦截系统调用。我从这个question中得到了基本的想法。我试图拦截的系统调用是叉()。因此,我从sys_fork()中找到了System.map的地址,结果是0xc1010e0c.Now,我编写了下面的模块。

代码语言:javascript
复制
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/unistd.h>
#include<linux/semaphore.h>
#include<asm/cacheflush.h>
MODULE_LICENSE("GPL");
void **sys_call_table;
asmlinkage int (*original_call)(struct pt_regs);
asmlinkage int our_call(struct pt_regs regs)
{
    printk("Intercepted sys_fork");
    return original_call(regs);
} 
static int __init p_entry(void)
{
    printk(KERN_ALERT "Module Intercept inserted");
    sys_call_table=(void *)0xc1010e0c;
    original_call=sys_call_table[__NR_open];
    set_memory_rw((long unsigned int)sys_call_table,1);
    sys_call_table[__NR_open]=our_call;
    return 0;
}
static void __exit p_exit(void)
{
    sys_call_table[__NR_open]=original_call;
    set_memory_ro((long unsigned int)sys_call_table,1);
    printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);

但是,在编译模块之后,当我尝试将它插入内核时,我从dmesg输出中得到了以下信息。

当然不是拦截系统call.Can,你帮我找出问题了吗?我正在使用3.2.04-686版本的Linux内核。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-19 15:01:53

代码语言:javascript
复制
original_call=sys_call_table[__NR_open];
....
sys_call_table[__NR_open]=our_call;

如果您正在拦截fork,则open的条目不是您想要更改的内容。您应该使用sys_fork()的地址,而不是来自System.map的sys_call_table ()地址。

票数 2
EN

Stack Overflow用户

发布于 2013-01-19 15:06:28

http://lxr.linux.no/linux+*/arch/x86/mm/pageattr.c#L874

代码语言:javascript
复制
            if (*addr & ~PAGE_MASK) {
                    *addr &= PAGE_MASK;
                    /*
                     * People should not be passing in unaligned addresses:
                     */
                    WARN_ON_ONCE(1);
            }

因此,警告是因为您的sys_call_table变量不对页。

应该说,修补系统调用表是内核维护人员的官方建议,他们为您设置了一些有意设置的路障--您可能已经注意到您无法访问真正的sys_call_table符号,而写保护也是故意的。如果你能找到另一种方式去做你想做的事,那么你应该去做。根据您更大的目标,您可能能够使用ptrace完成它,而根本没有内核模块。trace_sched_process_fork钩子也可能很有用。

票数 8
EN

Stack Overflow用户

发布于 2013-07-23 16:37:56

还不清楚您是否解决了您的问题,但取决于您如何测试模块,glib不再使用sys_fork,而是使用sys_clone。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14415561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档