关于 apktool
apktool 技能为 Android 安全研究人员提供 APK 反编译与重打包操作指引,可提取清单、资源和 smali 代码,并支持修改后重新构建。
主要功能
- 01解码 APK 清单与资源
- 02提取 smali 代码
- 03按需跳过资源或代码
- 04修改后重新构建 APK
适用场景
- 01检查应用权限和导出组件
- 02搜索资源中的密钥与 URL
- 03分析 smali 中的安全逻辑
- 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 可很好地配合其他分析工作流使用:
-
APK → 网络分析:
- 从资源中提取 API 端点
- 使用提取的 URL,通过 curl/wget 进行测试
- 将端点提供给网络测试工具
-
APK → 凭据发现:
- 在资源中查找硬编码凭据
- 使用凭据对 IoT 设备进行测试
- 配合 onvifscan 或其他设备测试工具使用
-
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