ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OWASP MASTG 实战:使用 Frida 对 Android 应用进行动态插桩与逆向分析

OWASP MASTG 实战:使用 Frida 对 Android 应用进行动态插桩与逆向分析 文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载本文以 OWASP Mobile Application Security Testing GuideMASTG中的 Frida (Android) 工具说明 为骨架系统讲解如何在 Android 应用安全测试中使用 Frida 完成 Java 运行时 Hook、Native 函数拦截、堆内存对象枚举与自动化脚本注入。读完本文你将掌握 frida-server 的安装与部署、frida-ps/frida-trace/frida CLI 的常用组合用法、Java API 的经典插桩范式并能结合 jadx-gui 与仓库内的真实 Demo如 MASTG-DEMO-0027、MASTG-DEMO-0107复现完整的动态分析工作流。一、Frida 是什么Android 动态插桩的核心工具Frida 是一款跨平台的动态插桩Dynamic Instrumentation工具其核心价值在于无需修改 APK、无需重新签名、无需重刷系统即可向运行中的进程注入 JavaScript 代码并与进程内的 Java 运行时和 Native 代码双向交互。在 Android 平台上Frida 通过 Java API 与 ART/Dalvik 虚拟机打交道可以实现实例化 Java 对象并调用类的静态方法与非静态方法替换 Java 方法的实现即 Hook在方法被调用时执行自定义逻辑枚举堆上的存活对象通过扫描 Java 堆找出某个类的所有活动实例扫描进程内存借助 Memory API 在进程内存中定位指定字符串拦截 Native 函数调用通过 Interceptor API 在 Native 函数入口entry与出口exit注入自定义代码同时覆盖 JNI 层代码。此外安装 Frida 时会自带一组命令行工具frida交互式 CLI、frida-ps进程/应用枚举、frida-ls-devices设备枚举、frida-trace函数调用跟踪等。它们共同构成了 Android 安全测试中最常用的动态分析工具箱。二、Frida 与 Xposed/LSPosed 的定位差异为什么选择 Frida在 MASTG 中Frida 经常被拿来与 XposedMASTG-TOOL-0027 及 LSPosedMASTG-TOOL-0149 比较。但 MASTG 明确指出这种比较并不公平——两者设计目标不同测试人员需要理解差异才能在正确场景中选择正确工具对比维度FridaXposed / LSPosed部署深度独立运行只需在目标设备上启动frida-server二进制不属于深度植入系统是 Zygote 的扩展版本通过导出的 API 在新进程启动时运行 Java 代码属于深度植入系统反馈回路短。修改或更新 Hook 无需重启设备无需软重启适合迭代式逆向长。应用 Hook 通常需要重启适合实现更永久的 Hook注入时机灵活。可在进程运行期间动态注入并即时更新JavaScript 代码既可通过frida的 spawn 模式做早期插桩也可 attach 到已运行到特定状态的 App相对固定依赖进程启动时机的加载机制语言/代码覆盖同时覆盖 Java 与 NativeJNI代码仅支持 Java 代码缺少 Native 代码支持这是 Xposed 的明显短板选型结论做迭代式的动态逆向尤其是既涉及 Java 又涉及 Native 的 App优先用 Frida实现长期稳定、随系统常驻的 Hook 模块时再考虑 Xposed/LSPosed 生态。三、在 Android 设备上安装 Fridafrida-server 部署3.1 非 Root 设备的替代方案MASTG 提醒即使设备未 Root也可以使用 Frida。具体方法见 MASTG-TECH-0026非 Root 设备上的动态分析其思路是补丁并重新打包目标 APK让 App 启动时加载 Frida Gadget 动态库再通过 objection 等工具进行动态测试。由于 Android 应用不像 iOS 那样受 FairPlay 加密保护无需 Root 即可从设备提取 APK。另外Android 模拟器是最简单的学习起点模拟器中的 App 不受物理设备硬件级限制可以直接用frida -Uattach 进程无需补丁二进制、无需重签名非常适合实验与脚本学习。3.2 Root 设备的安装步骤MASTG 文档默认讨论 Root 设备。安装流程如下从 Frida releases 页面 下载frida-server二进制必须匹配设备/模拟器的 CPU 架构x86、x86_64、arm或arm64。服务器版本至少主版本号必须与本机 Frida 客户端版本一致。PyPI 通常安装最新版可用以下命令确认本机版本frida --version也可以让命令自动检测版本并下载对应架构的 frida-serverwget https://github.com/frida/frida/releases/download/$(frida --version)/frida-server-$(frida --version)-android-arm.xz将 frida-server 推送至设备并启动adb push frida-server /data/local/tmp/ adb shell chmod 755 /data/local/tmp/frida-server adb shell su -c /data/local/tmp/frida-server # 若 su 需要指定 uidadb shell su 0 /data/local/tmp/frida-server 版本匹配是部署中最高频的坑frida-server 与客户端主版本不一致时连接会直接失败或行为异常务必先用frida --version核对。四、验证部署与枚举目标frida-ps 的三种用法frida-server 运行后先验证连接并找出目标应用。4.1 列出运行中的进程-U表示使用通过 USB 连接的设备或模拟器$ frida-ps -U PID Name ----- -------------------------------------------------------------- 276 adbd 956 android.process.media 198 bridgemgrd 30692 com.android.chrome 30774 com.android.chrome:privileged_process0 30747 com.android.chrome:sandboxed 30834 com.android.chrome:sandboxed 3059 com.android.nfc 1526 com.android.phone 17104 com.android.settings 1302 com.android.systemui (...)4.2 列出所有已安装应用组合标志-Uai-a列出应用、-i包含已安装应用、-UUSB 设备$ frida-ps -Uai PID Name Identifier ----- ---------------------------------------- ------------------------------ 766 Android System android 30692 Chrome com.android.chrome 3520 Contacts Storage com.android.providers.contacts - Uncrackable1 sg.vantagepoint.uncrackable1 - drozer Agent com.mwr.dz关键实践列表会显示所有应用的名称与 Identifier包名正在运行的进程会附带 PID。推荐始终用 Identifier包名指代目标应用因为 PID 在每次运行 App 时都会变化。例如对com.android.chrome该字符串可直接用于所有 Frida 工具CLI、frida-trace、Python 脚本。五、Native 函数跟踪frida-trace跟踪 Native 层低层库调用使用frida-trace。例如跟踪libc.so中的open函数frida-trace -U com.android.chrome -i open这条命令会在本地生成一个 JavaScript 文件__handlers__/libc.so/open.jsFrida 将其注入进程后跟踪所有对libc.so中open的调用。你可以按需修改生成的脚本配合完整的 Frida JavaScript API 定制日志逻辑。限制说明frida-trace 目前尚不支持按模式跟踪 Java 高层方法官方已有关注此能力的 issue见 frida-python 项目。Java 方法的 Hook 需要走下面的 Frida CLI Java API 路线。六、Frida CLI 与 Java API交互式插桩实战6.1 基本用法与脚本加载Frida CLIfrida将进程 Hook 后提供一个交互式命令行可直接输入 API 调用frida -U com.android.chrome用-l选项加载脚本文件例如加载myscript.jsfrida -U -l myscript.js com.android.chrome6.2 经典 Hook 范式重写 Activity 的 onResume下面的脚本展示了 Java API 最经典的三步走范式——Java.perform包裹、Java.use取类、覆盖implementationJava.perform(function () { var Activity Java.use(android.app.Activity); Activity.onResume.implementation function () { console.log([*] onResume() got called!); this.onResume(); }; });逐行解读Java.perform(...)确保回调在Java 虚拟机上下文中执行这是所有 Java 相关操作的入口Java.use(android.app.Activity)为android.app.Activity创建 Frida 包装器Activity.onResume.implementation function () {...}覆盖onResume的实现this.onResume()调用原始实现注意是在新实现内部通过this调用原方法这是先观察、再放行的关键——既能打印日志又不破坏应用原有行为。6.3 jadx-gui 一键生成 Frida 片段MASTG-APP-0003 实例手工编写 Hook 脚本容易出错MASTG 提供了更高效的路径使用反编译工具 jadxMASTG-TOOL-0018 的图形界面jadx-gui自动生成 Frida 片段。操作步骤用jadx-gui打开目标 APK 或 DEX 文件浏览到目标方法右键点击方法名选择Copy as frida snippet (f)。以 MASTG 的 CrackMe 应用 UnCrackable L1MASTG-APP-0003 为例生成过程如下上述操作会把以下内容复制到剪贴板将其保存为 JavaScript 文件后即可通过frida -U -l加载let a Java.use(sg.vantagepoint.a.a); a[a].implementation function (bArr, bArr2) { console.log(a is called , bArr: bArr , bArr2: bArr2); let ret this.a(bArr, bArr2); console.log(a ret value is ret); return ret; };该脚本 Hook 了sg.vantagepoint.a.a类中的a方法CrackMe 中典型的混淆类名在调用时打印两个字节数组参数并在返回后打印返回值用于观察加解密函数的关键输入输出。这正是 jadx 与 Frida 串联的典型工作流静态分析定位可疑方法 → 一键生成 Hook 模板 → 动态运行观察参数与返回值。6.4 堆枚举Java.choose 扫描存活对象Frida 还能直接搜索堆上已实例化的对象。下面的脚本查找android.view.View的所有实例并调用其toStringsetImmediate(function() { console.log([*] Starting script); Java.perform(function () { Java.choose(android.view.View, { onMatch:function(instance){ console.log([*] Instance found: instance.toString()); }, onComplete:function() { console.log([*] Finished heap search) } }); }); });setImmediate保证脚本加载后立即执行Java.choose的两个回调中onMatch在每找到一个实例时触发onComplete在扫描结束时触发。运行输出示例[*] Starting script [*] Instance found: android.view.View{7ccea78 G.ED..... ......ID 0,0-0,0 #7f0c01fc app:id/action_bar_black_background} [*] Instance found: android.view.View{2809551 V.ED..... ........ 0,1731-0,1731 #7f0c01ff app:id/menu_anchor_stub} [*] Instance found: android.view.View{be471b6 G.ED..... ......I. 0,0-0,0 #7f0c01f5 app:id/location_bar_verbose_status_separator} [*] Instance found: android.view.View{3ae0eb7 V.ED..... ........ 0,0-1080,63 #102002f android:id/statusBarBackground} [*] Finished heap search6.5 Java 反射枚举类方法利用 Java 反射能力可以从包装器的class属性调用getMethods列出类全部公有方法Java.perform(function () { var view Java.use(android.view.View); var methods view.class.getMethods(); for(var i 0; i methods.length; i) { console.log(methods[i].toString()); } });输出是一份超长的方法清单节选public boolean android.view.View.canResolveLayoutDirection() public boolean android.view.View.canResolveTextAlignment() public boolean android.view.View.canResolveTextDirection() public boolean android.view.View.canScrollHorizontally(int) public boolean android.view.View.canScrollVertically(int) public final void android.view.View.cancelDragAndDrop() public void android.view.View.cancelViewPager()...这种方法枚举常用于确认某个类在当前系统版本上的完整 API 面、为后续 Hook 挑选准确的签名或在没有源码/符号的情况下快速摸清类结构。七、仓库实战Frida 在 MASTG Demo 中的两种典型应用MASTG 仓库的 demos 目录 中沉淀了大量基于 Frida 的真实测试样本下面两个 Demo 分别展示了正向利用与逆向对抗两种视角。7.1 正向 HookMASTG-DEMO-0027 运行时 API 观测MASTG-DEMO-0027测试用例 MASTG-TEST-0249的目标是观测应用是否在运行时调用了KeyguardManager.isDeviceSecure与BiometricManager.canAuthenticate。其 run.sh 展示了 spawn 模式的标准用法#!/bin/bash frida -U -f org.owasp.mastestapp -l ./script.js -o output.txt参数解析-U连接 USB 设备-f org.owasp.mastestappspawn冷启动模式让 Frida 先拉起应用再做早期插桩对应文档中提到的 early instrumentation-l ./script.js加载 Hook 脚本-o output.txt把 console 输出重定向到文件便于后续断言分析。脚本在运行时记录KeyguardManager.isDeviceSecure与BiometricManager.canAuthenticate的调用输出中甚至包含调用来源文件与行号MastgTest.kt第 24 行与第 38 行。MASTG 同时提醒真实场景下生产构建或混淆这类信息可能不可得但只要观察到 API 在运行时被调用观测本身就成立。7.2 逆向对抗MASTG-DEMO-0107 的 Frida 检测与绕过思考MASTG-DEMO-0107 则站在防御方视角应用在 init 与mastgTest()中调用detectHooking()通过读取/proc/self/maps检查是否存在frida-agent、frida-gadget等字符串一旦命中立即Process.killProcess()自杀使 Hook 在捕获任何数据前就失效对应源码 MastgTest.ktprivate fun detectHooking(): Boolean { try { BufferedReader(FileReader(/proc/self/maps)).use { reader - var line: String? while (reader.readLine().also { line it } ! null) { val l line!!.lowercase() if (l.contains(frida) || l.contains(gadget)) { return true } } } } catch (_: Exception) { // Unable to read maps } return false }这从侧面说明Frida 的插桩行为本身可被进程检测进程内存映射中会出现 frida 相关库名。MASTG 文档随之指出对抗思路——攻击者可以转而 HookdetectHooking()方法本身或 Hook 更底层的文件读取 API隐藏 Frida 的内存痕迹对应 MASTG-DEMO-0108 的演示。了解这一攻防循环对评估真实应用的 Frida 检测强度很有价值。八、总结Frida 在 MASTG 方法论中的位置Frida 是 OWASP MASTG 动态分析流程的地基工具之一工具清单见 Testing Tools 索引。围绕本文内容可沉淀如下能力闭环部署按 CPU 架构下载匹配版本的 frida-serveradb push到/data/local/tmp/并提权运行非 Root 设备走 Frida Gadget APK 重打包路线MASTG-TECH-0026定位目标frida-ps -Uai获取包名用包名而非 PID 引用目标快速观察frida-trace -U app -i func跟踪 Native 函数frida -U -l script.js注入自定义脚本Java 层插桩掌握Java.perform/Java.use/implementation三件套配合Java.choose堆枚举与反射方法枚举效率工具用jadx-gui的 Copy as frida snippet 一键生成 Hook 模板静态定位 动态验证无缝衔接对抗意识理解/proc/self/maps等 Frida 检测原理辩证看待插桩行为的可见性。掌握以上流程后即可在 CrackMe 挑战UnCrackable 系列 或任意真实 Android 应用上独立完成从部署 Frida到定位并 Hook 关键方法的完整动态分析任务。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐OWASP MASTG 实战使用 Radare2 对 iOS 应用进行静态分析MASTG-TECH-0066OWASP MASTG 实战使用 Radare2 对 iOS 应用进行静态分析MASTG TECH 0066 本篇文章以 OWASP Mobile App文档教程网络安全OWASP MASTG 安卓运行时逆向工程实战使用 r2frida 从进程内存分析 Android 应用OWASP MASTG 安卓运行时逆向工程实战使用 r2frida 从进程内存分析 Android 应用 运行时逆向工程Runtime Reverse En文档教程网络安全革命性动态插桩工具Frida彻底改变应用逆向分析革命性动态插桩工具Frida彻底改变应用逆向分析 Frida是一款面向开发者、逆向工程师和安全研究人员的动态插桩工具包Dynamic instrumenta逆向工程应用安全网络安全上一篇Model-Optimizer ModelOpt Launcher 实战指南用 YAML 一键将量化、训练与评测任务提交到 Slurm 或本地 Docker下一篇Repowise 架构决策管理实战用 repowise decision 命令族记录、审查与维护代码背后的为什么创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进