一、静态分析概述
静态分析是在不运行应用的前提下,通过反编译工具对 APK 文件进行解析的过程。相比动态调试,静态分析更安全(不触发反调试机制),是逆向工程的第一步。
核心流程为:APK 解包 → DEX 反编译 → Manifest 审查 → 敏感 API 追踪 → 硬编码搜索 → Smali 关键代码定位。
二、工具链搭建
首选工具组合:
| 工具 | 用途 | 仓库地址 |
|---|---|---|
| apktool | 解包/重打包 APK | https://github.com/iBotPeaches/Apktool |
| JADX | DEX → Java 反编译 | https://github.com/skylot/jadx |
| BytecodeViewer | 多引擎反编译 | https://github.com/Konloch/bytecode-viewer |
# 使用 apktool 解包 APK |
三、Manifest 审查
AndroidManifest.xml 是静态分析的起点,重点关注:
- exported 组件:Activity、Service、BroadcastReceiver 设置
android:exported="true"意味着可被第三方调用 - intent-filter:定义了组件响应的隐式 Intent
- permissions:自定义权限可能暴露敏感操作
- application 属性:
android:debuggable、android:allowBackup等安全相关属性
<!-- 高危示例:导出且无权限保护的 Activity --> |
四、敏感 API 追踪
在 JADX 中按 Ctrl+Shift+F 全局搜索以下关键字符串:
| 搜索关键词 | 目的 |
|---|---|
SecretKeySpec / Cipher |
加密算法及密钥 |
HttpURLConnection / OkHttp |
网络请求及后端地址 |
SharedPreferences / SQLiteDatabase |
本地存储敏感数据 |
getSignature |
签名校验逻辑 |
System.loadLibrary |
Native 库加载入口 |
Toast.makeText |
调试信息残留 |
五、硬编码秘密搜索
攻击者最常利用的一类漏洞就是硬编码。在 JADX 中搜索:
"http://" / "https://" → 后端 API 地址 |
六、Smali 代码阅读基础
当 JADX 反编译失败(如混淆过度的类)时,需要直接阅读 Smali 代码:
# 调用静态方法示例 |
Smali 中的寄存器命名规则:本地变量用 v0, v1...,方法参数用 p0, p1...(p0 在非静态方法中代表 this)。
面试常考问题
Q1:静态分析和动态分析的区别?什么时候优先选择静态分析?
A:静态分析不运行程序,通过反编译查看代码和资源;动态分析需要运行程序并通过调试器/Hook 观察运行时行为。当目标应用有反调试/反Hook机制时优先静态分析;当你想快速了解应用整体架构、搜索硬编码秘密时也优先静态分析。
Q2:JADX 反编译失败的原因有哪些?如何应对?
A:常见原因包括:DEX 被加固/加密、代码被深度混淆(控制流平坦化)、使用了 JADX 不支持的字节码特性。应对方法:先判断是否加固(用 apktool 解包看是否有壳特征文件),若是则先脱壳;若是混淆导致,可尝试 GDA 或 BytecodeViewer 的多个引擎交替使用;最后手段是直接阅读 Smali 代码。
Q3:如何在大量反编译代码中快速定位关键逻辑?
A:采用”由外向内”的策略:先看 Manifest 找到入口组件 → 在入口组件的 onCreate 中找核心逻辑调用 → 通过字符串搜索定位相关类 → 利用 JADX 的交叉引用(Xref)功能追溯调用链 → 使用”查字符串→查常量→查方法签名”的搜索技巧逐层深入。


