INFO5995 Assignment 1 Task 1 - APK 逆向工程分析指南

INFO5995 Assignment 1 Task 1 - APK 逆向工程分析指南

本文档详细解析 APK 逆向工程作业的完整流程,帮助理解如何分析 Android 应用并发现安全漏洞。


1. 作业概述

这是一个 APK 逆向工程 作业,核心任务是: - 分析给定的 Android APK 文件 - 找出应用的基本信息(包名、入口 Activity) - 发现潜在的安全漏洞


2. 文件夹结构

apk_analysis_20260312_2119/
├── README/
│ ├── README.md # 总体说明
│ ├── FINDINGS_a1_case1.md # 已验证的发现结果
│ └── PLAYBOOK.md # 可重复的操作流程
├── apktool/ # apktool 反编译输出(资源 + manifest)
├── jadx/ # jadx 反编译输出(Java 源码)
└── a1_case1.apk # 原始 APK 文件

3. 工具介绍

工具 作用
apktool 把 APK 解包,得到 smali 代码和 AndroidManifest.xml
jadx 把 APK 反编译成 Java 源码(更可读)
aapt 查看 APK 的基本信息(包名、入口 Activity)
rg (ripgrep) 在源码里搜索关键词

3.1 环境配置

# 安装工具
brew install apktool jadx --quiet
brew install --cask android-commandlinetools --quiet

# 配置环境变量
export JAVA_HOME=/opt/homebrew/opt/openjdk/libexec/openjdk.jdk/Contents/Home
export PATH="$JAVA_HOME/bin:$PATH"
export ANDROID_SDK_ROOT=/opt/homebrew/share/android-commandlinetools

# 安装 build-tools
yes | sdkmanager --sdk_root="$ANDROID_SDK_ROOT" --licenses
sdkmanager --sdk_root="$ANDROID_SDK_ROOT" "build-tools;35.0.0"

4. 分析流程

Step 1: 基础信息提取

APK="/absolute/path/to/app.apk"

# 用 aapt 查看包名和入口 Activity
aapt dump badging "$APK" | rg "package:|launchable-activity:"

输出示例:

package: name='com.example.mastg_test0016'
launchable-activity: name='com.example.mastg_test0016.MainActivity'

Step 2: 反编译 APK

# 用 apktool 解包
apktool d "$APK" -o apktool

# 用 jadx 反编译成 Java 源码
jadx -d jadx "$APK"

Step 3: 查找关键文件

# 查看 AndroidManifest.xml
cat apktool/AndroidManifest.xml

# 搜索 Login 相关代码
rg -n --glob "*.java" -i "login|auth|password" jadx/sources/

5. 作业要求与答案

5.1 必须提交的内容

序号 要求 示例答案
1 Package Name com.example.mastg_test0016
2 Main Activity com.example.mastg_test0016.MainActivity
3 Manifest 文件路径 apktool/AndroidManifest.xml
4 Login 类文件路径 jadx/sources/com/example/mastg_test0016/Login.java
5 发现的漏洞 使用 java.util.Random 生成 session token

5.2 证据格式

每个答案需要包含: - 值(Value):具体的内容 - 证据(Evidence):从哪里发现的(命令输出、文件路径+行号)


6. 发现的漏洞分析

6.1 漏洞位置

  • 文件jadx/sources/com/example/mastg_test0016/Login.java
  • 函数generateSessionToken()

6.2 漏洞代码

private String generateSessionToken() {
Random random = new Random();
StringBuilder sb = new StringBuilder(16);
for (int i = 0; i < 16; i++) {
sb.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
.charAt(random.nextInt(62)));
}
return sb.toString();
}

6.3 漏洞危害

问题:使用 java.util.Random 生成 session token

为什么不安全: - Random 是伪随机数生成器(PRNG),不是密码学安全的 - 攻击者可以通过分析应用源码了解随机数生成逻辑 - 一旦知道种子或生成规律,可以预测后续的 token

影响: - 可能导致会话劫持(Session Hijacking) - 攻击者可以伪造有效用户的 session token - 绕过身份验证

6.4 修复建议

应使用密码学安全的随机数生成器:

// 正确做法:使用 SecureRandom
import java.security.SecureRandom;

private String generateSessionToken() {
SecureRandom random = new SecureRandom();
StringBuilder sb = new StringBuilder(16);
for (int i = 0; i < 16; i++) {
sb.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
.charAt(random.nextInt(62)));
}
return sb.toString();
}

7. 核心知识点

7.1 APK 是什么

  • APK = Android Package,即 Android 应用的安装包
  • 本质是一个 ZIP 文件,包含编译后的代码、资源、清单文件

7.2 为什么要逆向工程

  • 因为没有原始源码,只有编译后的 APK
  • 通过工具可以"反编译"回近似源码

7.3 安全漏洞类型

  • Cryptographic Misuse:密码学误用
  • 使用不安全的随机数生成器
  • 使用弱加密算法
  • 硬编码密钥

8. 总结

这个作业训练的核心能力:

  1. 工具使用:apktool、jadx、aapt、rg
  2. 静态分析:读代码、找问题
  3. 安全意识:识别密码学误用(Cryptographic Misuse)

核心发现:该应用使用 java.util.Random 生成 session token,这是不安全的,可能导致会话劫持。


参考资料

  • Android Manifest 文档
  • OWASP Mobile Top 10
  • Java SecureRandom API