需要编写一个内核模块,其中有一个用于执行的钩子。我找到了一种使用sys_calls_table和lsm的方法。据我所知,sys_calls_table与其说是正确的解决方案,不如说是黑客,我没有找到lsm的正常示例。
如何正确拦截现代内核版本中的系统调用?我会很乐意举例子的。
发布于 2022-04-04 20:59:08
没有正确的方法可以做到这一点。
LSM (,)不支持系统调用拦截,对于LSM,您需要实现defs.h列出的一些功能。
有两种方法可以拦截系统调用,我知道:
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);__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);https://stackoverflow.com/questions/71729062
复制相似问题