delvinru/apk-info

GitHub: delvinru/apk-info

一个用 Rust 编写的高性能 APK 解析器,专为恶意软件分析和大规模批量处理场景设计,同时提供 Python 绑定和命令行工具。

Stars: 79 | Forks: 8

# apk-info [![Crates.io Version](https://img.shields.io/crates/v/apk-info?style=flat)](https://crates.io/crates/apk-info) [![docs.rs](https://img.shields.io/docsrs/apk-info?style=flat)](https://docs.rs/apk-info/latest/apk_info/) [![PyPI - Version](https://img.shields.io/pypi/v/apk-info?style=flat)](https://pypi.org/project/apk-info/) 一个功能完整的 `apk` 解析器。 ## 功能特性 - 对恶意软件友好的 zip 提取器。关于 `BadPack` 技术的精彩[文章](https://unit42.paloaltonetworks.com/apk-badpack-malware-tampered-headers/); - 对恶意软件友好的 axml 和 arsc 提取器; - 完整的 AXML (Android Binary XML) 实现; - 完整的 ARSC (Android Resource) 实现; - 支持提取包含在 `APK Signature Block 42` 中的信息: - [APK Signature scheme v1](https://source.android.com/docs/security/features/apksigning); - [APK Signature scheme v2](https://source.android.com/docs/security/features/apksigning/v2); - [APK Signature scheme v3](https://source.android.com/docs/security/features/apksigning/v3); - [APK Signature scheme v3.1](https://source.android.com/docs/security/features/apksigning/v3-1); - Stamp Block v1 & v2; - Apk Channel Block; - [Packer NG v2](https://github.com/mcxiaoke/packer-ng-plugin/blob/ffbe05a2d27406f3aea574d083cded27f0742160/common/src/main/java/com/mcxiaoke/packer/common/PackerCommon.java#L20); - [Vasdolly v2](https://main.qcloudimg.com/raw/document/intl/product/pdf/tencent-cloud_1145_54493_en.pdf) - Google Play Frosting(已有计划,但相关信息极少); - 基于Android OS的[处理方式](https://xrefandroid.com/android-16.0.0_r2/xref/frameworks/base/core/java/android/app/ApplicationPackageManager.java#310)正确提取MainActivity; - 支持Python 3.10+ 的绑定及类型标注 - 不再需要 `# type: ignore`; - 当然,也是一个快速的解析器 - 🙃 ## 快速入门 ### cli #### 安装 ``` cargo install apk-info-cli ``` #### 帮助 ``` A command-line tool to inspect and extract APK files Usage: apk-info [COMMAND] Commands: show Show basic information about apk file extract Unpack apk files as zip archive [aliases: x] axml Read and pretty-print binary AndroidManifest.xml completion Generate shell completion help Print this message or the help of the given subcommand(s) Options: -h, --help Print help -V, --version Print version ``` ### Python #### 安装 ``` uv pip install apk-info ``` #### 获取 APK 的基本信息 ``` from apk_info import APK apk = APK("./path-to-file.apk") package_name = apk.get_package_name() main_activities = apk.get_main_activities() min_sdk = apk.get_min_sdk_version() print(f"Package Name: {package_name}") print(f"Minimal SDK: {min_sdk}") if not main_activities: print("apk is not launchable!") exit() print(f"Main Activity: {package_name}/{main_activities[0]}") ``` #### 获取签名信息 ``` import sys from apk_info import APK, Signature if len(sys.argv) < 2: print(f"usage: {sys.argv[0]} ") sys.exit(1) file = sys.argv[1] apk = APK(file) signatures = apk.get_signatures() for signature in signatures: match signature: case Signature.V1() | Signature.V2() | Signature.V3() | Signature.V31(): for cert in signature.certificates: print(f"{cert.subject=} {cert.issuer=} {cert.valid_from=} {cert.valid_until=}") case Signature.ApkChannelBlock(): print(f"got apk channel block: {signature.value}") case _: print(f"oh, cool, library added some new feature - {signature}") ``` ## 性能分析 环境: - OS: macOS Tahoe 26.0.1 arm64 - CPU: Apple M3 Pro (12) @ 4.06 GHz [脚本](examples/bench.py): 1. 从文件中提取所有可用的签名; 2. 提取包名; 3. 提取最低SDK版本; 4. 获取所有 Main Activities 列表; 5. 获取应用名称; apk-info library: - Build - `release-lto`; - Python bindings (真实对比); 测试用例 (clean collection): - 152 apk 文件; - 总大小 - 20GB; - 日志级别 - warning; | # | **apk-info** | **androguard** | | --- | ------------------------------------------- | ---------------------------------------------- | | 1 | 0.98s user 4.32s system 80% cpu 6.584 total | 57.39s user 4.88s system 97% cpu 1:03.85 total | | 2 | 0.96s user 4.23s system 79% cpu 6.486 total | 57.98s user 5.04s system 97% cpu 1:04.80 total | | 3 | 0.95s user 4.15s system 79% cpu 6.422 total | 55.56s user 4.48s system 97% cpu 1:01.55 total | 测试用例 (malware collection): - 3084 apk 文件; - 总大小 - 23GB; - 日志级别 - warning; | # | **apk-info** | **androguard** | | --- | ------------------------------------------- | ----------------------------------------------- | | 1 | 2.49s user 4.74s system 73% cpu 9.840 total | 141.29s user 6.86s system 98% cpu 2:31.09 total | | 2 | 2.50s user 4.77s system 75% cpu 9.641 total | 138.04s user 6.32s system 97% cpu 2:27.33 total | | 3 | 2.49s user 4.78s system 75% cpu 9.650 total | 139.33s user 6.65s system 98% cpu 2:28.87 total | 平均而言,速度提升约为 10 倍。 主要优势在于 `apk-info` 比 `androguard` 能解析更多的恶意文件。 ## 常见问题 - 为什么不直接使用 androguard? 我几乎所有的项目都源于那些使用不便的工具。 Androguard 本身是一个很棒的工具,但(在我看来)维护它几乎是不可能的,而且它不适合用于生产环境的代码。由于所有逻辑的编写方式未经高度优化,它也不适合用于分析大量文件。 - 我想修改 apk,如何使用这个库来实现? 该库仅为只读模式设计,因为我需要一个可以轻松快速地从 apk 中提取信息的好工具。还有许多其他优秀的工具可用。 ## 致谢 - [androguard](https://github.com/androguard/androguard) - [apkInspector](https://github.com/erev0s/apkInspector)
标签:Android安全, APK解析, ARSC解析, AXML解析, BadPack检测, Crates.io, DAST, PyPI, Python绑定, Rust, 云安全监控, 云资产清单, 可视化界面, 恶意软件分析, 文件解析器, 文档结构分析, 目录枚举, 移动安全, 签名验证, 网络流量审计, 软件供应链, 逆向工具, 逆向工程, 通知系统, 静态分析