Android 12下如何用Frida动态dump dex?求可行工具或代码
Android 12 下 Frida 动态 Dump Dex 解决方案
一、更新适配工具版本
- 优先把frida-dexdump更到最新版,新版已经针对Android 12的art模块改动做了适配,执行命令:
pip install --upgrade frida-dexdump - 运行时指定目标进程,比如:
frida-dexdump -U -n com.example.target,如果是加固应用,要确保Frida已经正确attach到进程再执行。
二、调整Hook函数适配Android 12
Android 12的libart.so中DefineClass函数签名发生了变化,旧版本的签名不再适用,需要替换为对应版本的函数:
- Android 12(API 31)对应的Hook函数签名为:
_ZN3art11ClassLinker11DefineClassEPNS_6ThreadEPKcmNS_6HandleINS_6mirror11ClassLoaderEEERKNS_7DexFileERKNS_6mirror8ClassDefE - 核心逻辑是从DexFile对象中读取dex的起始地址和大小,再将数据写入文件完成dump。
三、自定义Frida脚本示例
以下是适配Android 12的可直接运行的Frida脚本:
Java.perform(function() { var libart = Process.findModuleByName("libart.so"); var defineClass = libart.findSymbol("_ZN3art11ClassLinker11DefineClassEPNS_6ThreadEPKcmNS_6HandleINS_6mirror11ClassLoaderEEERKNS_7DexFileERKNS_6mirror8ClassDefE"); Interceptor.attach(defineClass, { onEnter: function(args) { var dexFile = args[5]; var dexAddr = dexFile.add(Process.pointerSize).readPointer(); var dexSize = dexFile.add(Process.pointerSize * 2).readUInt(); var dexBytes = dexAddr.readByteArray(dexSize); var fileName = "/sdcard/dump_" + dexSize + ".dex"; var file = new File(fileName, "wb"); file.write(dexBytes); file.close(); console.log("Dumped dex to: " + fileName); } }); });
- 使用方式:将脚本保存为
dump_dex_android12.js,执行命令:frida -U -f com.example.target -l dump_dex_android12.js --no-pause
四、注意事项
- 确保设备已root,且Frida版本与手机架构(arm64/x86)匹配
- 针对加固应用,需等待加固壳加载完成后再执行dump操作,可通过延迟Hook或等待特定类加载完成来触发
- 部分应用会检测Frida,可通过修改frida-server文件名、使用objection的隐藏技巧等方式规避检测
内容的提问来源于stack exchange,提问作者Rainker
相关产品推荐
相关产品推荐

