如何获取本机系统调用地址

Posted

技术标签:

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

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

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

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

谢谢。

【问题讨论】:

【参考方案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 内核),所以他不能这样做。

以上是关于如何获取本机系统调用地址的主要内容,如果未能解决你的问题,请参考以下文章

linux如何查看本机ip地址

有没有办法通过本机 C# 调用检测系统上安装了哪些 Windows 应用商店应用程序?

C#获取本机信息(本机名称,系统版本号,联网状态,IP地址)

Linux内核——通过模块动态添加系统调用

如何在 api 调用中使用异步等待获取在反应本机中通过基本身份验证

多种方法获取sys call table linux系统调用表 的地址