相关疑难解决方法(0)

拦截系统调用

我一直试图在内核级拦截系统调用.我从这个问题中得到了基本的想法.我试图拦截的系统调用是fork().所以我从System.map中找到了sys_fork()的地址,结果证明是0xc1010e0c.现在我编写了如下模块.

#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);
Run Code Online (Sandbox Code Playgroud)

但是,在编译模块后,当我尝试将其插入内核时,我从dmesg输出中得到以下内容. 在此输入图像描述 在此输入图像描述

当然它不会拦截系统调用.你能帮我解决问题吗?我使用的是3.2.0-4-686版本的Linux内核.

c linux kernel kernel-module linux-kernel

10
推荐指数
2
解决办法
2839
查看次数

linux-kernel模块中的系统调用拦截(内核3.5)

我需要用自己的实现替换标准系统调用(例如SYS_mkdir).

正如我在一些来源中读到的,包括Stackoverflow上的这个问题,sys_call_table自内核版本以来,它不是导出的符号2.6.

我尝试了以下代码:

    #include <linux/module.h> 
    #include <linux/kernel.h> 
    #include <linux/unistd.h> 
    #include <asm/syscall.h> 

    int (*orig_mkdir)(const char *path); 

    ....

    int init_module(void) 
    { 
            orig_mkdir=sys_call_table[__NR_mkdir]; 
            sys_call_table[__NR_mkdir]=own_mkdir;  
            printk("sys_mkdir replaced\n"); 
            return(0); 
    } 

    ....
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到编译错误:

 error: assignment of read-only location ‘sys_call_table[83]’
Run Code Online (Sandbox Code Playgroud)

如何更换系统调用?

编辑:有没有内核修补的解决方案?

c module kernel-module linux-kernel

9
推荐指数
3
解决办法
1万
查看次数

获取 Linux 内核模块中非导出内核符号地址的正确方法

我目前正在开发一个 Linux 内核模块来拦截一些系统调用,以便在系统范围内打印有关它们的统计信息。

我遇到过获取符号地址的不同方法sys_call_table,但尚未找到适用于最新内核(例如 5.11)的方法。在较旧的内核上,我们不会使用吗kallsyms_lookup_name?看起来该符号不再导出。

我可以看看/proc/kallsyms,但这似乎是一个坏主意并且不能概括。还有什么其他选择?

c system-calls linux-kernel

7
推荐指数
1
解决办法
2966
查看次数

禁用ARM中内存页面的写保护

我已经研究了在linux上禁用内核文本写保护的主题,我只能找到x86 linux的解决方案,它暂时清除cr0寄存器的第16位,写入内存,然后设置第16位cr0再次注册.但是,这对ARMv6及更高版本不起作用.这方面的一个例子是在这个页面内:Linux内核:系统调用挂钩示例.

ARM体系结构中不存在cr0寄存器,并且在链接的答案中声明的一些函数(如lookup_address,change_page_attr等)也不存在于ARM中.我尝试了ARM中存在的解决方案,比如set_memory_rw(没有改变任何东西,写入内核文本仍会导致oops),mem_text_write_kernel_word(写入内核文本仍会导致oops)等.

oops日志示例(格式化为演示文稿):

<3>[  239.987689] RKP -> Inst bf3e0098 out of cpu_v7_set_pte_ext range\
 from c01159c4 to c0115a1c
<1>[  239.988079] Unable to handle kernel paging request at virtual\
 address c01c1d50
<1>[  239.988123] pgd = ea8e4000
<1>[  239.988280] [c01c1d50] *pgd=0da00011
<0>[  239.988377] Internal error: Oops: 80f [#1] PREEMPT SMP ARM
<4>[  239.988416] Modules linked in: my_mod(O+) wlan(PO) mhi(O)
<4>[  239.988469] CPU: 0 PID: 5443 Comm: insmod \
 Tainted: P        W  O 3.10.0-2413392 #1
<4>[  239.988521] task: e4af4ec0 ti: da95a000 …
Run Code Online (Sandbox Code Playgroud)

arm linux-kernel mmu

6
推荐指数
1
解决办法
1552
查看次数

拦截系统调用

我一直试图在内核级别挂钩系统调用.我从这个问题得到了基本的想法.我试图拦截的系统调用是fork().所以我发现了sys_call_tablefrom 的地址,System.map结果证明是0xc12c9e90.现在我写的模块如下.

#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;
unsigned long addr;
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)
{
       struct page *pg;
       printk(KERN_ALERT "Module Intercept inserted");
       sys_call_table=(void *)0xc12c9e90;
       pg=virt_to_page(sys_call_table);
       addr=(unsigned long)page_address(pg);
       set_memory_rw(addr,1);
       original_call=sys_call_table[__NR_fork];
       sys_call_table[__NR_fork]=our_call;
       set_memory_ro(addr,1);
       return 0;
}
static void __exit p_exit(void)
{
       sys_call_table[__NR_fork]=original_call;
       set_memory_ro(addr,1);
       printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);
Run Code Online (Sandbox Code Playgroud)

我编译了模块并尝试将其插入内核.不幸的是,dmesg输出给了我一条消息如下BUG:无法在c12c9e98处理内核分页请求,这里是ellaborate dmesg out put

在此输入图像描述 在此输入图像描述

作为一个找出问题的实验,我只是评论了这一行

sys_call_table[__NR_fork]=our_call; …
Run Code Online (Sandbox Code Playgroud)

linux kernel linux-kernel

5
推荐指数
0
解决办法
224
查看次数

标签 统计

linux-kernel ×5

c ×3

kernel ×2

kernel-module ×2

linux ×2

arm ×1

mmu ×1

module ×1

system-calls ×1