androidqf(Android 快速取证)是一款便携式工具,用于简化从 Android 设备中获取相关取证数据的过程。
androidqf 旨在提供一种简单便携的跨平台工具,以便快速从 Android 设备中获取数据。其在功能上与 mvt-android 类似。但与 MVT 不同,androidqf 设计为即使是非技术用户也能轻松运行。通过 androidqf 提取的数据可使用 MVT 进行分析。
本仓库是 androidqf 的一个分支,由 国际特赦组织安全实验室 维护。androidqf 工具最初由 Claudio Guarnieri 开发。

Linux、Windows 和 Mac 的可执行二进制文件应可在 最新发布 中找到。如果你在运行二进制文件时遇到问题,可以自行构建。
本项目使用 GoReleaser 进行自动构建和发布。要在本地构建:
安装 GoReleaser:
go install github.com/goreleaser/goreleaser@latest
运行快照构建(不发布):
./build_locally.sh
这将在 dist/ 目录中为所有平台创建二进制文件,包括一个适用于 Intel 和 Apple Silicon 的 macOS 通用二进制文件。
你仍然可以使用传统的 Makefile 方式。你需要安装 Go 1.23+,以及 make、git、unzip 和 wget。AndroidQF 包含一个跨编译的 collector,它在目标设备上运行,以更可靠地提取取证相关信息。
首先构建 collector 模块:
make collector
然后为你选择的平台编译 AndroidQF:
make linux
make darwin
make windows
这些命令将在 build/ 文件夹中生成二进制文件。
发行包可以通过使用 unbundle 构建标签来选择不嵌入捆绑的 ADB 和 collector 二进制文件:
go build -tags unbundle -o build/
启用此标签后,androidqf 期望:
adb 可以从系统 PATH 中找到。/usr/lib/androidqf/android-collector/ 下,并使用 androidqf 期望的名称,例如 collector_arm 和 collector_arm64。打包者可以在构建前删除 assets/ 中的捆绑二进制资源,但 assets/ 包目录及其 Go 源文件必须保留。unbundle 构建仍然导入 assets 包,如果删除整个 assets/ 目录,构建将失败。
发布容器镜像发布到 GitHub 容器注册表:
docker pull ghcr.io/mvt-project/androidqf:latest
要在 Linux 上从通过 USB 连接的 Android 设备收集数据,请透传 USB 总线并挂载输出目录:
docker run --rm -it --privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v "$(pwd)/output:/output" \
ghcr.io/mvt-project/androidqf:latest -fast -output /output
你也可以在本地为某个发布版本构建镜像:
docker build --build-arg VERSION=1.8.3 -t androidqf .
[!TIP] 有关存档格式、完整性哈希、加密和大文件处理,请参见 采集存档。有关收集文件的字典,请参见第三方 SocialTIC AndroidQF 输出文件字典。
在启动 androidqf 之前,你需要将目标 Android 设备通过 USB 连接到计算机,并且需要启用 USB 调试。请参考 官方文档 了解如何操作,但请注意,不同厂商的 Android 手机可能需要不同的导航步骤。
一旦 USB 调试启用,你就可以启动 androidqf。它将首先尝试通过 USB 桥接连接到设备,这会导致 Android 手机提示你手动授权主机密钥。确保授权它们,最好是永久授权,这样以后就不会再出现提示。
现在 androidqf 应该开始执行,并在当前工作目录或通过 -output 提供的目录中创建一个采集 zip 存档。在执行过程中的某个时刻,androidqf 会提示你做出一些选择:这些提示会暂停采集,直到你做出选择,所以请留意。
以下数据可以被提取:
每次采集还包含 acquisition.json、command.log(当有日志输出时)以及 hashes.csv。哈希列表记录了每个先前明文存档条目的 SHA-256 摘要,并且不包括自身。失败的设备拉取不会作为存档条目提交。详情请参见 采集存档。
运行 androidqf 采集时会呈现以下选项:
是否要备份设备?
...
? 备份:
▸ 仅短信
全部
不备份
这些选项指的是通过后台运行 adb backup 命令从设备收集的数据。如果选择“不备份”,则不会运行 adb backup 命令。
| 选项 | 解释 |
|---|---|
| 仅短信 | 运行 adb backup com.android.providers.telephony。仅收集 com.android.providers.telephony 的数据。这包括短信数据库。 |
是否要下载所有应用的副本,还是仅限非系统应用?
? 下载:
▸ 所有
仅非系统软件包
不下载任何
| 选项 | 解释 |
|---|---|
| 所有 | 将从手机中检索所有已安装的软件包 |
| 仅非系统软件包 | 不下载 adb pm list packages -s 中列出的任何软件包 |
| 不下载任何 | 不下载任何软件包 |
是否要获取设备的入侵日志?
? 入侵日志:
▸ 是
否
| 选项 | 解释 |
|---|---|
| 是 | 将从手机中检索入侵日志。 |
| 否 | 跳过入侵日志采集。 |
将 androidqf 采集数据放在未加密的驱动器上可能会使你自己以及被采集数据的人面临重大风险。例如,你可能在问题边境被拦截,而你的 androidqf 驱动器可能被没收。原始数据不仅可能暴露你的旅行目的,还可能包含非常敏感的数据(例如已安装的应用列表,甚至短信)。
理想情况下,你应该对驱动器进行完全加密,但这并非总是可行。你也可以考虑将 androidqf 放入 VeraCrypt 容器中,并随身携带一份 VeraCrypt 副本以挂载它。然而,VeraCrypt 容器通常仅受密码保护,你可能被迫提供密码。
或者,androidqf 允许使用提供的 age 公钥对每次采集进行加密。最好,此公钥属于一个最终用户不拥有(或至少不携带)私钥的密钥对。这样,即使在胁迫下,最终用户也无法解密采集的数据。
androidqf 将每次采集流式传输到 zip 存档中。如果你在当前工作目录中放置一个名为 key.txt 的文件,androidqf 将使用 age 加密 zip 流并写入 <UUID>.zip.age;否则,它将写入未加密的 <UUID>.zip。androidqf 还会在与可执行文件相同的文件夹中查找 key.txt;如果两个文件都存在,当前工作目录优先。
加密采集不会创建明文采集存档。必须在添加到加密存档之前进行验证的设备文件会使用经过身份验证的 ChaCha20-Poly1305 加密临时暂存。有关完整数据流和大 APK 行为,请参见 采集存档。
获取加密采集文件后,你可以像这样使用 age 解密:
$ age --decrypt -i ~/path/to/privatekey.txt -o <UUID>.zip <UUID>.zip.age
请记住,尽管我们正在努力缓解,但始终有可能通过高级取证技术恢复至少一部分未加密数据。
androidqf 的目的是促进对可能成为复杂移动间谍软件攻击目标的人(尤其是公民社会和边缘化社区成员)的设备进行 同意下的取证分析。我们不希望 androidqf 导致非自愿个人的隐私侵犯。因此,本许可证的目标是禁止将 androidqf(以及任何相同许可的软件)用于 对抗性取证 的目的。
为实现此目标,androidqf 根据 MVT 许可证 1.1 发布,这是 Mozilla 公共许可证 v2.0 的改编版。此修改后的许可证包括新条款 3.0,“同意使用限制”,该条款仅允许在获得其数据正在被提取和/或分析的个人(“数据所有者”)明确同意的情况下,使用许可软件(以及从中衍生的任何“更大作品”)。
| 数据 | 可选? | 输出路径 |
|---|
| 完整备份或仅短信/彩信备份。 | ✅ | backup.ab |
| getprop shell 命令的输出,提供构建信息和配置参数。 | getprop.txt | |
| 所有系统设置 | settings_*.txt | |
| ps shell 命令的输出,提供所有正在运行的进程列表。 | processes.txt | |
| 系统服务列表。 | services.txt | |
| 系统所有日志的副本。 | logs/, logcat.txt | |
| dumpsys shell 命令的输出,提供设备的诊断信息。 | dumpsys.txt | |
| 所有已安装软件包及其相关分发文件的列表。 | packages.json | |
| 所有已安装 APK 或仅非系统应用的副本。 | ✅ | apks/* |
| 入侵日志。包含导航历史等私人数据。 | ✅ | intrusion_logs/* |
| 系统上的文件列表。 | files.json | |
| 临时文件夹中可用文件的副本。 | tmp/* | |
| 一份包含系统和应用特定日志的错误报告,不包含私人数据。 | bugreport.zip |
| 全部 | 运行 adb backup -all。这仅请求那些通过此方法明确允许备份其数据的应用的备份。从 Android 12 开始,此方法几乎无法从大多数应用提取任何数据。 |
| 不备份 | 不运行 adb backup |