依赖ARM64偏移的Frida脚本在安卓模拟器运行失败的解决方法
解决依赖ARM64函数偏移的Frida脚本在安卓模拟器运行问题的方案
1. 适配x86_64架构的函数偏移
- 针对x86_64版本的Flutter应用(或对应架构的
libflutter.so)重新逆向,提取该架构下目标函数的偏移值,在脚本中通过判断当前设备架构切换使用对应偏移:const targetOffset = Process.arch === 'arm64' ? 0x123456 : 0xABCDEF; const targetFunc = Module.findBaseAddress('libflutter.so').add(targetOffset); - 注意:Flutter的
libflutter.so在不同架构下的符号布局差异极大,必须单独逆向x86_64版本,无法通过ARM64偏移直接换算。
2. 启用模拟器的ARM64翻译兼容(限支持的模拟器)
- 对Android Studio自带模拟器,创建AVD时选择支持ARM64的系统镜像,在模拟器设置中开启"Enable ARM64 Translation"选项。
- 启动后通过
adb shell getprop ro.product.cpu.abi确认返回arm64-v8a,此时应用以ARM64模式运行,原脚本的偏移可直接复用。 - 若出现兼容性问题,尝试更换不同版本的模拟器系统镜像。
3. 修复Redroid ARM64模拟器的运行环境
- 确保启动Redroid时指定纯ARM64环境,使用
--arch arm64-v8a参数启动实例,避免混合架构模式。 - 安装与宿主Frida版本完全匹配的ARM64版Frida Server,确认Frida能正常附加到目标进程。
- 验证应用运行架构:通过
adb shell ps -A | grep <包名>查看进程ABI信息,或用readelf -h /data/app/<包名>/lib/arm64/libflutter.so确认库的架构。 - 若仍有问题,尝试更换Redroid的稳定版本,或检查宿主系统的虚拟化支持(Intel VT-x/AMD-V)是否完全开启。
4. 基于符号或特征码定位函数(替代硬编码偏移)
- 若应用未完全剥离符号,直接通过符号名定位:
const targetFunc = Module.findExportByName('libflutter.so', '目标函数名'); - 若符号已被剥离,提取ARM64下目标函数的字节特征,通过特征码扫描定位:
const pattern = '48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 55'; const targetFunc = Instruction.parse(pattern).scanSync().pop();
5. 使用QEMU搭建纯ARM64安卓虚拟机
- 下载ARM64架构的安卓系统镜像(如LineageOS ARM64版本),通过QEMU命令行启动纯ARM64环境。
- 在虚拟机中安装ARM64版Frida Server和目标Flutter应用,此时运行环境与物理设备完全一致,原脚本可直接复用。
内容的提问来源于stack exchange,提问作者Ahmad Ahmad
相关产品推荐
相关产品推荐

