mcpField
A
apktool

apktool

github.com/brownfinesecurity安全875530 次安装21 周前更新
代码仓库

关于 apktool

apktool 技能为 Android 安全研究人员提供 APK 反编译与重打包操作指引,可提取清单、资源和 smali 代码,并支持修改后重新构建。

主要功能

  1. 01解码 APK 清单与资源
  2. 02提取 smali 代码
  3. 03按需跳过资源或代码
  4. 04修改后重新构建 APK

适用场景

  1. 01检查应用权限和导出组件
  2. 02搜索资源中的密钥与 URL
  3. 03分析 smali 中的安全逻辑
  4. 04提取图标和本地化字符串

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/brownfinesecurity/iothackbot --skill apktool

安装后在 Claude Code 中输入/apktool确认已加载。

详细介绍

Apktool - Android APK 解包与资源提取

你正在使用 apktool 帮助用户对 Android APK 文件进行逆向工程,以开展安全分析、漏洞发现和应用内部机制研究。

工具概览

Apktool 是一款用于 Android APK 文件逆向工程的工具。它可以将资源解码为接近原始形式的内容,并在修改后重新构建。它对于以下工作必不可少:

  • 提取可读的 AndroidManifest.xml
  • 解码资源(XML 布局、字符串、图片)
  • 将 DEX 反汇编为 smali 代码
  • 分析应用结构和权限
  • 重新打包修改后的 APK

前提条件

  • 系统必须安装 apktool
  • 需要 Java Runtime Environment (JRE)
  • 确保有足够的磁盘空间(解包后的 APK 通常是原始大小的 2-5 倍)
  • 对输出目录具有写入权限

说明

1. 基本 APK 解包(最常用)

当用户要求解包、解码或分析 APK 时:

标准解码命令:

apktool d <apk-file> -o <output-directory>

示例:

apktool d app.apk -o app-unpacked

强制覆盖(如果目录已存在):

apktool d app.apk -o app-unpacked -f
2. 了解输出结构

解包后,输出目录包含:

app-unpacked/
├── AndroidManifest.xml          # Readable manifest (permissions, components)
├── apktool.yml                  # Apktool metadata (version info, SDK levels)
├── original/                    # Original META-INF certificates
│   └── META-INF/
├── res/                         # Decoded resources
│   ├── layout/                  # XML layouts
│   ├── values/                  # Strings, colors, dimensions
│   ├── drawable/                # Images and drawables
│   └── ...
├── smali/                       # Disassembled DEX code (smali format)
│   └── com/company/app/        # Package structure
├── assets/                      # App assets (if present)
├── lib/                         # Native libraries (if present)
│   ├── arm64-v8a/
│   ├── armeabi-v7a/
│   └── ...
└── unknown/                     # Files apktool couldn't classify
3. 选择性解码(优化性能)

跳过资源(仅分析代码):

apktool d app.apk -o app-code-only -r
# or
apktool d app.apk -o app-code-only --no-res
  • 处理速度更快
  • 仅提取 smali 代码和清单文件
  • 仅需分析代码逻辑时使用

跳过源代码(仅分析资源):

apktool d app.apk -o app-resources-only -s
# or
apktool d app.apk -o app-resources-only --no-src
  • 处理速度更快
  • 仅提取资源和清单文件
  • 仅需资源、字符串和布局时使用
4. 常见分析任务
A. 检查 AndroidManifest.xml

清单文件揭示了重要的安全信息:

# After unpacking
cat app-unpacked/AndroidManifest.xml

检查以下内容:

  • 权限:应用访问哪些设备功能或数据
  • 已导出的组件:可被其他应用访问的 Activity、服务和接收器
  • Intent 过滤器:应用如何响应系统或应用的 Intent
  • 备份设置:android:allowBackup="true"(安全风险)
  • 可调试标志:android:debuggable="true"(严重安全问题)
  • 网络安全配置:自定义证书固定、明文流量
  • Min/Target SDK 版本:版本过时可能存在漏洞

分析命令示例:

# Find all permissions
grep "uses-permission" app-unpacked/AndroidManifest.xml

# Find exported components
grep "exported=\"true\"" app-unpacked/AndroidManifest.xml

# Check if debuggable
grep "debuggable" app-unpacked/AndroidManifest.xml

# Find all activities
grep "android:name.*Activity" app-unpacked/AndroidManifest.xml
B. 提取字符串和资源
# View all string resources
cat app-unpacked/res/values/strings.xml

# Search for API keys, URLs, credentials
grep -r "api" app-unpacked/res/values/
grep -r "http" app-unpacked/res/values/
grep -r "password\|secret\|key\|token" app-unpacked/res/values/

