mcpField
J
jadx

jadx

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

关于 jadx

jadx 技能面向 Android 安全分析人员,指导将 APK 中的 DEX 反编译为可读 Java 代码,并通过命令行或 GUI 检查应用逻辑。

主要功能

  1. 01将 DEX 反编译为 Java
  2. 02尝试对混淆代码去混淆
  3. 03提供命令行与 GUI 操作
  4. 04导出 Gradle 项目

适用场景

  1. 01搜索硬编码凭据和 API 地址
  2. 02检查加密、认证与存储逻辑
  3. 03追踪应用入口和网络通信
  4. 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 工作流:

  1. 使用 jadx-gui 打开 APK
  2. 在左侧面板浏览包结构
  3. 使用搜索(Ctrl+Shift+F)查找关键词
  4. 单击结果以查看上下文中的代码
  5. 使用 Ctrl+单击跟踪交叉引用
  6. 保存有用的发现
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 进行深入分析

对于复杂应用:

  1. 使用 CLI 进行初步反编译
  2. 搜索有用的模式
  3. 在 GUI 中打开以进行详细探索
  4. 使用交叉引用追踪代码流
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 工作流:

  1. APK → API 发现:

    • 使用 jadx 反编译 IoT 应用
    • 提取 API 端点
    • 使用网络工具测试端点
  2. APK → 凭据提取:

    • 查找硬编码凭据
    • 对 IoT 设备进行测试
    • 与 onvifscan、telnetshell 配合使用
  3. APK → 协议分析:

    • 理解设备通信协议
    • 使用 iotnet 捕获流量
    • 使用自定义脚本重放/修改流量
  4. 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
  • 已理解加密和身份验证逻辑
  • 已识别与其他系统的集成点
  • 尽可能通过运行时测试验证发现

评论

支持 Markdown