Frida-dexdump 使用指南:从内存中脱取安卓 Dex 文件
我们来详细讲解一下 frida-dexdump 的用法。这是一款非常强大的、基于 Frida 的脱壳工具,常用于安卓应用的安全分析和逆向工程。
一、工具简介
frida-dexdump 是一个命令行工具,它利用 Frida 的注入能力,将目标安卓应用中正在内存里运行的 Dex 文件转储(Dump)出来。这对于分析经过加壳保护的 App 特别有效,因为很多加固技术会动态加载解密后的 Dex 到内存中,而 frida-dexdump 可以直接从内存中获取这些原始数据。
核心原理:附加到目标进程 -> 遍历内存 -> 识别 Dex 文件特征(如魔数 dex\n035\0)-> 将找到的内存块导出为 .dex 文件。
二、安装
安装非常简单,使用 Python 的包管理工具 pip 即可:
pip install frida-dexdump
前提条件:
- 已安装 frida-tools(通常安装 frida-dexdump 时会自动安装)。
- 电脑上已配置好 Android ADB 工具,并能与手机正常连接 (adb devices)。
- 手机上运行着对应架构的 frida-server(例如:adb push frida-server /data/local/tmp/ && adb shell “chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &”)。
三、基本用法
- 常用命令
最常见的用法是直接运行命令,它会列出所有正在运行的进程。
frida-dexdump
但这通常不是我们想要的,我们需要指定目标应用。
- 脱取指定应用的 Dex
使用 -U(连接到USB设备)和 -n(通过应用名称匹配)参数是最常用的方式。
语法:
frida-dexdump -U -n <包名>
示例:脱壳名为“某App”的应用,其包名为 com.example.app。
frida-dexdump -U -n com.example.app
执行后,工具会开始工作,并在当前终端目录下生成一个以 包名_时间戳 命名的文件夹(如 com.example.app_20230810_152321),里面存放着所有 dump 出来的 .dex 文件。
- 脱取前台应用
如果你不想手动输入包名,可以使用 -F 参数来直接针对当前前台应用进行操作,非常方便。
frida-dexdump -U -F
- 其他常用参数
参数 全称 说明
-U --usb 连接到 USB 设备(必须)
-n --name 通过进程名匹配(包名)
-F --front 匹配最前台的应用程序
-p --pid 通过进程 PID 附加
-f --file spawn 一个新的进程并附加(用于脱壳应用启动时的初始 Dex)
-d --debug 启用调试模式,输出更详细的信息
-h --help 显示帮助信息
重要参数 -f 的用法: 有些壳在应用启动初期就完成了加载,常规附加可能错过。这时可以用-f 参数让 Frida 启动应用并同时附加。
frida-dexdump -U -f com.example.app
执行此命令后,应用会被启动,并在启动过程中完成脱壳。注意:使用 -f 时,默认会 spawn 方式启动,可能会被某些反调试机制检测到。
四、实战流程与示例
假设我们要分析一个包名为 com.zhiliaoapp.musically的应用。
- 准备工作:
· 手机通过 USB 连接电脑,打开 USB 调试。
· 在电脑上执行 adb devices 确认设备已连接。
· 在手机上运行 frida-server。 - 寻找目标:
· 在手机上启动 TikTok App,使其处于前台。
· 或者在电脑上执行 adb shell ps | grep musically 来确认进程是否存在及其 PID。 - 开始脱壳: 方法 A (通过包名):
方法 B (通过前台应用):frida-dexdump -U -n com.zhiliaoapp.musically
方法 C (通过 PID): 首先查找 PID:adb shell pidof com.zhiliaoapp.musically,假设返回 12345。frida-dexdump -U -F
frida-dexdump -U -p 12345
- 等待完成: 命令行会输出类似如下信息:
这表示成功找到了 3 个 Dex 文件并已导出。Found 3 Dex files. Dumping to com.zhiliaoapp.musically_20230810_154722 [########################################] 3/3 Dumped: classes.dex Dumped: classes2.dex Dumped: classes3.dex
- 分析结果: 在当前目录下找到生成的文件夹,里面就是脱出来的 Dex 文件。你可以使用以下工具进行分析:
· jadx-gui:直接打开 .dex 文件查看反编译的 Java 代码。
· GDA、AKPS:等其他反编译工具。
· 如果脱出来的 Dex 被壳进行了进一步处理(混淆、压缩、加密),可能还需要其他修复手段才能被正确反编译。
五、常见问题与注意事项
- frida-server 未运行或版本不匹配:
· 错误信息:Failed to enumerate processes: unable to connect to remote frida-server
· 解决:确保手机上的 frida-server 正在运行,并且其版本与电脑上安装的 frida 和 frida-dexdump 版本一致。使用 frida --version 和手机运行 frida-server --version 检查。 - 没找到 Dex 文件 / 脱壳失败:
· 一些强壳会有反调试、反注入、内存混淆等机制,可能会检测到 Frida 或干扰内存扫描,导致 frida-dexdump 无法正常工作。
· 解决:尝试使用不同版本的 Frida,或者使用其他抗检测的 Frida 脚本(如 objection 的 android anti-root-disable)。在某些极端情况下,可能需要使用更底层的、定制化的脱壳机。 - 脱出来的 Dex 无法反编译:
· 这说明壳的保护机制生效了。它可能对 Dex 文件进行了加密、混淆或自定义打包,内存中的镜像并非标准格式。frida-dexdump 只是将内存块原样导出。
· 解决:这属于更深层次的脱壳和修复问题,超出了基础工具的范围,需要手动分析或使用其他高级工具(如 DumpDex,Zjdroid,或者自己写 Frida 脚本定位和修复)。 - 权限问题:
· 确保手机已获得 Root 权限,因为 frida-server 需要以 root 身份运行,并且扫描其他进程的内存也需要高权限。
总之,frida-dexdump 是入门安卓脱壳的首选神器,简单易用且效果显著。但对于越来越强的加固方案,可能需要更深入的技术才能成功脱壳。