SVC 是ARM 架构中用于触发系统调用的指令。它类似于传统的 syscall 指令,主要用于在用户空间(user mode)和内核空间(kernel mode)之间进行上下文切换
作用:SVC 指令允许用户态程序请求操作系统提供的特权服务,通常是在用户程序需要执行特权操作(例如文件操作、内存分配等)时使用。执行流程:当执行 SVC 指令时,处理器会从用户模式切换到内核模式,操作系统会根据传入的参数和服务号决定执行哪个系统调用。执行完系统调用后,操作系统会返回并将控制权交还给用户程序。而在linux系统里面内存又分为内核态和用户态

SVC与中断

SVC 中断:当 SVC 指令被执行时,CPU 会触发一个中断,切换到内核模式,处理操作系统的服务请求。SVC 会提供一个中断号作为参数,这个参数通常用于指定要执行的系统调用编号(比如打开文件、创建进程等)。

  • 返回机制:操作系统会执行完相应的服务后,将控制权返回给用户程序。在返回时,CPU 会恢复到用户模式。
  • Syscall(系统调用)Syscall(System Call)是用户程序请求操作系统提供服务的一种机制。它是用户空间与内核空间之间的接口。用户程序不能直接访问内核资源,所以需要通过系统调用来向内核请求访问资源、执行特权操作等。
    • 作用:当用户程序需要执行特权操作时(例如访问硬件资源、修改内存保护、创建/删除文件等),它会发起一个系统调用。系统调用通常会由操作系统内核提供一组API来实现。
    • 工作原理:
      • 用户程序通过某种方式(比如调用一个库函数)发起系统调用。
      • 操作系统通过一个受保护的机制(比如通过软件中断或特殊的指令)来进行切换,将执行权从用户空间转移到内核空间。
      • 操作系统完成特定的操作后,返回执行结果并切换回用户空间。

Syscall函数里面的实现实际上就是一段汇编,这里面便是调用了svc这段指令。

image-20250328191344036

它无法被inlinehook Hook,所以会极大的提高安全程度。(update:搜到 svc 指令地址,仍然可以 inlinehook)

1
2
3
4
5
6
7
8
9
10
11
12
13
BTI c
MOV X8, X0
MOV X0, X1
MOV X1, X2
MOV X2, X3
MOV X3, X4
MOV X4, X5
MOV X5, X6
SVC 0
CMN X0, #1,LSL#12
CNEG X0, X0, HI
B.HI __set_errno_internal
RET
2025-03-28

⬆︎TOP