luca-regne/batuta

GitHub: luca-regne/batuta

整合多种逆向工具的 Android 应用静态分析命令行工具,提供从 APK 提取、反编译到修改重打包的一站式工作流。

Stars: 0 | Forks: 0

# batuta `batuta` 是一个用于 Android 应用程序静态分析的 Python CLI —— 专为渗透测试人员、漏洞赏金猎人和恶意软件分析师设计。它在干净、可组合的界面背后封装了经过实战检验的 RE 工具(`apktool`、`jadx`、`adb`、`APKEditor`)。 ## 功能特性 - **APK 提取** —— 通过包名、应用名或过滤模式提取 APK - **Split APK 支持** —— 自动检测拆分包,提取每个部分,并通过 `batuta apk merge` 或 `--auto-merge` 合并它们 - **反编译** —— 通过 `batuta apk decompile` 或 `batuta apk pull --decompile` 运行 `jadx` 和/或 `apktool` - **APK 修补** —— 通过 `batuta apk patch` 重新构建、对齐、签名并选择性安装 - **框架检测** —— 通过 `batuta analyze framework` 检测跨平台框架(Flutter, React Native, Xamarin, Cordova, Unity) - **交互式选择** —— 搜索时在出现多个匹配项时进行选择(自动提示) - **脚本优先设计** —— 每个命令都支持 `--json` 输出,以便通过管道传输到 `jq`、`grep` 或自定义工具 - **库优先架构** —— 核心逻辑可独立于 CLI 导入使用 ## 环境要求 ### Python - Python >= 3.14 ### 外部工具 这些工具必须安装并在您的 `PATH` 中可用: | 工具 | 用途 | 安装 | | ----------- | ------------------------------------------- | ----------------------------------------------------------------------------------------- | | `adb` | Android Debug Bridge — 设备通信 | [Android SDK Platform Tools](https://developer.android.com/tools/releases/platform-tools) | | `apktool` | APK 解码, smali 反汇编 | [Apktool Webiste](https://apktool.org/) | | `jadx` | Java/Kotlin 反编译 | [Jadx GitHub Repository](https://github.com/skylot/jadx) | | `APKEditor` | Split APK 合并 | [APKEditor Repository](https://github.com/REAndroid/APKEditor) | `batuta` 会在命令入口检查所需工具,并在缺失时报告清晰的安装说明。 ### 配置 APKEditor `APKEditor` 以 JAR 文件形式发布。Batuta 按以下顺序解析它: 1. `APKEDITOR_JAR` 环境变量(指向 `.jar` 或其父目录) 2. `~/.batuta/config.json` → `apkeditor_path` 3. 位于 `PATH` 中某处名为 `APKEditor` 的可执行封装器 示例: ``` # 1. 环境变量(仅当前 shell 临时生效) export APKEDITOR_JAR="$HOME/tools/APKEditor/APKEditor.jar" # 2. 配置文件(~/.batuta/config.json) { "apkeditor_path": "~/tools/APKEditor/APKEditor.jar" } # 3. 放置在 PATH 中的 Wrapper 脚本(例如,/usr/local/bin/APKEditor) #!/bin/bash exec java -jar "$HOME/tools/APKEditor/APKEditor.jar" "$@" ``` 您可以将 `apkeditor_path` 指向 JAR 文件本身或包含 `APKEditor.jar` 的目录。无论您使用哪种解析方法,Batuta 都会在合并后保留提取的拆分目录原封不动。 ## 安装 使用 uv 从源码安装: ``` git clone https://github.com/luca-regne/batuta cd batuta uv sync ``` 或使用 pip: ``` pip install -e . ``` ## 快速入门 ``` # 列出已连接的设备 batuta device list # 按名称搜索包 batuta apk search google # 获取包的详细信息 batuta apk info com.example.app # 拉取 APK(支持部分名称和过滤器) batuta apk pull youtube # 在存在多个匹配项时进行交互式选择拉取(自动提示) # 拉取到指定目录 batuta apk pull com.example.app --output ./apks/ # 拉取并立即反编译 batuta apk pull com.example.app --decompile # 从本地 APK 进行独立反编译 batuta apk decompile ./apks/com.example.app.apk --java-only # 合并 split APK 目录(保留原始文件) batuta apk merge ./apks/com.example.app --output ./apks/com.example.app.merged.apk # 检测跨平台框架 batuta analyze framework ./apks/com.example.app.apk # 带 JSON 输出的框架检测 batuta analyze framework ./apks/com.example.app.apk --json ``` ## 命令参考 ``` batuta ├── analyze │ └── framework Detect cross-platform frameworks in APK │ ├── device │ ├── list List connected ADB devices │ └── shell [COMMAND...] Open ADB shell (or run command) │ └── apk ├── list List installed packages ├── search Search packages by name or filter ├── info Show detailed package information ├── pull Pull APK from connected device (optional decompile) ├── merge Merge split APK folder into a single APK (keeps folder) ├── patch Build/align/sign APK from apktool output └── decompile Decompile APK to Java and/or smali ``` ### 通用选项 | 选项 | 描述 | | ---------------- | -------------------------------------------------- | | `--device`, `-d` | 通过 ID 指定目标设备 | | `--json`, `-j` | 输出为 JSON 用于脚本 | | `--system`, `-s` | 在搜索中包含系统包 | | `--decompile` | (pull) 提取后反编译 (Java + smali) | | `--auto-merge` | (pull) 通过 APKEditor 合并 split APK 文件夹 | | `--java-only` | (pull/decompile) 仅限于 Java (`jadx`) 输出 | | `--smali-only` | (pull/decompile) 仅限于 smali/资源 (`apktool`) Split APK 提取操作总是会保存 base/split 部分的原始目录。使用 `--auto-merge` 立即合并(文件夹保持原样),或稍后运行 `batuta apk merge `。当提供 `--decompile` 时,拆分包会自动合并,以便 jadx/apktool 无需额外步骤即可运行。 ### 示例 ``` # 用于脚本编写的 JSON 输出 batuta device list --json | jq '.[0].id' batuta apk search facebook --json | jq '.[].package_name' # 指定目标设备 batuta apk pull com.example.app --device RX8WC00D7JE # 包含系统包 batuta apk list --system --filter android ``` ## 库用法 核心逻辑可独立于 CLI 导入使用: ``` from batuta.core.adb import ADBWrapper # 列出设备 adb = ADBWrapper() devices = adb.list_devices() for device in devices: print(f"{device.id}: {device.model} ({device.state})") # 搜索包 packages = adb.search_packages("google") for pkg in packages: print(f"{pkg.package_name} v{pkg.version_name}") # 拉取 APK result = adb.pull_apk("com.example.app", output_dir=Path("./apks")) print(f"Pulled to: {result.local_path}") ``` ## 架构 ``` src/batuta/ ├── cli/ # Typer commands — argument parsing and rich output only ├── core/ # Business logic — importable as a library ├── models/ # Pydantic v2 data models ├── utils/ # Shared utilities: deps checker, output helpers, process wrapper └── exceptions.py # Typed exception hierarchy ``` 关键架构约束: - `cli/` 永远不包含业务逻辑 —— 仅调用 `core/` - 所有子进程调用都通过 `utils/process.py` - 所有外部工具需求都在命令入口通过 `utils/deps.py` 检查 ## 开发 ``` # 安装 dev dependencies uv sync --group dev # Lint ruff check src/batuta/ # 自动修复 lint 问题 ruff check src/batuta/ --fix # 类型检查 mypy src/batuta/ # 运行 CLI uv run batuta --help ``` ## 许可证 MIT
标签:ADB, Amass, Android安全, Apktool, APK修补, APK反编译, DAST, Flutter, Jadx, Python, React Native, Unity, 云安全监控, 云资产清单, 恶意软件分析, 无后门, 框架识别, 目录枚举, 移动安全, 签名绕过, 自动化分析, 跨站脚本, 逆向工具, 逆向工程, 静态分析