5、动态分析基础:Logcat监控、网络抓包、Activity生命周期监控

动态分析,说白了就是让应用跑起来,然后我们在旁边盯着它的一举一动。这跟静态分析完全不一样——静态分析是看图纸,动态分析是看实物运转。我个人觉得,真正能挖到深层次漏洞的,往往都是动态分析阶段。

今天咱们就聊三个最基础、也最实用的动态分析手段:Logcat监控网络抓包Activity生命周期监控。这三个东西,你只要玩熟了,大部分应用的安全状况就能摸个七七八八。

动态分析基础三大核心 Logcat 监控 网络抓包 Activity 生命周期 日志过滤 敏感信息泄露 HTTP/HTTPS 证书校验绕过 onCreate/onResume 页面劫持检测 三者结合 → 全面动态分析

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里——而且是没有加密的。嗯,这种问题其实挺常见的。

注意: 有些应用会在Release版本中关闭日志输出,但很多开发者会忘记。所以即使是在Release包上,也值得试一试。我曾经遇到过好几个应用,Release包依然在疯狂打日志。

5.2 网络抓包——看穿应用的网络通信

网络抓包是动态分析里最核心的一环。说白了,就是看看应用在跟服务器说什么悄悄话。有没有明文传输密码?有没有未加密的敏感数据?接口有没有做签名校验?这些全都能在抓包里看出来。

我常用的抓包工具是 Burp SuiteCharles。配置方式大同小异:

  1. 手机和电脑连同一个WiFi
  2. 手机设置代理,指向电脑IP和抓包工具端口
  3. 安装抓包工具的CA证书到手机上
  4. 开始抓包

但这里有个坑——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,本来应该只能从登录页跳转过去。但我用adb直接启动这个Activity,发现它竟然能独立运行,而且跳过了所有身份验证。这就是典型的Activity暴露漏洞。

怎么检测Activity是否暴露?用这个命令:

# 尝试直接启动某个Activity
adb shell am start -n com.example.app/.SecretActivity

# 如果启动成功,说明这个Activity是exported=true,且没有做权限校验

嗯,这里要注意,不是所有exported的Activity都有问题。但那些处理敏感数据、或者涉及支付/登录的Activity,如果被外部任意启动,那风险就很大了。

5.4 三者结合——真正的动态分析

单独用Logcat、抓包、生命周期监控,都能发现一些问题。但真正的价值在于把它们结合起来

我举个例子:

  1. 用生命周期监控发现应用在点击某个按钮后,跳转到了一个WebViewActivity
  2. 用抓包看到这个WebView加载了一个URL,里面带了用户的sessionId
  3. 用Logcat发现这个WebViewActivity在加载页面时,还把完整的URL打印到了日志里

你看,三个工具一结合,一个完整的漏洞链就出来了:敏感信息通过URL传递 → 又被日志泄露 → 攻击者只要拿到日志就能窃取session

我的工作流: 打开Logcat后台跑着 → 配置好抓包工具 → 开始操作应用 → 同时观察三个维度的数据。发现问题就停下来深挖,没问题就继续操作下一个功能。这样一轮下来,应用的安全状况基本就摸透了。

最后提醒一句:动态分析不是一次性的工作。同一个应用,不同的使用场景、不同的网络环境、不同的登录状态,可能暴露出来的问题都不一样。多跑几轮,多换几个角度,你会有意想不到的发现。


公众号:蓝海资料掘金营,微信deep3321