
androidqf (Android Quick Forensics)는 Android 기기에서 포렌식 증거를 신속하게 수집하여 잠재적인 침해 흔적을 식별하는 데 도움을 줍니다.
androidqf (Android Quick Forensics)는 Android 기기에서 관련 법의학 데이터를 쉽게 수집할 수 있는 휴대용 도구입니다.
androidqf는 Android 기기에서 데이터를 신속하게 수집할 수 있는 간단하고 휴대 가능한 크로스 플랫폼 유틸리티를 제공하기 위해 설계되었습니다. 기능적으로는 mvt-android와 유사합니다. 그러나 MVT와 달리 androidqf는 기술에 익숙하지 않은 사용자도 쉽게 실행할 수 있도록 설계되었습니다. androidqf로 추출된 데이터는 MVT로 분석할 수 있습니다.
이 저장소는 국제앰네스티 보안 연구소(Amnesty International's Security Lab)에서 관리하는 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에서 사용 가능해야 함.collector_arm, collector_arm64)으로 /usr/lib/androidqf/android-collector/ 아래에 설치되어야 함.패키징 담당자는 빌드 전에 assets/에서 번들 바이너리 자산을 제거할 수 있지만, assets/ 패키지 디렉토리와 해당 Go 소스 파일은 남아 있어야 합니다. unbundle 빌드는 여전히 assets 패키지를 임포트하며, assets/ 디렉토리 전체가 삭제되면 빌드가 실패합니다.
릴리스 컨테이너 이미지는 GitHub Container Registry에 게시됩니다:
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 디버깅을 활성화해야 합니다. USB 디버깅 활성화 방법은 공식 문서를 참조하십시오. 다만, 제조사에 따라 Android 휴대폰의 탐색 단계가 기본값과 다를 수 있음에 유의하십시오.
USB 디버깅이 활성화되면 androidqf를 실행할 수 있습니다. 먼저 USB 브리지를 통해 기기에 연결을 시도하며, Android 휴대폰에서 호스트 키를 수동으로 승인하라는 메시지가 표시됩니다. 키를 승인하고, 가능하면 영구적으로 승인하여 이후에 다시 표시되지 않도록 하십시오.
이제 androidqf가 실행되어 현재 작업 디렉토리 또는 -output으로 지정된 디렉토리에 수집 zip 아카이브를 생성합니다. 실행 중에 androidqf가 몇 가지 선택 사항을 묻는 메시지를 표시합니다. 이 프롬프트는 선택이 제공될 때까지 수집을 일시 중지하므로 주의하십시오.
다음 데이터를 추출할 수 있습니다:
모든 수집에는 acquisition.json, 로그 출력이 생성된 경우 command.log, 그리고 hashes.csv도 포함됩니다. 해시 목록은 각 이전 평문 아카이브 항목의 SHA-256 다이제스트를 기록하며, 자신은 포함하지 않습니다. 실패한 기기 풀은 아카이브 항목으로 커밋되지 않습니다. 자세한 내용은 수집 아카이브를 참조하십시오.
androidqf 수집을 실행할 때 다음 옵션이 표시됩니다:
기기에서 백업을 수행하시겠습니까?
...
? 백업:
▸ SMS만
전체
백업 안 함
이 옵션들은 백그라운드에서 adb backup 명령을 실행하여 기기에서 데이터를 수집하는 것을 의미합니다. 백업 안 함을 선택하면 adb backup 명령이 실행되지 않습니다.
| 옵션 | 설명 |
|---|---|
| SMS만 | adb backup com.android.providers.telephony가 실행됩니다. com.android.providers.telephony의 데이터만 수집됩니다. 여기에는 SMS 데이터베이스가 포함됩니다. |
모든 앱 또는 시스템 앱이 아닌 앱만 다운로드하시겠습니까?
? 다운로드:
▸ 모두
시스템 앱이 아닌 패키지만
다운로드 안 함
| 옵션 | 설명 |
|---|---|
| 모두 | 설치된 모든 패키지가 휴대폰에서 검색됩니다 |
| 시스템 앱이 아닌 패키지만 | adb pm list packages -s에 나열된 패키지는 다운로드하지 않습니다 |
| 다운로드 안 함 | 패키지를 다운로드하지 않습니다 |
기기에서 침입 로그를 가져오시겠습니까?
? 침입 로그:
▸ 예
아니요
| 옵션 | 설명 |
|---|---|
| 예 | 침입 로그가 휴대폰에서 검색됩니다 |
| 아니요 | 침입 로그 수집을 건너뜁니다 |
암호화되지 않은 드라이브에 androidqf 수집 데이터를 휴대하면 자신, 특히 데이터를 수집한 대상자에게 심각한 위험에 노출될 수 있습니다. 예를 들어, 문제가 있는 국경에서 정차당할 수 있으며 androidqf 드라이브가 압수될 수 있습니다. 원시 데이터는 여행 목적을 노출시킬 뿐만 아니라 매우 민감한 데이터(예: 설치된 애플리케이션 목록 또는 SMS 메시지)도 포함할 가능성이 높습니다.
이상적으로는 드라이브 전체를 암호화해야 하지만 항상 가능한 것은 아닙니다. VeraCrypt 컨테이너에 androidqf를 넣고 마운트할 VeraCrypt 복사본을 함께 휴대하는 것도 고려할 수 있습니다. 그러나 VeraCrypt 컨테이너는 일반적으로 비밀번호로만 보호되며, 이를 제공하도록 강요받을 수 있습니다.
또는 androidqf는 제공된 age 공개 키로 각 수집을 암호화할 수 있습니다. 바람직하게는 이 공개 키는 최종 사용자가 개인 키를 소유하지 않거나 최소한 휴대하지 않는 키 쌍에 속해야 합니다. 이렇게 하면 최종 사용자가 강압을 받더라도 수집된 데이터를 해독할 수 없습니다.
androidqf는 각 수집을 zip 아카이브로 스트리밍합니다. 현재 작업 디렉토리에 key.txt 파일을 배치하면 androidqf가 zip 스트림을 age로 암호화하여 <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는 Mozilla Public License v2.0을 수정한 MVT License 1.1로 배포됩니다. 수정된 라이선스에는 "동의 기반 사용 제한"이라는 새로운 조항 3.0이 포함되어 있으며, 라이선스 소프트웨어(및 그로부터 파생된 모든 "더 큰 저작물")를 데이터를 추출 및/또는 분석하는 사람("데이터 소유자")의 명시적 동의가 있는 경우에만 사용을 허용합니다.
| 데이터 | 선택 사항? | 출력 경로 |
|---|
| SMS 및 MMS 메시지의 전체 백업 또는 백업 | ✅ | backup.ab |
| 빌드 정보 및 구성 매개변수를 제공하는 getprop 셸 명령 출력 | getprop.txt | |
| 모든 시스템 설정 | settings_*.txt | |
| 실행 중인 모든 프로세스 목록을 제공하는 ps 셸 명령 출력 | processes.txt | |
| 시스템 서비스 목록 | services.txt | |
| 시스템 로그 전체 복사본 | logs/, logcat.txt | |
| 기기 진단 정보를 제공하는 dumpsys 셸 명령 출력 | dumpsys.txt | |
| 설치된 모든 패키지 및 관련 배포 파일 목록 | packages.json | |
| 설치된 모든 APK 또는 시스템 앱으로 표시되지 않은 APK의 복사본 | ✅ | apks/* |
| 침입 로그. 탐색 기록과 같은 개인 데이터 포함 | ✅ | intrusion_logs/* |
| 시스템 파일 목록 | files.json | |
| 임시 폴더에서 사용 가능한 파일 복사본 | tmp/* | |
| 개인 데이터를 포함하지 않는 시스템 및 앱별 로그가 포함된 버그 리포트 | bugreport.zip |
| 전체 | adb backup -all이 실행됩니다. 이 방법을 통해 명시적으로 데이터 백업을 허용한 앱의 백업만 요청합니다. Android 12+부터 이 방법은 거의 모든 앱에 대해 어떤 데이터도 추출하지 않습니다. |
| 백업 안 함 | adb backup이 실행되지 않습니다. |