Linux教程

Linux关于sys_call_table的使用

本文主要是介绍Linux关于sys_call_table的使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
系统调用服务程序的地址存放在sys_call_table中,通过系统调用号定位到具体的系统调用地址,然后我们就可以通过编写内核模块来修改sys_call_table中的系统调用的地址来为我们自己定义的函数的地址,可以实现系统调用的拦截。但是我的版本不支持sys_call_table的导出,所以需要获得sys_call_table的地址,通过sudo cat /proc/kallsyms | grep sys_call_table

在这里插入图片描述
可以看出sys_call_table数组的首地址为0xffffffffb5c00300,权限为只读,所以我们还要修改它的权限。通过查阅可以知道,CR0的位16是写保护标志。当设置该标志时,处理器会禁止超级用户程序向用户级只读页面执行写操作;当该位复位时则反之,所以要将该位置0。由于最后要将CR0复原,因此利用了ret报存了cr0原来的值,最后调用asm volatile(“mov %%rax,%%cr0” ::“a”(val))将cr0复原。这里使用了volatile,表示不要对嵌入式汇编进行优化。

这篇关于Linux关于sys_call_table的使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!