
apk-info v1.0.12
Полнофункциональный парсер APK
apk-info
Полнофункциональный парсер apk.
Возможности
- Дружественный к вредоносному ПО извлекатель zip. Отличная статья о технике BadPack;
- Дружественный к вредоносному ПО извлекатель axml и arsc;
- Полная реализация AXML (Android Binary XML);
- Полная реализация ARSC (Android Resource);
- Поддержка извлечения информации, содержащейся в
APK Signature Block 42:- APK Signature scheme v1;
- APK Signature scheme v2;
- APK Signature scheme v3;
- APK Signature scheme v3.1;
- Stamp Block v1 & v2;
- Apk Channel Block;
- Packer NG v2;
- Vasdolly v2
- Google Play Frosting (есть планы, но информации о нём критически мало);
- Корректное извлечение MainActivity на основе того, как ОС Android делает это;
- Привязки для 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]} <apk>")
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
Скрипт:
- Извлечь все доступные подписи из файла;
- Извлечь имя пакета;
- Извлечь минимальную версию SDK;
- Получить список всех Main Activity;
- Получить имя приложения;
Библиотека apk-info:
- Сборка - release-lto;
- Привязки Python (честное сравнение);
Тестовый пример (чистая коллекция):
- 152 apk-файла;
- Общий размер - 20 ГБ;
- Режим журналирования - 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 |
Тестовый пример (коллекция вредоносного ПО):
- 3084 apk-файла;
- Общий размер - 23 ГБ;
- Режим журналирования - warning;
[!IMPORTANT] В этом наборе много вредоносных образцов, которые androguard просто не может распарсить.
| # | 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 |
В среднем прирост скорости составляет около x10.
Главное преимущество в том, что apk-info может парсить гораздо больше вредоносных файлов, чем androguard.
Часто задаваемые вопросы
- Почему бы просто не использовать androguard?
Почти все мои проекты рождаются из того, что чем-то неудобно пользоваться. Androguard сам по себе отличный инструмент, но поддерживать его (на мой взгляд) просто невозможно, и он не подходит для production-ready кода. Он также не подходит для анализа большого количества файлов из-за того, что вся логика написана не самым оптимизированным способом.
- Я хочу изменить apk, как это сделать с помощью этой библиотеки?
Библиотека спроектирована только для режима чтения, потому что мне нужен хороший инструмент, с помощью которого я могу легко и быстро извлекать информацию из apk. Существует множество других хороших инструментов.