MacOS程序分析
使用系统调用和使用系统库函数类似,但是,系统库函数我们可以利用函数名进行调用,如_exit, _printf等。但是,我们使用系统调用,则只能利用系统调用号进行调用。这里还有一点需要注意的,就是之前在操作系统基础中提到过,macOS的内核XNU是分为BSD层和Mach层。我们常用的系统调用都属于BSD的系统调用。而BSD层在逻辑地址上是位于Mach层之上的,BSD层要从0x2000000开始。因此,我们实际使用的调用号应该是syscall.h给出的调用号加上0x2000000之后的结果,如SYS_exit的调用号就应当是0x2000001.
在汇编语言中,系统调用号应赋给rax寄存器,然后接下来系统调用的参数按照之前讲的调用约定,依次传给rdi, rsi等寄存器中。最后,使用syscall即可。
比如说,我们在程序中调用SYS_exit系统调用:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咲夜南梦's 博客!
评论