目录
  1. 1. 一、静态分析概述
  2. 2. 二、工具链搭建
  3. 3. 三、Manifest 审查
  4. 4. 四、敏感 API 追踪
  5. 5. 五、硬编码秘密搜索
  6. 6. 六、Smali 代码阅读基础
  7. 7. 面试常考问题
【逆向安全技术-实战篇】静态方式逆向应用

一、静态分析概述

静态分析是在不运行应用的前提下,通过反编译工具对 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
apktool d target.apk -o output_dir

# 使用 JADX 命令行反编译
jadx -d output_source target.apk

# 使用 JADX GUI 打开 APK
jadx-gui target.apk

三、Manifest 审查

AndroidManifest.xml 是静态分析的起点,重点关注:

  • exported 组件:Activity、Service、BroadcastReceiver 设置 android:exported="true" 意味着可被第三方调用
  • intent-filter:定义了组件响应的隐式 Intent
  • permissions:自定义权限可能暴露敏感操作
  • application 属性android:debuggableandroid:allowBackup 等安全相关属性
<!-- 高危示例:导出且无权限保护的 Activity -->
<activity
android:name=".SecretActivity"
android:exported="true" />

四、敏感 API 追踪

在 JADX 中按 Ctrl+Shift+F 全局搜索以下关键字符串:

搜索关键词 目的
SecretKeySpec / Cipher 加密算法及密钥
HttpURLConnection / OkHttp 网络请求及后端地址
SharedPreferences / SQLiteDatabase 本地存储敏感数据
getSignature 签名校验逻辑
System.loadLibrary Native 库加载入口
Toast.makeText 调试信息残留

五、硬编码秘密搜索

攻击者最常利用的一类漏洞就是硬编码。在 JADX 中搜索:

"http://" / "https://"     → 后端 API 地址
"secret" / "password" / "key" / "token" → 密钥
"AES" / "DES" / "RSA" → 加密算法常量
"BEGIN RSA PRIVATE KEY" → 硬编码私钥

六、Smali 代码阅读基础

当 JADX 反编译失败(如混淆过度的类)时,需要直接阅读 Smali 代码:

# 调用静态方法示例
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

# 条件跳转(if-eq 即 if equal)
if-eqz v0, :cond_0 # 如果 v0 == 0,跳转到 cond_0

# 寄存器赋值
const-string v0, "AES"
const/4 v1, 0x1

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)功能追溯调用链 → 使用”查字符串→查常量→查方法签名”的搜索技巧逐层深入。

打赏
  • 微信
  • 支付宝

评论