首页 / 资讯中心 / 文章详情

MASTG 动态分析基石:移动应用调试(Debugging)与跟踪(Tracing)技术全解

MASTG 动态分析基石:移动应用调试(Debugging)与跟踪(Tracing)技术全解 ★ FEATURED ARTICLE
文档教程网络安全【免费下载链接】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 MASTGMobile Application Security Testing Guide中 MASVS-RESILIENCE抗逆向工程类别的基础性知识也是移动应用安全测试与逆向工程中最常用的一组动态分析手段。本文以 MASTG-KNOW-0114 为骨架结合仓库内 Android 与 iOS 的完整技术条目TECH文档系统讲解调试器如何暂停、检查与篡改运行中的进程以及被动日志式跟踪在 Java 层、Native 层乃至 Linux 内核层的落地路径。读完本文你将掌握从jdb/lldb断点调试到strace/ftrace/KProbes 内核级跟踪再到 Frida 函数钩子式跟踪的完整技术栈并理解如何在真实 App 上完成从观察行为到提取密钥的实战闭环。一、调试与跟踪MASVS-RESILIENCE 语境下的两个核心概念在传统软件开发语境中调试Debugging是软件开发生命周期中识别和隔离程序缺陷bug的过程。但对于逆向工程师而言同一套调试工具的价值远不止找 bug——即使发现缺陷不是首要目标调试器依然是最有力的程序解剖工具。正如 MASTG 知识条目 MASTG-KNOW-0114 所概括的调试器提供了三项关键能力运行时暂停Suspension在程序执行的任意时间点挂起进程让分析者有充足时间观察现场进程内部状态检查Inspection读取进程内存、寄存器、变量、调用栈、已加载类与库状态篡改Modification直接改写寄存器、内存、局部变量与对象字段改变程序的执行流向与判断结果。这三项能力极大简化了程序检查过程——相比纯静态分析需要逐行猜测逻辑动态调试可以让分析者亲眼看到程序在做什么。跟踪Tracing则指对应用执行过程的被动日志记录例如记录 API 调用序列。跟踪与调试的关键区别在于跟踪通常不改变程序行为只是旁听并记录执行轨迹。MASTG 指出跟踪可以通过多种途径实现主要包括调试 API如 JDWPJava Debug Wire Protocol协议提供的 trace 指令函数钩子Function Hooks如 Frida 的 Interceptor 对目标函数进行挂钩并记录参数与返回值内核跟踪设施Kernel Tracing Facilities如 Linux 内核自带的 ftrace、KProbes以及用户态的strace系统调用跟踪器。更深入的单函数跟踪器实现原理可参考 Ole André Vadla Ravnås 的 Anatomy of a code tracer 一文——该文正是 Frida 作者对跟踪器内部机制的经典剖析本文不再展开。二、调试的两大战场Java 运行时层与 Native 层Android 应用支持两种类型的调试分别对应不同的技术栈详见 MASTG-TECH-0031调试层次协议/机制适用对象代表工具Java 运行时层JDWPJava Debug Wire ProtocolDalvik/ART 虚拟机中的 Java/Kotlin 代码jdb、Android StudioNative 层ptrace 体系Linux/Unix 风格ELF 共享库中的 C/C 代码lldb附lldb-server2.1 Java 层调试JDWP 与 jdb 实战Dalvik 与 ART 均支持 JDWP——一种用于调试器与 Java 虚拟机通信的标准协议。它被命令行工具和 Java IDE 广泛支持Android 实现中还包含对历史 DDMSDalvik Debug Monitor Server扩展特性的钩子支持现由 Android Studio Profiler 取代。JDWP 调试器支持对 Java 代码单步执行、在 Java 方法上设置断点以及检查/修改局部变量与实例变量——这覆盖了绝大多数不重度调用 Native 库的普通应用调试场景。建立调试通道的完整命令序列对应 MASTG-TECH-0031# 1. 列出设备上所有可调试托管 JDWP 传输进程的 PID adb jdwp # 输出示例 12167 # 2. 在主机上打开监听端口并将入站 TCP 连接转发到目标进程的 JDWP 传输 adb forward tcp:7777 jdwp:12167 # 3. 附加 jdb并通过管道预先注入 suspend 命令防止进程被附加后立即恢复执行 { echo suspend; cat; } | jdb -attach localhost:7777 Initializing jdb ... All threads suspended.注意附加调试器默认会让目标进程恢复运行而逆向分析通常希望进程保持挂起以便先探索。{ echo suspend; cat; } | jdb -attach ...这一技巧正是为此设计的——先把进程挂起再保持调试会话。在jdb会话内可用的高频命令?可列出全部命令包括classes列出所有已加载类class/methods/fields class id查看类详情及其方法、字段locals打印当前栈帧中的局部变量注意方法参数也会被列在 Local variables 下print/dump expr打印对象信息stop in method设置方法断点clear method移除方法断点set lvalue expr为字段/变量/数组元素赋新值。必须了解的限制Android VM 并非支持全部 JDWP 特性。例如redefine重定义类代码不被支持由于 release 字节码不含行号信息行断点不可用但方法断点可用。2.2 让不可调试应用可被调试目标 App 若未声明android:debuggabletrue有两条无需重打包的替代路径重打包修补 manifest 的方式见 MASTG-TECH-0038框架级 Hook用 MASTG-TOOL-0149 类框架 Hook 框架层对ApplicationInfo中FLAG_DEBUGGABLE标志的检查配合 MASTG-TOOL-0151 模块切换可调试状态使 JDWP 可附加。此方式需要 root 与 Hook 框架且 App 可能检测到。系统属性篡改在已 root 设备的特权 ADB shell 中执行resetprop ro.debuggable 1开启系统级调试若引发不稳定可临时用setenforce 0将 SELinux 置为 permissive。此方式噪音大、易被 App 检测。2.3 Native 层调试lldb 与 lldb-serverAndroid 原生代码打包为 ELF 共享库本质上与其他 Linux 原生程序无异因此可用标准工具调试需支持设备 CPU 架构主流 ARM 设备通常无碍。官方文档已声明 GDB 支持被废弃推荐改用lldb即 MASTG-TOOL-0152。附加到非可调试应用的完整流程需要 root# 1. 进入 root ADB shell启动 lldb-server 并监听 1234 端口 adb shell su /data/local/tmp/lldb-server p --server --listen 0.0.0.0:1234 # 2. 主机侧转发端口 adb forward tcp:1234 tcp:1234 # 3. 主机侧用 lldb 连接并附加$TARGET_PID 为目标进程 PID lldb (lldb) platform select remote-android (lldb) platform connect connect://localhost:1234 (lldb) process attach -p $TARGET_PID若目标应用本身可调试则可借助run-as在应用上下文内启动lldb-server无需 root# 以应用身份复制并启动 lldb-server$PACKAGE_NAME 为目标包名 adb shell run-as $PACKAGE_NAME cp /data/local/tmp/lldb-server /data/data/$PACKAGE_NAME/ adb shell run-as $PACKAGE_NAME chmod 700 /data/data/$PACKAGE_NAME/lldb-server adb shell run-as $PACKAGE_NAME /data/user/0/$PACKAGE_NAME/lldb-server platform --server --listen *:1234 adb forward tcp:1234 tcp:1234iOS 平台的动态分析同样依赖调试与跟踪设施见 MASTG-TECH-0067并常与 objection、Frida 等工具配合实现对沙盒目录、Keychain 数据等的运行时探查与提取。三、跟踪的五条实现路径从 Java 层到内核3.1 jdb 方法跟踪trace go methodsjdb不仅是调试器还内建基础执行跟踪能力详见 MASTG-TECH-0032。若要从 App 启动伊始就跟踪可借助 Wait for Debugger 特性或kill -STOP暂停应用附加 jdb 后在初始化方法如Application.clinit上设置延迟方法断点命中后用trace go methods开启方法跟踪再resume$ adb forward tcp:7777 jdwp:7288 $ { echo suspend; cat; } | jdb -attach localhost:7777 stop in com.acme.bob.mobile.android.core.BobMobileApplication.clinit() resume Breakpoint hit: threadmain, com.acme.bob.mobile.android.core.BobMobileApplication.clinit(), line44 bci0 main[1] trace go methods main[1] resume Method entered: All threads resumed.此后 jdb 将从命中点开始持续转储所有方法进入/退出事件形成一条完整的调用轨迹。3.2 Android Studio Profiler层次化 CPU 调用时间线Android Studio 内置的 Profiler 是已废弃 DDMS / Android Device Monitor 的现代替代品其中的CPU Profiler在逆向工程中尤其适用于高度混淆、调用图不清晰的应用它能录制执行轨迹并以可缩放的层次化时间线呈现方法调用、各方法耗时及父子调用关系从而在静态分析收效有限时恢复程序的高层执行结构。3.3 strace系统调用级跟踪当 Java 层跟踪不足以还原行为时分析重心应下移到 Native 代码与操作系统层面——此时程序行为通过系统调用与 Linux 内核的交互暴露出来。strace是标准 Linux 工具Android 默认未内置可用 Android NDK 从源码构建通过监控进程与内核的交互观察底层行为还能绕过部分应用层混淆。关键局限strace依赖ptrace系统调用附加目标进程一旦目标启用反调试措施就会附加失败。过滤型跟踪的典型命令各参数含义已由 MASTG 逐项说明strace -ff -s 2000 -p pgrep -f org.owasp.mastestapp | head -1 -e traceopenat,access,fstat,newfstatat,readlinkat,unlinkat,renameat,mkdirat,connect,sendto,recvfrom,ptrace,prctl,mmap,mprotect,execve-ff跟踪并跟随所有线程及 fork/clone 产生的子进程为每个线程/进程写独立输出流-s 2000字符串参数最多捕获 2000 字节对路径、套接字数据、ioctl 载荷至关重要-p指定附加的目标 PID示例中通过pgrep按包名自动定位-e trace限定要跟踪的系统调用集合降低噪音、聚焦关键行为。实测输出可清晰暴露敏感行为例如应用通过套接字收发数据、以及读写可能含敏感数据的 SharedPreferences 文件strace: Process 27524 attached with 19 threads [pid 27524] recvfrom(82, \1\0\0\0\364\22\0\0\376DI..., 2472, MSG_DONTWAIT, NULL, NULL) 312 [pid 27524] sendto(82, \2\0\0\0\364\22\0\0\1\0\0\0\0\0\0\0\26\34AI\t\207\0\0, 24, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) 24 [pid 27591] openat(AT_FDCWD, /data/user/0/org.owasp.mastestapp/shared_prefs/MasSharedPref_Sensitive_Data.xml, O_RDONLY) 97只想聚焦文件类调用时可使用-e tracefile缩写等价于-e traceopen,openat,creat,link,unlink,...可观察到应用访问MasSharedPref_Sensitive_Data.xml、用renameat2改名建备份、openat打开写入、最终unlinkat删除备份的完整读写链。早期附加Early Attachment应用启动早期的行为同样关键。最佳做法是在目标应用的开发者选项中开启 Wait for Debugger让系统在启动后立即挂起应用此时附加strace后再恢复执行。若该选项不可用可用轮询脚本在进程一出现即附加while true; do pid$(pgrep -f org.owasp.mastestapp | head -1); if [[ -n $pid ]]; then strace -s 2000 -e !read -ff -p $pid; break; fi; done注意这仅是近似早期附加真正的进程启动期跟踪需跟踪 zygote 或改用 ftrace 等内核级设施。3.4 ftrace内核内建的跟踪设施ftrace 是直接内建于 Linux 内核的跟踪设施在已 root 设备上比依赖ptrace/用户态附加的strace更透明可跟踪内核系统调用与调度事件。Android Lollipop/Marshmallow 的 stock 内核已包含 ftrace 支持启用命令echo 1 /proc/sys/kernel/ftrace_enabled控制文件集中于/sys/kernel/debug/tracing常用文件包括available_tracers列出内核编译进来的跟踪器、current_tracer选择当前生效的跟踪器、tracing_on控制环形缓冲区是否更新。3.5 KProbes可编程的内核探针KProbes 提供更强的内核级分析机制在几乎任意内核代码地址插入探针在目标位置放置断点指令命中时转移控制到用户自定义处理函数从而突破用户态跟踪被防御措施阻断的困局。除函数入口/出口跟踪外KProbes 还可用于改动内核行为等更激进的内核插桩。Jprobes 与 Kretprobes 是分别挂钩函数入口与出口的关联探针类型。需要注意stock Android 内核不支持可加载内核模块使 KProbes 部署复杂化且严格的内存保护禁止修补部分内核区域——例如 Lollipop/Marshmallow 上系统调用表不可写hook 会导致内核 panic。因此 KProbes 通常需在编译了放宽保护的自定义内核的受控环境中使用。四、函数钩子最灵活的主动式跟踪MASTG 知识条目强调函数钩子是跟踪的三大实现途径之一。以 FridaMASTG-TOOL-0001为代表的 Hook 工具既能被动记录也能主动篡改是调试器之外最重要的动态分析杠杆。4.1 挂钩网络 API无 MITM 的流量跟踪在应用层挂钩网络 API 拦截 HTTP 流量的思路中若只想确认敏感数据是否被发出无需部署完整的中间人攻击含 ARP 欺骗等也不触碰 TLS 校验与证书固定——只需挂钩正确的函数例如 OpenSSL 的SSL_write与SSL_read即可在数据到达网络层之前、加密完成之后截获明文。该方法尤其适用于使用自定义网络栈的应用Flutter 等跨平台框架构建的应用Android 见 MASTG-TECH-0109iOS 见 MASTG-TECH-0110BLE、NFC 等部署 MITM 成本过高的流量类型MQTT、CoAP、WebSocket 等需要专门拦截策略的协议。其代价在于自定义网络栈需要先逆向定位可用 API把跨多个方法调用与线程的 HTTP 请求/响应配对重组可能需要编写大量维护成本很高的 Hook 脚本。4.2 挂钩检测函数以 root 检测绕过为例绕过 Root 检测是跟踪/篡改能力的典型应用。objectionMASTG-TOOL-0029内建命令可一键 Hook 常见 root 检测 API 并返回安全值objection -n MASTestApp start MASTestApp (run) on (Android: 14) [usb] # android root disable对更复杂的检测可编写自定义 Frida 脚本挂钩java.io.File.exists()对含su/magisk的路径一律返回falseuse strict; Java.perform(function () { var File Java.use(java.io.File); var exists File.exists.overload(); exists.implementation function () { var path this.getAbsolutePath(); if (path.indexOf(su) ! -1 || path.indexOf(magisk) ! -1) { console.log([*] File.exists() bypassed for: path); return false; } return exists.call(this); }; });以frida -U -f package_name -l bypass_root.js加载后运行日志会逐条输出被拦截的 su 路径/sbin/su、/system/bin/su、/su/bin/su等十余处。五、实战闭环用调试器破解 UnCrackable 级 Crackme将上述能力串联起来的最佳范例是 MASTG 在 MASTG-TECH-0031 中演示的如何仅凭jdb攻克抗篡改/抗调试的 CrackmeMASTG-APP-0003。其过程完美展现了调试器暂停—检查—篡改三件套挂起进程用adb jdwpadb forwardsuspend管道附加 jdb进程保持挂起绕过敏捷弹在android.app.Dialog.setCancelable上设方法断点反复用locals检查参数、用set flag true篡改值最终让不可取消的警告弹窗变得可取消绕过即将退出的终止逻辑提取明文在java.lang.String.equals上设方法断点输入任意测试字符串并点击 verifylocals命令即可直接读到被比较的密文对应的明文如示例输出中的I want to believe。该案例同时说明调试器对 release 字节码无法使用行断点无行号信息只能依赖方法断点 单步执行这在无源码逆向中是常态。六、局限性与对抗动态分析的边界调试与跟踪并非万能MASTG 各条目明确指出了其固有局限ptrace 依赖strace与调试器附加都基于ptrace目标启用反调试后会直接失败MASTG-TECH-0032可调试性检查App 会检测FLAG_DEBUGGABLE标志与调试器附加状态resetprop ro.debuggable 1等系统级开启方式噪音大、易被识别MASTG-TECH-0031无源码调试限制行断点不可用、redefine不被支持单步时因基于反编译代码会产生跳行现象必须紧跟代码流MASTG-TECH-0031内核级插桩约束stock Android 内核不支持可加载内核模块系统调用表等区域受内存保护不可修补KProbes 需自定义内核环境MASTG-TECH-0032防御层次现代 App 常叠加多层检测文件、进程、系统属性、native 层、服务端校验客户端绕过无法对抗服务端校验MASTG-TECH-0144。七、小结调试与跟踪构成了 MASTG 动态分析的完整骨架调试器jdb/lldb提供暂停、检查、篡改三大能力覆盖从 Java 层 JDWP 到 Native 层 ptrace 的全部可执行代码跟踪则以被动日志为手段沿 jdb 方法轨迹、Android Studio Profiler 时间线、strace系统调用、ftrace/KProbes 内核探针这条从应用层下探到内核的纵深链路还原程序全貌函数钩子Frida/objection则在两者之间提供了兼具记录与篡改能力的灵活通道。在 MASVS-RESILIENCE 类别的安全测试中这组技术既是攻破抗逆向防御的武器也是评估 App 抵御动态分析能力如检测调试器附加、检测 ptrace 跟踪的标尺——理解它们是阅读仓库内 Android/iOS 全套动态分析测试用例tests与演示工程demos的前提。赞分享文档教程网络安全【免费下载链接】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点击查看免费下载相关推荐深入解析foobox-cn为foobar2000打造现代音乐播放体验的完整指南深入解析foobox cn为foobar2000打造现代音乐播放体验的完整指南 foobox cn是一个专为foobar2000设计的现代化DUI默认用户界桌面应用音视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站