在 Linux 上,我试图确定哪些系统调用被挂钩(系统调用挂钩),哪些没有。我需要回答以下问题:
如何从用户空间(具有 root 访问权限)读取挂钩系统调用的地址?
如何获取原始系统调用的地址?
谢谢你。
在 Linux 上,我试图确定哪些系统调用被挂钩(系统调用挂钩),哪些没有。我需要回答以下问题:
如何从用户空间(具有 root 访问权限)读取挂钩系统调用的地址?
如何获取原始系统调用的地址?
谢谢你。
系统调用表存放在sys_call_table[]下面是linux kenrel中进入系统调用的汇编代码entry.S:
sysenter_do_call:
425 cmpl $(NR_syscalls), %eax
426 jae syscall_badsys
427 call *sys_call_table(,%eax,4)
428 movl %eax,PT_EAX(%esp)
429 LOCKDEP_SYS_EXIT
430 DISABLE_INTERRUPTS(CLBR_ANY)
431 TRACE_IRQS_OFF
432 movl TI_flags(%ebp), %ecx
433 testl $_TIF_ALLWORK_MASK, %ecx
434 jne sysexit_audit
由于 sys_call_table 在内核空间,用户态程序不能访问这个符号。您将不得不编写一个内核模块。在其中,您可以打印出存储在 sys_call_table[] 向量数组中的地址。