BlueStacks中ARM应用带异常序言系统函数注入调用崩溃问题
问题根因
- 出现异常的
SWI 2BF4E是BlueStacks为实现ARM应用在x86宿主设备上兼容运行自研的自定义软中断钩子,不属于标准ARM Linux系统调用范畴,仅BlueStacks内置运行时可以正确处理该软中断的上下文要求。 - JNI调用无崩溃的核心逻辑是:JNI上下文由BlueStacks运行时预先完成初始化,执行到
SWI 2BF4E时,模拟器hypervisor可识别当前执行流属于应用自身合法范围,会自动完成后续函数逻辑模拟,再将执行结果返回正常调用路径。 - 注入调用触发崩溃的本质是:注入的执行上下文缺少BlueStacks运行时为这类自定义软中断预设的上下文校验标记,hypervisor捕获到异常SWI指令时,判定当前执行流不属于应用原生合法调用,直接触发异常终止流程。哪怕提前替换了正常函数序言也无法解决问题——这类被修改序言的函数,后续执行逻辑本身也依赖BlueStacks的运行时钩子处理,并非原生ARM指令流。
mmap调用无异常是因为它属于标准Linux系统调用,BlueStacks未修改它的函数序言,走正常系统调用流程,无需自定义钩子处理,因此原生调用和注入调用都符合预期。
解决方案
- 优先选择通过
dlsym调用系统libc库中对应函数的原生实现,跳过BlueStacks添加的自定义钩子层; - 若必须调用应用内的修改版目标函数,可以先在应用原生JNI层注册一个跳板函数,注入代码仅调用该跳板函数,由跳板函数再触发目标函数调用,复用JNI合法上下文绕开hypervisor的上下文校验;
- 也可以手动解析
SWI 2BF4E对应的实际函数逻辑,用原生ARM指令实现等价逻辑,完全跳过该自定义软中断调用。
内容的提问来源于stack exchange,提问作者Jôsùå
相关产品推荐
相关产品推荐

