关于 jadx
jadx 技能面向 Android 安全分析人员,指导将 APK 中的 DEX 反编译为可读 Java 代码,并通过命令行或 GUI 检查应用逻辑。
主要功能
- 01将 DEX 反编译为 Java
- 02尝试对混淆代码去混淆
- 03提供命令行与 GUI 操作
- 04导出 Gradle 项目
适用场景
- 01搜索硬编码凭据和 API 地址
- 02检查加密、认证与存储逻辑
- 03追踪应用入口和网络通信
- 04批量反编译多个 APK
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ brownfinesecurity/ iothackbot --skill jadx安装后在 Claude Code 中输入/jadx确认已加载。
详细介绍
Jadx - Android APK 反编译器
你正在使用 jadx 帮助用户反编译 Android APK 文件,将 DEX 字节码转换为可读的 Java 源代码,以便进行安全分析、发现漏洞并了解应用内部实现。
工具概览
Jadx 是一款 dex 到 Java 的反编译器,可从 Android APK 文件生成简洁易读的 Java 源代码。与生成 smali 的 apktool 不同,jadx 生成的是真正的 Java 代码,更便于阅读和分析。它适用于:
- 将 DEX 字节码转换为可读的 Java 源代码
- 了解应用逻辑和控制流
- 发现代码中的安全漏洞
- 查找硬编码的凭据、API 密钥和 URL
- 分析加密和身份验证实现
- 使用熟悉的 Java 语法搜索代码
前置条件
- 必须安装 jadx(以及可选的 jadx-gui)
- 需要 Java 运行时环境(JRE)
- 确保有足够的磁盘空间(反编译后的输出通常是 APK 大小的 3–10 倍)
- 对输出目录拥有写入权限
GUI 与 CLI
Jadx 提供两种界面:
CLI(jadx):命令行界面
- 适用于自动化和脚本编写
- 批量处理多个 APK
- 与其他工具集成
- 无头服务器环境
GUI(jadx-gui):图形界面
- 交互式浏览代码
- 内置搜索功能
- 交叉引用和导航
- 更便于手动分析
- 语法高亮
何时使用:
- 自动化分析、脚本编写和 CI/CD 流水线:使用 CLI
- 交互式探索和深入分析:使用 GUI
使用说明
1. 基本 APK 反编译(最常见)
标准反编译命令:
jadx <apk-file> -d <output-directory>
示例:
jadx app.apk -d app-decompiled
启用反混淆(推荐用于混淆过的应用):
jadx --deobf app.apk -d app-decompiled
2. 了解输出结构
反编译后,输出目录包含:
app-decompiled/
├── sources/ # Java source code
│ └── com/company/app/ # Package structure
│ ├── MainActivity.java
│ ├── utils/
│ ├── network/
│ └── ...
└── resources/ # Decoded resources
├── AndroidManifest.xml # Readable manifest
├── res/ # Resources
│ ├── layout/ # XML layouts
│ ├── values/ # Strings, colors
│ ├── drawable/ # Images
│ └── ...
└── assets/ # App assets
3. 反编译选项
A. 性能选项
多线程反编译(更快):
jadx -j 4 app.apk -d output
# -j specifies number of threads (default: CPU cores)
跳过资源(仅反编译代码,速度快得多):
jadx --no-res app.apk -d output
跳过源代码(仅保留资源):
jadx --no-src app.apk -d output
B. 反混淆选项
启用反混淆:
jadx --deobf app.apk -d output
- 重命名混淆过的类(a.b.c → 有意义的名称)
- 尝试恢复原始名称
- 大幅提升代码可读性
- 对混淆或压缩过的应用至关重要
输出反混淆映射:
jadx --deobf --deobf-use-sourcename app.apk -d output
- 执行更积极的反混淆
- 使用源文件名作为重命名标识符的提示
C. 输出控制
显示不一致或有问题的代码:
jadx --show-bad-code app.apk -d output
- 显示无法干净反编译的代码
- 有助于发现混淆或反反编译技巧
- 可能包含语法错误,但可以揭示代码结构
导出为 Gradle 项目:
jadx --export-gradle app.apk -d output
- 创建可构建的 Gradle Android 项目
- 适用于重新构建或修改应用
- 包含 build.gradle 文件
回退模式(反编译失败时使用):
jadx --fallback app.apk -d output
- 使用替代的反编译策略
- 生成的代码不够简洁,但可以处理边缘情况
4. 常见分析任务
A. 搜索敏感信息
反编译后,搜索常见安全问题:
# Search for API keys
grep -r "api.*key\|apikey\|API_KEY" app-decompiled/sources/
# Search for passwords and credentials
grep -r "password\|credential\|secret" app-decompiled/sources/
# Search for hardcoded URLs
grep -rE "https?://[^\"]+" app-decompiled/sources/
# Search for encryption keys
grep -r "AES\|DES\|RSA\|encryption.*key" app-decompiled/sources/
# Search for tokens
grep -r "token\|auth.*token\|bearer" app-decompiled/sources/
# Search for database passwords
grep -r "jdbc\|database\|db.*password" app-decompiled/sources/
B. 查找安全漏洞
SQL 注入:
grep -r "SELECT.*FROM.*WHERE" app-decompiled/sources/ | grep -v "PreparedStatement"
grep -r "rawQuery\|execSQL" app-decompiled/sources/
不安全的加密:
grep -r "DES\|MD5\|SHA1" app-decompiled/sources/
grep -r "SecureRandom.*setSeed" app-decompiled/sources/
grep -r "Cipher.getInstance" app-decompiled/sources/ | grep -v "AES/GCM"
不安全的存储:
grep -r "SharedPreferences" app-decompiled/sources/
grep -r "MODE_WORLD_READABLE\|MODE_WORLD_WRITABLE" app-decompiled/sources/
grep -r "openFileOutput" app-decompiled/sources/
WebView 漏洞:
grep -r "setJavaScriptEnabled.*true" app-decompiled/sources/
grep -r "addJavascriptInterface" app-decompiled/sources/
grep -r "WebView.*loadUrl" app-decompiled/sources/
证书锁定绕过:
grep -r "TrustManager\|HostnameVerifier" app-decompiled/sources/
grep -r "checkServerTrusted" app-decompiled/sources/
C. 了解应用逻辑
查找入口点:
# Main activities
grep -r "extends Activity\|extends AppCompatActivity" app-decompiled/sources/
# Application class
grep -r "extends Application" app-decompiled/sources/
# Services
grep -r "extends Service" app-decompiled/sources/
# Broadcast receivers
grep -r "extends BroadcastReceiver" app-decompiled/sources/
追踪网络通信:
# Find HTTP client usage
grep -r "HttpURLConnection\|OkHttpClient\|Retrofit" app-decompiled/sources/
# Find API endpoints
grep -r "@GET\|@POST\|@PUT\|@DELETE" app-decompiled/sources/
# Find base URLs
grep -r "baseUrl\|BASE_URL\|API_URL" app-decompiled/sources/
查找身份验证逻辑:
grep -r "login\|Login\|authenticate\|Authorization" app-decompiled/sources/
grep -r "jwt\|JWT\|bearer\|Bearer" app-decompiled/sources/
D. 分析特定类
找到感兴趣的类后,直接读取:
# View specific class
cat app-decompiled/sources/com/example/app/LoginActivity.java
# Use less for pagination
less app-decompiled/sources/com/example/app/network/ApiClient.java
# Search within specific class
grep "password" app-decompiled/sources/com/example/app/LoginActivity.java
5. GUI 模式(交互式分析)
启动 GUI:
jadx-gui app.apk
GUI 功能:
- 全文搜索:Ctrl+Shift+F(搜索所有代码)
- 查找用法:右键单击类/方法 → “Find usage”
- 转到声明:Ctrl+单击任意类/方法
- 反编译:单击任意类以查看 Java 代码
- 保存反编译代码:File → Save all
- 导出选项:File → Export as Gradle project
GUI 工作流:
- 使用 jadx-gui 打开 APK
- 在左侧面板浏览包结构
- 使用搜索(Ctrl+Shift+F)查找关键词
- 单击结果以查看上下文中的代码
- 使用 Ctrl+单击跟踪交叉引用
- 保存有用的发现
6. 与其他工具集成
将 Jadx 与 Apktool 结合使用
这两种工具可以互相补充:
Jadx 的优势:
- 易读的 Java 源代码
- 逻辑易于理解
- 可快速搜索代码
Apktool 的优势:
- 准确提取资源
- Smali 代码(更接近原始代码)
- 可以重建/重新打包 APK
推荐工作流:
# Use jadx for code analysis
jadx --deobf app.apk -d app-jadx
# Use apktool for resources and smali
apktool d app.apk -o app-apktool
# Analyze both outputs
grep -r "API_KEY" app-jadx/sources/
grep -r "api_key" app-apktool/res/
常见工作流
工作流 1:安全评估
# 1. Decompile with deobfuscation
jadx --deobf app.apk -d app-decompiled
# 2. Search for hardcoded secrets
echo "[+] Searching for API keys..."
grep -ri "api.*key\|apikey" app-decompiled/sources/ | tee findings-apikeys.txt
echo "[+] Searching for passwords..."
grep -ri "password\|passwd\|pwd" app-decompiled/sources/ | tee findings-passwords.txt
echo "[+] Searching for URLs..."
grep -rE "https?://[^\"]+" app-decompiled/sources/ | tee findings-urls.txt
# 3. Check crypto usage
echo "[+] Checking crypto implementations..."
grep -r "Cipher\|SecretKey\|KeyStore" app-decompiled/sources/ | tee findings-crypto.txt
# 4. Check for insecure storage
echo "[+] Checking storage mechanisms..."
grep -r "SharedPreferences\|SQLite\|openFileOutput" app-decompiled/sources/ | tee findings-storage.txt
# 5. Summary
echo "[+] Analysis complete. Check findings-*.txt files"
工作流 2:IoT 应用分析
对于 IoT 配套应用,查找设备通信:
# 1. Decompile
jadx --deobf iot-app.apk -d iot-app-decompiled
# 2. Find device communication
echo "[+] Finding device endpoints..."
grep -rE "https?://[^\"]+" iot-app-decompiled/sources/ | \
grep -v "google\|android\|facebook" | \
tee device-endpoints.txt
# 3. Find API structure
echo "[+] Finding API definitions..."
grep -r "@GET\|@POST\|@PUT" iot-app-decompiled/sources/ | tee api-endpoints.txt
# 4. Find authentication
echo "[+] Finding auth mechanisms..."
grep -r "Authorization\|authentication\|apiKey" iot-app-decompiled/sources/ | tee auth-methods.txt
# 5. Find device discovery
echo "[+] Finding device discovery..."
grep -r "discover\|scan\|broadcast\|mdns" iot-app-decompiled/sources/ | tee device-discovery.txt
# 6. Check for certificate pinning
echo "[+] Checking certificate pinning..."
grep -r "CertificatePinner\|TrustManager" iot-app-decompiled/sources/ | tee cert-pinning.txt
工作流 3:快速检查凭据
# Fast decompilation without resources
jadx --no-res --deobf app.apk -d app-code
# Search for common credential patterns
grep -r "username.*password\|user.*pass" app-code/sources/
grep -r "admin\|root\|default.*password" app-code/sources/
grep -r "hardcoded\|TODO.*password\|FIXME.*password" app-code/sources/
工作流 4:发现 API 端点
# Decompile
jadx app.apk -d app-decompiled
# Find Retrofit/REST API definitions
find app-decompiled/sources -name "*Api*.java" -o -name "*Service*.java" -o -name "*Client*.java"
# Extract all endpoints
grep -r "@GET\|@POST\|@PUT\|@DELETE\|@PATCH" app-decompiled/sources/ | \
sed 's/.*@\(GET\|POST\|PUT\|DELETE\|PATCH\)("\([^"]*\)".*/\1 \2/' | \
sort -u
# Find base URLs
grep -r "baseUrl\|BASE_URL\|API_BASE" app-decompiled/sources/
工作流 5:批量处理多个 APK
# Decompile multiple APKs
for apk in *.apk; do
name=$(basename "$apk" .apk)
echo "[+] Processing $apk..."
jadx --no-res --deobf "$apk" -d "decompiled-$name"
# Quick search for secrets
grep -r "api.*key\|password\|secret" "decompiled-$name/sources/" > "findings-$name.txt"
done
echo "[+] All APKs processed. Check findings-*.txt files"
最佳实践
1. 始终对生产应用进行反混淆
# Most production apps are obfuscated
jadx --deobf app.apk -d output
如果不使用 --deobf,你会看到类似这样的代码:
public class a {
public void b(String c) { ... }
}
使用 --deobf 后,jadx 会尝试使用有意义的名称:
public class NetworkClient {
public void sendRequest(String url) { ... }
}
2. 对大型应用使用多线程
# Faster decompilation
jadx -j 8 large-app.apk -d output
3. 仅分析代码时跳过资源
# 3-5x faster when you only need code
jadx --no-res app.apk -d output
4. 系统地搜索
请按照此技能末尾的安全分析检查清单逐项检查,而不是随意使用 grep。
5. 使用 GUI 进行深入分析
对于复杂应用:
- 使用 CLI 进行初步反编译
- 搜索有用的模式
- 在 GUI 中打开以进行详细探索
- 使用交叉引用追踪代码流
6. 结合运行时分析
静态分析(jadx)+ 动态分析:
- 使用 jadx 查找 API 端点
- 使用 curl/burp 测试端点
- 使用 jadx 理解身份验证流程
- 使用运行时插桩(Frida)测试身份验证
故障排除
问题:反编译失败并出现错误
解决方案:使用回退模式或显示错误代码:
jadx --fallback --show-bad-code app.apk -d output
问题:代码不可读(已混淆)
解决方案:启用反混淆:
jadx --deobf app.apk -d output
问题:内存不足错误
解决方案:通过 jadx 启动器读取的 JVM 选项(JAVA_OPTS 或 JADX_OPTS)增大 Java 堆大小:
export JAVA_OPTS="-Xmx4096m"
jadx app.apk -d output
(jadx 没有自己的 -Xmx 参数;必须将堆大小传给 JVM,而不是 jadx。)
问题:反编译速度非常慢
解决方案:跳过资源或使用更多线程:
jadx --no-res -j 8 app.apk -d output
问题:某些方法显示“Can't load method”
解决方案:使用 --show-bad-code 查看部分反编译结果:
jadx --show-bad-code app.apk -d output
问题:GUI 无法打开 APK
解决方案:先使用 CLI 检查错误:
jadx app.apk -d test-output
# If successful, try GUI again
高级功能
导出为 Gradle 项目
jadx --export-gradle app.apk -d app-project
cd app-project
./gradlew build
这会创建一个可构建的 Android Studio 项目。
生成反混淆映射
jadx --deobf --deobf-use-sourcename app.apk -d output
# Check output/mapping.txt for name mappings
自定义反编译选项
# All options combined
jadx \
--deobf \
--deobf-use-sourcename \
--show-bad-code \
--no-imports \
--no-inline-anonymous \
--no-replace-consts \
app.apk -d output
与 IoTHackBot 工具集成
Jadx 可融入 IoTHackBot 工作流:
-
APK → API 发现:
- 使用 jadx 反编译 IoT 应用
- 提取 API 端点
- 使用网络工具测试端点
-
APK → 凭据提取:
- 查找硬编码凭据
- 对 IoT 设备进行测试
- 与 onvifscan、telnetshell 配合使用
-
APK → 协议分析:
- 理解设备通信协议
- 使用 iotnet 捕获流量
- 使用自定义脚本重放/修改流量
-
APK → 设备枚举:
- 查找设备发现机制
- 使用 wsdiscovery 发现 ONVIF 设备
- 使用 nmap 扫描网络
快速参考
# Basic decompilation
jadx <apk> -d <output-dir>
# With deobfuscation (recommended)
jadx --deobf <apk> -d <output-dir>
# Fast (no resources)
jadx --no-res <apk> -d <output-dir>
# Multi-threaded
jadx -j <threads> <apk> -d <output-dir>
# Show problematic code
jadx --show-bad-code <apk> -d <output-dir>
# Export as Gradle project
jadx --export-gradle <apk> -d <output-dir>
# GUI mode
jadx-gui <apk>
# Fallback mode
jadx --fallback <apk> -d <output-dir>
安全分析检查清单
使用此检查清单,通过 jadx 分析 APK:
- 启用反混淆进行反编译
- 搜索硬编码的 API 密钥
- 搜索硬编码的凭据
- 查找所有 HTTP/HTTPS URL
- 检查加密实现(算法、密钥生成)
- 检查证书固定的实现
- 查找 SharedPreferences 的使用情况(存储安全)
- 检查 WebView 安全设置
- 查找数据库操作(SQL 注入)
- 检查调试/日志代码
- 查找导出的组件(来自清单文件)
- 检查身份验证/授权逻辑
- 查找文件操作(路径遍历)
- 检查原生库加载
- 记录所有发现
重要说明
- Jadx 生成的是 Java 源代码,只是近似结果(并非原始代码)
- 某些优化/混淆可能会生成无法编译的代码
- 反编译代码可能与原始源代码略有不同
- 务必通过运行时分析交叉验证发现
- Jadx 最适合分析使用标准工具编译的应用
- 深度混淆/受保护的应用可能只能有限反编译
- 某些反篡改机制会检测反编译行为
安全与道德
重要:仅反编译你拥有或获准分析的 APK。
- 尊重知识产权和许可协议
- 对漏洞进行负责任的披露
- 不要分发反编译后的源代码
- 注意服务条款和 EULA
- 仅用于经授权的安全测试和研究
- 某些司法管辖区的法律禁止逆向工程
成功标准
成功的 jadx 分析包括:
- APK 已成功反编译为可读的 Java 代码
- 已应用反混淆(如果应用经过混淆)
- 所有源代码均可搜索且可读
- 已记录与安全相关的发现
- 已提取 API 端点和 URL
- 已理解加密和身份验证逻辑
- 已识别与其他系统的集成点
- 尽可能通过运行时测试验证发现