ARMv7安卓原生库中SVC 0xB0指令的作用是什么?
ARMv7中SVC 0xB0指令的用途分析
我正在分析一款Android应用的ARMv7原生库代码,发现了如下代码片段:
LOAD:0000FC20 getOpCode ; DATA XREF: LOAD:00000188↑o LOAD:0000FC20 ; LOAD:0003AFA8↓o LOAD:0000FC20 LDRSH R5, [R6,R2] LOAD:0000FC22 SVC 0xB0 LOAD:0000FC24 LDR R0, [R6,R2] LOAD:0000FC26 ADR R0, unk_10024 LOAD:0000FC28 PUSH {R1-R3,R5-R7,LR} LOAD:0000FC2A B stru_F4A4.r_offset+2我在网上找不到关于SVC 0xB0的相关信息,想请教该指令的用途是什么?
分析与解答
SVC指令的核心作用:SVC(Supervisor Call)是ARM架构中触发特权级操作的指令,执行后会切换到系统模式并跳转到对应的异常处理程序。指令后的立即数(此处为0xB0)是调用标识,处理程序会根据这个编号执行对应逻辑。
0xB0并非标准系统调用号:标准Android/Linux的ARMv7系统调用号范围普遍远小于0xB0(比如常用的
open调用号是5、read是3,最高仅几十),因此这个SVC 0xB0大概率是厂商自定义的私有系统调用,或是该原生库自身通过修改异常向量表,实现了用户态的SVC异常处理逻辑。结合代码上下文的推测:
- 执行SVC前通过
LDRSH R5, [R6,R2]加载半字数据到R5,这应该是在给该调用传递参数 - SVC执行后再次从
[R6,R2]加载数据到R0,说明这个调用会修改该地址指向的内存内容,后续逻辑会基于修改后的结果执行 - 后续的
ADR、寄存器入栈和跳转操作,说明调用完成后会进入特定处理流程,大概率是处理该调用的返回结果
- 执行SVC前通过
进一步排查方向:
- 查找该原生库中是否存在修改异常向量表的代码,定位SVC异常的处理入口
- 如果是定制ROM设备,可分析内核镜像中是否有对应0xB0编号的系统调用实现
- 通过动态调试,在
SVC 0xB0处下断点,观察执行前后寄存器、内存的变化,以及后续代码的执行走向
内容的提问来源于stack exchange,提问作者na29
相关产品推荐
相关产品推荐

