
Veto v2.3
Клиент с открытым исходным кодом для VirusTotal на Android. Сканируйте файлы, URL-адреса и установленные приложения с помощью более 70 антивирусных движков. Просматривайте подробные отчёты с хешами, классификациями угроз, совпадениями YARA и поведением в песочнице. Без отслеживания и рекламы.
Veto
Открытый VirusTotal-клиент для Android
Бесплатно и с открытым исходным кодом. Используйте собственный ключ VirusTotal API для проверки файлов, ссылок и установленных приложений более чем по 70 движкам — всё это с интерфейсом Material 3. Без аккаунтов, без отслеживания, без рекламы.
Что такое Veto?
Veto — это Android-клиент для VirusTotal. Отправьте файл, ссылку или установленное приложение, чтобы просмотреть результаты анализа в реальном времени. Приложение отображает понятный отчёт — от единого сводного вердикта до полного набора полей, возвращаемых сервисом.
Проект бесплатен и имеет открытый исходный код, не содержит пользовательских аккаунтов, систем отслеживания или рекламы. Поскольку пользователи предоставляют собственный ключ VirusTotal API, все проверки выполняются напрямую под их личным аккаунтом, без промежуточных сторонних серверов.
Скриншоты
![]() | ![]() | ![]() |
![]() | ![]() |
Возможности
- Возможность проверки: Проверка установленных приложений, локальных файлов или целевых URL-адресов.
- Агрегация нескольких движков: Объединяет результаты диагностики более чем 70 антивирусных движков.
- Два режима отчётов: Быстрый режим для кратких сводок проверки и подробный режим для глубокого анализа.
- Контекстные пояснения: Пояснительный текст доступен для каждого раздела, с настройкой для скрытия пояснений при желании.
- Отчёты высокой точности: Отображает хеши файлов, классификацию угроз, историю, голоса сообщества, поведение в песочнице, совпадения YARA, внутренности Android-приложений и все дополнительные поля полезной нагрузки API.
- Фоновое выполнение: Отслеживание хода загрузки и анализа в реальном времени, сохраняющееся внутри фонового сервиса.
- Офлайн-доступ: Сохраняет отчёты локально, что позволяет просматривать их позже, даже без подключения к интернету.
- Предупреждения о лимите запросов: Отображает понятные уведомления при достижении лимита запросов локального ключа API.
- Темы: Полная поддержка Material 3 с динамическими системными цветами, поддержка светлой и тёмной тем.
Детали реализации основной архитектуры
- Синхронизация состояния:
ScanManagerв области видимости приложения служит централизованным источником истины для всех состояний проверки. Это гарантирует, что пользовательский интерфейс остаётся синхронизированным, независимо от того, активно ли приложение на переднем плане, приостановлено в фоне или уничтожено операционной системой. - Устойчивый опрос: Приложение опрашивает конечную точку
/analyses/{id}с шестиминутным пределом по настенным часам. При получении ответа о превышении лимита запросов процесс ожидает, а не завершается с ошибкой. Отчёт повторно запрашивается до тех пор, пока результаты не будут заполнены, возвращая структурированное состояние ошибки при достижении лимита времени ожидания. - Жизненный цикл процесса: Пока
ScanStateнаходится внутриScanManager, чтобы пережить уничтожение Activity,ScanServiceподдерживает жизненный цикл процесса во время активных операций и управляет текущими и завершающими уведомлениями. - Полный разбор с сохранением точности: Общие поля захватываются с помощью типизированных моделей, а полный необработанный JSON
attributesсохраняется через пользовательский сериализатор. Это позволяет подробному представлению отчёта отображать все возвращаемые поля, включая любые новые поля, добавляемые в полезную нагрузку API с течением времени.
Технологический стек
| Слой | Технология | Роль в проекте |
|---|---|---|
| Язык | Kotlin | Основной язык программирования |
| UI-фреймворк | Jetpack Compose | Декларативная структура пользовательского интерфейса |
| Дизайн-система | Material 3 | Визуальный стиль, динамическая системная окраска и расширенные иконки |
| Внедрение зависимостей | Hilt | Управление зависимостями |
| Сеть | Retrofit & OkHttp | HTTP-взаимодействие с VirusTotal API |
| Сериализация | kotlinx.serialization | Типобезопасный разбор JSON и сохранение пользовательских атрибутов |
| Асинхронность | Kotlin Coroutines | Асинхронное программирование и фоновая обработка |
| Хранение данных | Jetpack DataStore | Хранение динамических настроек и сохранённых отчётов о проверках |
| Совместимость | SDK 30–36 | Сборка с JDK 17, minSdk 30, targetSdk 36 |
Структура проекта
└── app/src/main/java/com/quantum_prof/vtscansuite/
├── data/ # Модели, удалённый API и реализация репозитория
├── domain/ # Интерфейс репозитория и бизнес-сценарии использования
├── di/ # Модули внедрения зависимостей Hilt
├── scan/ # ScanManager, ScanService и системные уведомления
└── ui/ # Компоненты пользовательского интерфейса и слои представления
├── intro/ # Экран приветствия и настройка ключа API
├── dashboard/ # Навигационный центр: модули проверки ссылок, файлов и приложений
├── results/ # Визуализаторы быстрых и подробных отчётов
├── components/# Переиспользуемые элементы и макеты пользовательского интерфейса
├── theme/ # Конфигурации цветов, фигур, типографики и анимации
└── util/ # Утилиты тактильной обратной связи, жестов и глубоких ссылок
- Ресурсы и тексты для страницы в магазине доступны в
fastlane/metadata/android/en-US/. - Редактируемые SVG-макеты находятся в
docs/store/svg/. - Макеты можно экспортировать в формат PNG с помощью
docs/store/export.html.
Начало работы
Предварительные требования
- Android Studio (последняя стабильная версия)
- JDK 17
- Бесплатный ключ VirusTotal API, который можно получить по адресу: https://www.virustotal.com/gui/my-apikey
Сборка и запуск
Клонируйте репозиторий и соберите отладочную версию с помощью командной строки:
git clone https://github.com/ProfessorQuantumUniverse/VTScan.git
cd VTScan
./gradlew :app:assembleDebug
Либо откройте корневой каталог в Android Studio и выберите конфигурацию Run.
При первом запуске введите свой ключ VirusTotal API на экране настройки приветствия. Ключ хранится локально на вашем устройстве, зашифрованный ключом AES-256-GCM из Android Keystore, и исключён из облачного резервного копирования и переноса между устройствами. Бесплатные ключи API обычно ограничены четырьмя запросами в минуту.
Политика конфиденциальности
Приложение взаимодействует исключительно с VirusTotal API, используя предоставленные вами учётные данные. Загруженные файлы, отправленные URL-адреса и динамические результаты отправляются напрямую на серверы VirusTotal. Ключ API хранится локально на вашем устройстве, зашифрованный ключом AES-256-GCM из Android Keystore, и исключён из облачного резервного копирования и переноса между устройствами, поэтому он никогда не покидает устройство. Журналирование HTTP ограничено отладочными сборками и скрывает заголовок ключа. Veto не собирает данные аналитики и не содержит рекламных SDK.
Лицензия
Этот проект распространяется на условиях GNU General Public License v3.0.
Ключевые условия GPLv3:
- Коммерческое использование: Разрешено
- Модификация: Разрешена
- Распространение: Разрешено
- Раскрытие исходного кода: Требуется при распространении
- Та же лицензия: Модифицированный код также должен использовать GPLv3
- Ответственность и гарантия: Авторами не предоставляются
Для получения дополнительных сведений см. файл LICENSE в этом репозитории.




