5、动态分析基础:Logcat监控、网络抓包、Activity生命周期监控
动态分析,说白了就是让应用跑起来,然后我们在旁边盯着它的一举一动。这跟静态分析完全不一样——静态分析是看图纸,动态分析是看实物运转。我个人觉得,真正能挖到深层次漏洞的,往往都是动态分析阶段。
今天咱们就聊三个最基础、也最实用的动态分析手段:Logcat监控、网络抓包、Activity生命周期监控。这三个东西,你只要玩熟了,大部分应用的安全状况就能摸个七七八八。
5.1 Logcat监控——应用日志里的秘密
Logcat是Android系统自带的日志输出工具。应用运行时打印的所有日志,都会在这里显示。你想想看,如果一个应用在日志里打印了密码、Token、甚至是信用卡号……那这个漏洞就太明显了。
我习惯在测试一开始就打开Logcat,让它一直在后台跑着。命令很简单:
# 查看所有日志
adb logcat
# 按标签过滤(比如只看某个应用的日志)
adb logcat -s MyAppTag
# 按优先级过滤(只看错误和警告)
adb logcat *:W
# 更精准:只看某个应用的PID
adb logcat --pid=12345
adb logcat -v time 带上时间戳,这样回头排查问题时,能清楚知道每个日志发生的具体时间点。
在实际测试中,我经常用这个命令组合:
adb logcat -v time | grep -E "(password|token|secret|key|account)"
这一下就能把可能泄露敏感信息的日志行全筛出来。我曾经在一个银行类应用里,就通过这种方式发现它在登录成功后,把完整的sessionId打印到了Logcat里——而且是没有加密的。嗯,这种问题其实挺常见的。
5.2 网络抓包——看穿应用的网络通信
网络抓包是动态分析里最核心的一环。说白了,就是看看应用在跟服务器说什么悄悄话。有没有明文传输密码?有没有未加密的敏感数据?接口有没有做签名校验?这些全都能在抓包里看出来。
我常用的抓包工具是 Burp Suite 和 Charles。配置方式大同小异:
- 手机和电脑连同一个WiFi
- 手机设置代理,指向电脑IP和抓包工具端口
- 安装抓包工具的CA证书到手机上
- 开始抓包
但这里有个坑——Android 7.0以上默认不信任用户安装的CA证书。也就是说,你装了自己的证书,应用可能根本不认,直接报错或者拒绝连接。
怎么解决?我一般用这几种方法:
| 方法 | 适用场景 | 操作难度 |
|---|---|---|
| 修改应用AndroidManifest.xml 添加 android:networkSecurityConfig |
有源码或能反编译重打包 | 中等 |
| 使用VirtualXposed + JustTrustMe | 不想动APK文件 | 简单 |
| 刷入Magisk模块 (如MoveCertificates) |
有root权限的设备 | 较复杂 |
| 使用Frida hook证书校验函数 | 需要绕过SSL Pinning | 高级 |
核心思路: 不管用什么方法,最终目标就是让应用信任你的抓包证书。如果应用做了SSL Pinning(证书绑定),那就得用Frida或者Xposed来hook掉它的校验逻辑。
我个人最常用的是 VirtualXposed + JustTrustMe 组合。不需要root,不需要改APK,装个虚拟环境就能搞定。对于大部分没有做特别强校验的应用,这招基本够用。
抓包时重点关注这几类数据:
- 登录接口: 密码是不是明文?有没有加时间戳防重放?
- 支付/交易接口: 金额、订单号能不能篡改?
- 个人信息接口: 手机号、身份证、地址有没有加密?
- 接口签名: 参数有没有做签名校验?签名算法能不能猜出来?
5.3 Activity生命周期监控——页面跳转的秘密
Activity是Android应用的基本页面单元。每个Activity都有自己的一套生命周期:onCreate、onStart、onResume、onPause、onStop、onDestroy。监控这些生命周期,能帮我们发现很多安全问题。
比如:
- 应用有没有在后台偷偷打开某个Activity?
- 有没有不经过登录就直接跳转到内部页面?
- 有没有暴露了不该暴露的Activity(可被外部应用任意启动)?
监控Activity生命周期,我一般用两种方式:
方式一:使用adb命令
# 查看当前前台Activity
adb shell dumpsys activity activities | grep mResumedActivity
# 实时监控Activity跳转
adb shell dumpsys activity activities | grep -E "mResumedActivity|mFocusedActivity"
方式二:使用开发者选项
在手机的「开发者选项」里,打开 「不保留活动」 和 「显示所有ANR」,然后配合Logcat过滤 ActivityManager 标签,就能看到完整的生命周期日志:
adb logcat -s ActivityManager:I
# 输出示例:
# ActivityManager: START u0 {act=android.intent.action.VIEW dat=...} from uid 10086
# ActivityManager: Displayed com.example.app/.MainActivity: +1s234ms
# ActivityManager: Destroying com.example.app/.LoginActivity
怎么检测Activity是否暴露?用这个命令:
# 尝试直接启动某个Activity
adb shell am start -n com.example.app/.SecretActivity
# 如果启动成功,说明这个Activity是exported=true,且没有做权限校验
嗯,这里要注意,不是所有exported的Activity都有问题。但那些处理敏感数据、或者涉及支付/登录的Activity,如果被外部任意启动,那风险就很大了。
5.4 三者结合——真正的动态分析
单独用Logcat、抓包、生命周期监控,都能发现一些问题。但真正的价值在于把它们结合起来。
我举个例子:
- 用生命周期监控发现应用在点击某个按钮后,跳转到了一个WebViewActivity
- 用抓包看到这个WebView加载了一个URL,里面带了用户的sessionId
- 用Logcat发现这个WebViewActivity在加载页面时,还把完整的URL打印到了日志里
你看,三个工具一结合,一个完整的漏洞链就出来了:敏感信息通过URL传递 → 又被日志泄露 → 攻击者只要拿到日志就能窃取session。
我的工作流: 打开Logcat后台跑着 → 配置好抓包工具 → 开始操作应用 → 同时观察三个维度的数据。发现问题就停下来深挖,没问题就继续操作下一个功能。这样一轮下来,应用的安全状况基本就摸透了。
最后提醒一句:动态分析不是一次性的工作。同一个应用,不同的使用场景、不同的网络环境、不同的登录状态,可能暴露出来的问题都不一样。多跑几轮,多换几个角度,你会有意想不到的发现。
公众号:蓝海资料掘金营,微信deep3321