【问题标题】:How to get native system call address如何获取本机系统调用地址
【发布时间】:2012-06-20 06:32:28
【问题描述】:

在 Linux 上,我试图确定哪些系统调用已挂接(系统调用挂接),哪些未挂接。我需要回答以下问题:

  1. 如何从用户空间(具有 root 访问权限)读取挂钩系统调用的地址?

  2. 如何获取原系统调用的地址?

谢谢。

【问题讨论】:

    标签: linux kernel system-calls


    【解决方案1】:

    系统调用表存储在 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[] 向量数组中的地址。

    【讨论】:

    • 实际上,据我所知,sys_call_table 没有导出到最近的模块(不是最近的 tbh,2.6.something Linux 内核),所以他不能这样做。
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2018-09-26
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多