首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确拦截Linux内核5.*中的系统调用?

如何正确拦截Linux内核5.*中的系统调用?
EN

Stack Overflow用户
提问于 2022-04-03 19:06:50
回答 1查看 369关注 0票数 2

需要编写一个内核模块,其中有一个用于执行的钩子。我找到了一种使用sys_calls_tablelsm的方法。据我所知,sys_calls_table与其说是正确的解决方案,不如说是黑客,我没有找到lsm的正常示例。

如何正确拦截现代内核版本中的系统调用?我会很乐意举例子的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 20:59:08

没有正确的方法可以做到这一点。

LSM (,)不支持系统调用拦截,对于LSM,您需要实现defs.h列出的一些功能。

有两种方法可以拦截系统调用,我知道:

  1. 挂起可以获得的sys_call_table,并用新函数覆盖指针: 无符号长*sys_call_table_ptr = kallsyms_lookup_name("sys_call_table");无符号长cr0 = read_cr0();write_cr0(cr0 & ~x86_CR0_WP);sys_call_table_ptr__NR_getpid = new_getpid;write_cr0(cr0);
  2. 使用k探针: Syscall函数名以前缀__do_sys_展开(参见DEFINEx)。例如,__do_sys_finit_module (或您想要的任何其他syscall )上的k探针如下所示: 静态结构k探针kp ={ .symbol_name = "__do_sys_finit_module",};静态int handler_pre(structk探针*p,struct pt_regs *regs) { //使用寄存器(调用传输)}静态int __init kprobe_init( kp.pre_handler = handler_pre;ret =register_kprobe(&kp))执行逻辑//获取函数参数;如果(ret < 0) { printk(KERN_INFO "register_kprobe failed,返回%d\n",ret);返回ret;} printk(KERN_INFO“在%p \n处植入k探头”,kp.addr);返回0;}静态空洞__exit kprobe_exit( void ) { unregister_kprobe(&kp);printk(KERN_INFO“在%p未注册\n处的k探针”,kp.addr);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71729062

复制
相关文章

相似问题

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