如何获取本机系统调用地址
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 内核),所以他不能这样做。以上是关于如何获取本机系统调用地址的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法通过本机 C# 调用检测系统上安装了哪些 Windows 应用商店应用程序?
C#获取本机信息(本机名称,系统版本号,联网状态,IP地址)