# Find hardcoded URLs in resources
grep -rE "https?://" app-unpacked/res/
C. 分析 Smali 代码

Smali 是 Dalvik 字节码的反汇编格式:

# Find specific class
find app-unpacked/smali -name "*Login*.smali"
find app-unpacked/smali -name "*Auth*.smali"

# Search for security-relevant code
grep -r "crypto\|encrypt\|decrypt" app-unpacked/smali/
grep -r "http\|https\|url" app-unpacked/smali/
grep -r "password\|credential\|token" app-unpacked/smali/

# Find native library usage
grep -r "System.loadLibrary" app-unpacked/smali/

# Find file operations
grep -r "openFileOutput\|openFileInput" app-unpacked/smali/

注意:Smali 比 Java 源代码更难阅读。可以考虑使用 jadx 反编译为 Java,以便更轻松地分析。

D. 检查原生库
# List native libraries
ls -lah app-unpacked/lib/

# Check architectures supported
ls app-unpacked/lib/

# Identify library types
file app-unpacked/lib/arm64-v8a/*.so

# Search for interesting strings in libraries
strings app-unpacked/lib/arm64-v8a/libnative.so | grep -i "http\|key\|password"
5. 重新打包 APK(构建)

修改资源或 smali 代码后:

apktool b app-unpacked -o app-modified.apk

重要:重新构建的 APK 必须先签名才能安装:

# Generate keystore (one-time setup)
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias

# Sign APK
jarsigner -verbose -keystore my-release-key.jks app-modified.apk my-key-alias

# Verify signature
jarsigner -verify app-modified.apk

# Zipalign (optimization)
zipalign -v 4 app-modified.apk app-modified-aligned.apk
6. 框架管理

对于系统应用或依赖设备制造商框架的应用:

# Install framework
apktool if framework-res.apk

# List installed frameworks
apktool list-frameworks

# Decode with specific framework
apktool d -t <tag> app.apk

常见工作流

工作流 1:安全分析
# 1. Unpack APK
apktool d target.apk -o target-unpacked

# 2. Examine manifest for security issues
cat target-unpacked/AndroidManifest.xml

# 3. Search for hardcoded credentials
grep -r "password\|api_key\|secret\|token" target-unpacked/res/

# 4. Check for debuggable flag
grep "debuggable" target-unpacked/AndroidManifest.xml

# 5. Find exported components
grep "exported=\"true\"" target-unpacked/AndroidManifest.xml

# 6. Examine network security config
cat target-unpacked/res/xml/network_security_config.xml 2>/dev/null
工作流 2:IoT 应用分析

对于 IoT 配套应用,查找设备通信详情:

# 1. Unpack APK
apktool d iot-app.apk -o iot-app-unpacked

# 2. Search for device endpoints
grep -rE "https?://[^\"']+" iot-app-unpacked/res/ | grep -v "google\|android"

# 3. Find API keys
grep -r "api\|key" iot-app-unpacked/res/values/strings.xml

# 4. Locate device communication code
find iot-app-unpacked/smali -name "*Device*.smali"
find iot-app-unpacked/smali -name "*Network*.smali"
find iot-app-unpacked/smali -name "*Api*.smali"

# 5. Check for certificate pinning
grep -r "certificatePinner\|TrustManager" iot-app-unpacked/smali/
工作流 3:仅提取资源
# Fast resource-only extraction
apktool d app.apk -o app-resources -s

# Extract app icon
cp app-resources/res/mipmap-xxxhdpi/ic_launcher.png ./

# Extract strings for localization
cat app-resources/res/values*/strings.xml

# Extract layouts for UI analysis
ls app-resources/res/layout/
工作流 4:快速检查代码(不含资源)
# Fast code-only extraction
apktool d app.apk -o app-code -r

# Analyze smali quickly
grep -r "http" app-code/smali/ | head -20
grep -r "password" app-code/smali/

输出格式

Apktool 没有内置的输出格式选项,但你可以整理分析结果:

适用于人类可读的报告:

# Generate analysis report
{
  echo "=== APK Analysis Report ==="
  echo "APK: app.apk"
  echo "Date: $(date)"
  echo ""
  echo "=== Permissions ==="
  grep "uses-permission" app-unpacked/AndroidManifest.xml
  echo ""
  echo "=== Exported Components ==="
  grep "exported=\"true\"" app-unpacked/AndroidManifest.xml
  echo ""
  echo "=== Package Info ==="
  grep "package=" app-unpacked/AndroidManifest.xml
} > apk-analysis-report.txt

