abrignoni/batch-leapp
GitHub: abrignoni/batch-leapp
一款用于批量运行 LEAPP 系列数字取证工具的自动化脚本,能够递归处理提取文件并生成带哈希清单的主题化报告索引。
Stars: 3 | Forks: 1
# batch_leapp.py
[](https://github.com/abrignoni/batch-leapp/releases/latest)
[](https://github.com/abrignoni/batch-leapp/releases)

递归查找目录中的每个 `.zip` 文件,并对每个文件运行 **LEAPP** 工具 —— [iLEAPP](https://github.com/abrignoni/iLEAPP)、[ALEAPP](https://github.com/abrignoni/ALEAPP)、[RLEAPP](https://github.com/abrignoni/RLEAPP) 或 [VLEAPP](https://github.com/abrignoni/VLEAPP) —— 生成一个装满随时可审查报告目录的文件夹,以及一个链接所有报告的主 `index.html` 文件。
将它指向一个提取文件目录,然后离开,回来时就能得到一组随时可审查的 LEAPP 报告。
leapp.py -t zip -i -o ` —— 因此同一个脚本可以驱动它们中的任何一个。该工具会根据您传递给 `--leapp` 的脚本文件名自动检测,并用于标签、每个任务的日志文件名以及索引标题。
## 环境要求
- Python 3.8+(仅限标准库 —— 无需 `pip install` 任何内容)。
- 一个可用的 LEAPP 工具。您可以将 `--leapp` 指向**以下任一项**:
- 一个脚本 —— `ileapp.py`、`aleapp.py`、`rleapp.py`、`vleapp.py`,或者
- 一个来自 LEAPP 发行版的**已编译 CLI 二进制文件** / macOS **`.app`**(`ileapp`、`iLEAPP.exe`、`iLEAPP.app` 等)。
- (请使用命令行版本,而不是交互式 GUI 版本 —— GUI 不接受批处理参数。如果名称看起来像 GUI,batch-leapp 会发出警告。)
- 如果 `.py` 工具位于其专属的虚拟环境中,请将 `--python` 指向该环境的解释器(对于二进制文件会被忽略)。
- 可选的 GUI 使用 **Tkinter**(大多数 Python 安装都自带;在某些 Linux 发行版上需要:`sudo apt install python3-tk`)。
## 用法
### GUI
```
python batch_leapp_gui.py
```
选择输入目录、输出目录和 LEAPP 工具,设置并行任务数,然后点击 **Run** —— 窗口中会实时显示流式日志,并配有 **Stop**、**Open report index** 和 **Open output folder** 按钮。它会尝试自动检测已安装的 LEAPP 工具以预填该字段。
**记住您的路径。**每个字段都有一个 **Recent ▾** 按钮,列出您以前使用过的输入目录、输出目录和 LEAPP 工具,并且 GUI 会在启动时将这三个字段预填为您上次使用的值。历史记录按用户保存(macOS `~/Library/Application Support/BatchLEAPP/`,Windows `%APPDATA%\BatchLEAPP\`,Linux `~/.config/BatchLEAPP/`);每个菜单都有一个 **Clear recent** 选项。
想要无需终端的双击应用程序?请参阅下面的**[构建独立二进制文件](#building-standalone-binaries)**。
### 命令行
```
python batch_leapp.py INPUT_DIR OUTPUT_DIR --leapp /path/to/leapp.py
```
- `INPUT_DIR` —— 递归搜索 `.zip` 文件的目录。
- `OUTPUT_DIR` —— 写入每个 zip 的报告文件夹和主 `index.html` 的位置(如果不存在则创建)。
### 示例
iLEAPP:
```
python batch_leapp.py /Volumes/Cases/ios /Volumes/Cases/ios_reports \
--leapp ~/tools/iLEAPP/ileapp.py
```
ALEAPP:
```
python batch_leapp.py /Volumes/Cases/android /Volumes/Cases/android_reports \
--leapp ~/tools/ALEAPP/aleapp.py
```
已编译二进制文件 / macOS `.app`(工具本身不需要 Python):
```
python batch_leapp.py /Volumes/Cases/ios /Volumes/Cases/ios_reports \
--leapp /Applications/iLEAPP.app
```
打开结果:
```
open /Volumes/Cases/ios_reports/index.html
```
## 选项
| 选项 | 默认值 | 描述 |
|---|---|---|
| `--leapp PATH` | `ileapp.py` | LEAPP **脚本**(`ileapp.py` …)**或已编译二进制文件 / macOS `.app`** 的路径。`--ileapp` 可作为别名接受。 |
| `--python PATH` | 当前解释器 | 用于运行 `.py` 工具的 Python(如果工具有自己的 venv,请指向该 venv)。对于二进制文件会被忽略。 |
| `-t`, `--type TYPE` | `auto` | `auto` 根据扩展名为每个文件选择 `-t` 值(`zip`/`tar`/`gz`)。任何其他值都会强制每个存档使用该类型。 |
| `-j`, `--jobs N` | `1` | 并行执行的 LEAPP 运行数量。 |
| `--heartbeat SECONDS` | `30` | 在并行模式下,每 N 秒打印一次“仍在运行”的行,这样长时间运行的任务就不会看起来像卡住了(`0` 禁用)。 |
| `--timeout SECONDS` | 无 | 每个 zip 的超时时间;超过该时间的运行将被标记为失败,批处理将继续执行。 |
| `--no-hash` | 关闭 | 跳过计算每个输入存档的 SHA-256(默认开启散列)。 |
| `--skip-existing` | 关闭 | 跳过输出文件夹已存在且非空的 zip(用于恢复部分运行的批处理)。 |
| `--dry-run` | 关闭 | 打印确切的命令而不运行工具。 |
| `-- ` | — | 字面量 `--` 之后的所有内容都将原封不动地附加到每次 LEAPP 运行中(例如 `-- -p fast` 用于指定 iLEAPP 配置文件)。 |
## 构建独立二进制文件
您可以使用 [PyInstaller](https://pyinstaller.org/) 将 batch-leapp 打包成不需要安装 Python 的原生二进制文件 —— 一个可双击的 **GUI 应用程序**和一个单文件的 **CLI 二进制文件**。内含构建脚本和图标。
每台机器上的一次性设置:
```
python3 -m pip install pyinstaller
```
### macOS
```
./build_macos.sh # both: dist/Batch LEAPP.app + dist/batch-leapp
./build_macos.sh gui # just the .app
./build_macos.sh cli # just the CLI binary
```
将 `Batch LEAPP.app` 拖到 `/Applications` 中。要分享它,请使用 `ditto` 进行 zip 压缩(保留 bundle 结构):
```
ditto -c -k --sequesterRsrc --keepParent "dist/Batch LEAPP.app" Batch-LEAPP-macos.zip
```
### Windows
```
build_windows.bat :: both: dist\Batch LEAPP.exe + dist\batch-leapp.exe
build_windows.bat gui :: just the GUI .exe
build_windows.bat cli :: just the CLI .exe
```
### 签名与首次运行警告
二进制文件是**未签名**的(公证/签名需要付费的 Apple Developer ID 或 Windows 代码签名证书)。它们在构建它们的机器上运行良好;但在分享给他人时:
- **macOS** —— Gatekeeper 会提示“Apple 无法检查其是否包含恶意软件”。右键点击 → **打开** 一次,或者运行 `xattr -dr com.apple.quarantine "Batch LEAPP.app"`。
- **Windows** —— SmartScreen 显示“Windows 已保护你的电脑”。点击 **更多信息 → 仍要运行**。
如果您有签名证书,请将 `codesign`/`signtool` 步骤添加到构建脚本中,我可以将其接入。
### 自动化构建 (GitHub Actions)
[`.github/workflows/build.yml`](.github/workflows/build.yml) 在云端构建所有内容 —— **macOS (Apple Silicon)** 和 **Windows**,包含 GUI 和 CLI —— 因此您不需要 Windows 机器。有两种运行方式:
- **按需运行:** GitHub → **Actions** 标签页 → **Build binaries** → **Run workflow**。二进制文件将在运行页面上显示为可下载的**构件**。
- **在发布版本时:** 推送一个版本标签,二进制文件将自动附加到 GitHub 的 **Release** 中:
git tag v1.0.0 && git push origin v1.0.0
生成的构件:`Batch-LEAPP-macos-arm64.zip`(包含 `.app`)、`batch-leapp-macos-arm64.tar.gz`(CLI)和 `Batch-LEAPP-windows-x64.zip`(GUI + CLI `.exe`)。它们仍然是未签名的 —— 适用相同的首次运行步骤。Apple Silicon 涵盖了自 2020 年以来的所有 Mac;Intel macOS 构建已被弃用。
## 推荐的首次运行
在处理大量案件之前,请务必先检查 zip 列表和命令是否合理:
```
python batch_leapp.py INPUT_DIR OUTPUT_DIR --leapp /path/to/leapp.py --dry-run
```
## 并行运行
```
python batch_leapp.py INPUT_DIR OUTPUT_DIR --leapp /path/to/leapp.py -j 4
```
- 输出目录在任何运行开始**之前**就已分配,因此名称绝不会发生冲突。
- 在并行模式下,每次运行的输出都会被捕获到该提取文件文件夹内的 `_run.log`(例如 `aleapp_run.log`)中,这样并发运行就不会使终端显示混乱;屏幕上只会随着任务完成显示每个 zip 的 `OK` / `FAILED` / `TIMEOUT`。
- 使用 `-j 1`(默认值)时,工具的输出将像往常一样实时显示。
### 为什么并行运行需要隔离
LEAPP 工具会保留一个**共享的**历史记录/设置文件(例如 macOS 上的 `~/Library/Application Support/LEAPP/history.json`),并使用固定的临时文件名通过读取-修改-写入的方式更新它。两个同时运行的工具会在这个文件上发生竞争 —— 一个成功重命名,另一个则因 `history.tmp -> history.json: No such file` 而终止,随后的读取还会看到只写了一半的文件(`JSONDecodeError: Extra data`)。
为了避免这种情况,**并行运行(`-j > 1`)会在 `

标签:Python, 批处理工具, 数字取证, 数字取证, 无后门, 漏洞挖掘, 自动化脚本, 自动化脚本, 跨平台GUI, 逆向工具