
Veto v2.3
VirusTotal용 오픈소스 Android 클라이언트. 70개 이상의 안티바이러스 엔진으로 파일, URL, 설치된 앱을 스캔합니다. 해시, 위협 분류, YARA 일치, 샌드박스 동작이 포함된 상세 보고서를 확인합니다. 추적이나 광고가 없습니다.
Veto
Android용 오픈소스 VirusTotal 클라이언트
무료이자 오픈소스입니다. 자신의 VirusTotal API 키를 가져와 70개 이상의 엔진으로 파일, 링크, 설치된 애플리케이션을 검사하세요. Material 3 인터페이스로 제작되었습니다. 계정 없음, 추적 없음, 광고 없음.
Veto란 무엇인가요?
Veto는 VirusTotal용 Android 클라이언트입니다. 파일, 링크 또는 설치된 애플리케이션을 제출하여 실시간 분석 결과를 확인하세요. 이 애플리케이션은 단일 통합 판정부터 서비스가 반환하는 전체 필드 집합까지 명확한 보고서를 표시합니다.
이 프로젝트는 무료이자 오픈소스이며, 사용자 계정, 추적 시스템 또는 광고가 포함되어 있지 않습니다. 사용자가 자신의 VirusTotal API 키를 제공하므로 모든 검사는 중간 제3자 서버를 거치지 않고 개인 계정에서 직접 실행됩니다.
스크린샷
![]() | ![]() | ![]() |
![]() | ![]() |
기능 목록
- 검사 기능: 설치된 앱, 로컬 파일 또는 대상 URL을 검사합니다.
- 다중 엔진 집계: 70개 이상의 안티바이러스 엔진의 진단 결과를 결합합니다.
- 이중 보고 모드: 빠른 검증 요약을 위한 빠른 모드와 심층 검사를 위한 상세 모드.
- 상황별 설명: 모든 섹션에 설명 텍스트가 제공되며, 원하는 경우 설명을 숨기는 설정도 있습니다.
- 고정밀 보고서: 파일 해시, 위협 분류, 기록, 커뮤니티 투표, 샌드박스 동작, YARA 매치, Android 애플리케이션 내부 정보 및 모든 추가 API 페이로드 필드를 표시합니다.
- 백그라운드 실행: 백그라운드 서비스 내에서 유지되는 실시간 업로드 및 분석 진행 상황 추적.
- 오프라인 접근: 보고서를 로컬에 저장하여 인터넷 연결 없이도 나중에 검토할 수 있습니다.
- 속도 제한 경고: 로컬 API 키가 속도 제한에 도달하면 명확한 알림을 표시합니다.
- 테마: 동적 시스템 색상을 지원하는 완전한 Material 3 지원으로, 라이트 및 다크 테마를 모두 지원합니다.
핵심 아키텍처 구현 세부 사항
- 상태 동기화: 애플리케이션 범위의
ScanManager는 모든 검사 상태의 중앙 소스 역할을 합니다. 이를 통해 앱이 포그라운드에서 활성 상태이든, 백그라운드에서 일시 중단되었든, 운영 체제에 의해 소멸되었든 사용자 인터페이스가 동기화된 상태를 유지합니다. - 복원력 있는 폴링: 앱은 6분 벽시계 상한을 사용하여
/analyses/{id}엔드포인트를 폴링합니다. 속도 제한 응답이 발생하면 실패하지 않고 대기합니다. 결과가 채워질 때까지 보고서를 다시 가져오며, 시간 초과 한도에 도달하면 구조화된 실패 상태를 반환합니다. - 프로세스 수명 주기:
ScanState가 Activity 소멸을 견디기 위해ScanManager내에 상주하는 동안,ScanService는 활성 작업 중 프로세스 수명 주기를 유지하고 진행 중 및 완료 알림을 관리합니다. - 전체 충실도 파싱: 공통 필드는 타입화된 모델로 캡처되고, 전체 원시
attributesJSON은 사용자 지정 직렬 변환기를 통해 보존됩니다. 이를 통해 상세 보고서 보기가 API 페이로드에 시간이 지남에 따라 추가된 새 필드를 포함한 모든 반환 필드를 렌더링할 수 있습니다.
기술 스택
| 계층 | 기술 | 프로젝트 내 역할 |
|---|---|---|
| 언어 | Kotlin | 기본 프로그래밍 언어 |
| UI 프레임워크 | Jetpack Compose | 선언적 UI 구조 |
| 디자인 시스템 | Material 3 | 시각적 스타일링, 동적 시스템 색상 및 확장 아이콘 |
| 의존성 주입 | Hilt | 의존성 관리 |
| 네트워킹 | Retrofit & OkHttp | VirusTotal API와의 HTTP 통신 |
| 직렬화 | 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/ # UI 구성 요소 및 프레젠테이션 계층
├── intro/ # 스플래시 화면 및 API 키 구성
├── dashboard/ # 탐색 허브: 링크, 파일 및 앱 검사 모듈
├── results/ # 빠른 및 상세 보고서 시각화 도구
├── components/# 재사용 가능한 UI 요소 및 레이아웃
├── theme/ # 색상, 모양, 타이포그래피 및 모션 구성
└── util/ # 햅틱 피드백, 제스처 및 딥 링크 유틸리티
- 스토어 등록 에셋 및 텍스트 리소스는
fastlane/metadata/android/en-US/에서 확인할 수 있습니다. - 편집 가능한 목업 SVG는
docs/store/svg/에 있습니다. - 목업은
docs/store/export.html을 사용하여 PNG 형식으로 내보낼 수 있습니다.
시작하기
사전 요구 사항
- 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 키를 입력합니다. 키는 Android Keystore의 AES-256-GCM 키로 암호화되어 기기에 로컬로 저장되며, 클라우드 백업 및 기기 간 전송에서 제외됩니다. 무료 API 키는 일반적으로 분당 4회 조회 제한이 적용됩니다.
개인정보 보호정책
이 애플리케이션은 사용자가 제공한 자격 증명을 사용하여 VirusTotal API와만 통신합니다. 업로드된 파일, 제출된 URL 및 동적 결과는 VirusTotal 서버로 직접 전송됩니다. API 키는 Android Keystore의 AES-256-GCM 키로 암호화되어 기기에 로컬로 저장되며 클라우드 백업 및 기기 간 전송에서 제외되므로 기기를 벗어나지 않습니다. HTTP 로깅은 디버그 빌드로 제한되며 키 헤더를 삭제합니다. Veto는 분석 데이터를 수집하지 않으며 광고 SDK를 포함하지 않습니다.
라이선스
이 프로젝트는 GNU General Public License v3.0 조건에 따라 라이선스가 부여됩니다.
GPLv3 주요 조건:
- 상업적 사용: 허용
- 수정: 허용
- 배포: 허용
- 소스 코드 공개: 배포 시 필수
- 동일 라이선스: 수정된 코드도 GPLv3를 사용해야 함
- 책임 및 보증: 작성자가 제공하지 않음
자세한 내용은 이 리포지토리의 LICENSE 파일을 참조하세요.