与 IoTHackBot 工具集成

Apktool 可很好地配合其他分析工作流使用:

  1. APK → 网络分析:

    • 从资源中提取 API 端点
    • 使用提取的 URL,通过 curl/wget 进行测试
    • 将端点提供给网络测试工具
  2. APK → 凭据发现:

    • 在资源中查找硬编码凭据
    • 使用凭据对 IoT 设备进行测试
    • 配合 onvifscan 或其他设备测试工具使用
  3. APK → 代码分析:

    • 使用 apktool 提取 smali 代码
    • 使用 jadx 反编译为 Java,以便更轻松地阅读
    • 对照两种工具的结果进行交叉验证

最佳实践

1. 始终先检查清单文件
apktool d app.apk -o app-unpacked
cat app-unpacked/AndroidManifest.xml | less

清单文件为后续分析提供路线图。

2. 使用选择性解码提升速度
  • 仅解码代码:-r 标志
  • 仅解码资源:-s 标志
  • 完整解码:不使用标志(默认)
3. 系统地搜索
# Create analysis script
cat > analyze.sh << 'EOF'
#!/bin/bash
APK_DIR="$1"
echo "[+] Searching for URLs..."
grep -rE "https?://" "$APK_DIR/res/" | grep -v "schema\|google\|android"
echo "[+] Searching for API keys..."
grep -ri "api.*key\|apikey" "$APK_DIR/res/"
echo "[+] Searching for secrets..."
grep -ri "secret\|password\|credential" "$APK_DIR/res/"
EOF
chmod +x analyze.sh
./analyze.sh app-unpacked
4. 记录发现

记录以下信息:

  • APK 包名和版本
  • 值得关注的权限
  • 硬编码的凭据/URL
  • 导出的组件
  • 安全配置错误
5. 与 Jadx 配合使用

同时使用这两种工具:

  • Apktool:用于处理资源、清单和详细的 smali 代码
  • Jadx:用于查看可读的 Java 源代码

故障排除

问题:"brut.directory.DirectoryException: Framework"

解决方案:安装框架资源:

apktool if <framework-res.apk>
问题:解码因资源错误而失败

解决方案:使用 --keep-broken-res 标志:

apktool d app.apk -o output --keep-broken-res
问题:"Input file was not found or was not readable"

解决方案:检查文件路径和权限:

ls -l app.apk
file app.apk  # Should show "Zip archive data"
问题:内存不足错误

解决方案:增大 Java 堆大小:

export _JAVA_OPTIONS="-Xmx2048m"
apktool d large-app.apk
问题:修改后构建失败

解决方案:验证 smali/XML 语法:

# Check for syntax errors
apktool b app-unpacked -o test.apk --use-aapt2
问题:重新打包后 APK 无法安装

解决方案:对 APK 签名:

jarsigner -verbose -keystore debug.keystore rebuilt.apk androiddebugkey

重要说明

  • Apktool 需要 Java Runtime Environment (JRE)
  • 解码后的 APK 通常比原文件大 2–5 倍
  • Smali 代码比 Java 源代码更冗长(使用 jadx 查看 Java 代码)
  • 始终处理 APK 文件的副本,绝不要处理原文件
  • 重新打包后必须先签名才能安装
  • 某些经过混淆的应用可能会出现无法辨认的类名/方法名
  • 系统应用可能需要安装框架

安全与道德规范

重要:仅分析你拥有或获准分析的 APK。

  • 尊重知识产权和许可协议
  • 发现漏洞时遵循负责任披露原则
  • 未经授权,不要分发修改后的 APK
  • 注意服务条款和 EULA
  • 仅用于经过授权的安全测试和研究

成功标准

成功的 apktool 分析应满足以下条件:

  • APK 成功解码且无错误
  • AndroidManifest.xml 可读且已分析
  • 资源已提取并可供搜索
  • Smali 代码可供检查
  • 已记录与安全相关的发现
  • 输出已按清晰的目录结构整理
  • 如有需要,任何修改都可以重新打包

快速参考

# Decode (unpack)
apktool d <apk> -o <output-dir>

# Decode with force overwrite
apktool d <apk> -o <output-dir> -f

# Decode without resources (faster)
apktool d <apk> -o <output-dir> -r

# Decode without source (faster)
apktool d <apk> -o <output-dir> -s

# Build (repack)
apktool b <unpacked-dir> -o <output-apk>

# Install framework
apktool if <framework.apk>

# Empty framework cache
apktool empty-framework-dir

评论

支持 Markdown