VioletToy 상세 분석 보고서

VioletToy 심층 분석 보고서 (Quantum Nano Level)

버전: v1.0

분석 일자: 2026-05-23

분석자: 아크링크 보안연구팀

대상 APK: 260409_VioletToy.apk (15.28 MB)

위협 등급: 🔴 Extreme (개인정보 탈취 + 클리어텍스트 통신 + 패킹 보호)

1. 메타데이터

항목 · 값

Application label · `Violet Toy` (한국어 표기: 바이올렛토이)

Package name · `upxqr.svavc.xojgaijs.scubyvpgr` (난수형 위장)

Internal Java package · `com.jiazai.mx.durian`

Version · 2.2.9 (versionCode 18)

Compile SDK · 34 (Android 14)

Min SDK · 22 (Android 5.1)

Target SDK · 34

MainActivity · `com.jiazai.mx.durian.ui.home.MainActivity`

Application class · `com.frezrik.jiagu.StubApp` (Jiagu stub)

MD5 · `400BBE96AA81CBBFF343C6C3CDB8905A`

SHA256 · `AA018F81E9013CF62E8B7DCA2DDB81435ADD8EAFAF64A765F8C85A3A1604E4D2`

명명 단서

· jiazai = 载/載 (load) — 적재

· durian = 두리안 (과일 코드네임)

· mx = 패밀리 약자 (의미 불명, 추정: mobile-x)

· 외부 패키지명 upxqr.svavc.xojgaijs.scubyvpgr = 7글자 무작위 영문 조합 — Google Play 회피용

2. 권한 분석

선언된 권한 (위험순)

권한 · 위험도 · 용도 추정

`READ_CONTACTS` · 🔴 Critical · 연락처 전체 탈취 ([피해자 정보 비공개] 명단 확보)

`READ_EXTERNAL_STORAGE` · 🔴 Critical · 갤러리/문서 접근

`READ_MEDIA_IMAGES` · 🔴 Critical · Android 13+ 사진 접근

`CAMERA` · 🟠 High · 카메라 호출 (촬영)

`QUERY_ALL_PACKAGES` · 🟠 High · 설치된 모든 앱 목록 조회

`WRITE_EXTERNAL_STORAGE` · 🟡 Med · 외부 저장소 쓰기

`INTERNET` · 🟡 Med · 인터넷 통신

`ACCESS_NETWORK_STATE` · 🟢 Low · 네트워크 상태 확인

`POST_NOTIFICATIONS` · 🟢 Low · 알림 표시

권한 요청 흐름 (동적 캡처)

1. 앱 실행 → Welcome 화면 (핑크 테마) + "회원 가입" 버튼 노출

2. 권한 1/2: "Violet Toy에서 내 연락처에 액세스하도록 허용하시겠습니까?" (READ_CONTACTS)

3. 권한 2/2: 미캡처 — 권한 거부 시 GrantPermissionsActivity 종료 후 앱이 강제 종료됨 ("app died, no saved state")

→ 권한을 강제하는 설계: 거부 시 앱 자체가 동작하지 않음. 정상 사용자는 어쩔 수 없이 허용하게 됨.

3. 패킹 / 보호 기제

Qihoo 360 Jiagu 패커 적용

증거 · 값

Application 클래스 · `com.frezrik.jiagu.StubApp`

Native libs · `libjiagu.so`, `libjiagu_64.so`, `libjiagu_x86.so`, `libjiagu_x86_64.so` (4 ABI)

Assets duplicates · `assets/libjiagu*.so` (런타임 dlopen용 백업)

Smali 파일 수 · **4개** (StubApp + CoreComponentFactory + 1)

classes.dex 크기 · 17.4 MB (stub + 패딩)

logcat 증거 · `D NDK_JIAGU: app name: com.jiazai.mx.durian.base.MyApp`

의미: 정적 분석으로는 진짜 비즈니스 로직(com.jiazai.mx.durian.* 클래스 본체)에 접근 불가. 실행 시 native lib이 메모리에서 진짜 DEX를 복호화하여 ClassLoader에 주입.

Frida 우회 시도 (실패)

· 시도 1: frida-dexdump -U -p <PID> → "Failed to attach: unable to connect to remote frida-server: closed"

· 시도 2: frida-dexdump -U -f <package> (spawn) → "need Gadget to attach on jailed Android"

· 시도 3: adb root 후 frida-server 수동 실행 → 프로세스 Abort, 안정적이지 않음 (LDPlayer + Android 9 환경 문제로 추정)

· 결과: Native dexdump 실패. 그러나 정적 strings 분석으로 핵심 데이터는 모두 노출됨 (Jiagu strings 평문 보존 약점).

LDPlayer 에뮬레이터 감지 증거

· logcat: com.ld.monitor.zzc.zza.zzb (LD Monitor 모듈 호출)

· DEX strings: LDNetUtil 클래스 존재

· 앱이 권한 거부 직후 강제 종료 → 에뮬 탐지 또는 안티-디버그 트리거 추정

4. C2 인프라

베이스 URL 후보

URL · 역할 · 호스팅

`[비공개] · **주 C2 베이스** · [비공개] 패밀리 도메인

`[비공개] · 2차 도메인 (별칭) · [비공개] 직접 도메인

`[비공개] · **백업 IP + 포트 8101** · AWS Singapore (ap-southeast-1)

`[비공개]` → `[비공개]` · 텔레메트리 (LD Monitor) · Alibaba Cloud Singapore

`[비공개] · 트래킹 SDK (third-party) · ShareTrace (트래킹 서비스)

동적 관찰 IP (logcat netstat)

원격 IP · 포트 · 상태 · 추정

`[비공개]` · **1883** · **ESTABLISHED** · **MQTT 브로커 가능성** (Alibaba Cloud)

`[비공개]` · 443 · SYN_SENT · C2 후보

`[비공개]` · 443 · SYN_SENT · C2 후보

`[비공개]` · 443 · SYN_SENT · Alibaba SG

`119.147.179.x` · 443 · SYN_SENT · China Telecom (의외)

`[비공개]` · 443 · SYN_SENT · Fastly CDN (sharetrace)

[비공개] 패밀리 연관성 🔥

[비공개] 서브도메인 패턴:

· [비공개] — 비밀톡 (이미 등록된 앱, apk/비밀톡_241106)

· `[비공개] — VioletToy (신규)

→ 동일 운영자 또는 같은 운영체 공유 가능성 ([비공개] 무료 서브도메인 사용 — 익명성 + 비용 회피).

5. API 엔드포인트

`[비공개] 패턴 (Sxjoa 운영자)

메서드 · 엔드포인트 · 목적 · 데이터

POST · `api/Anlei/register?type=android&userId=<id>` · 디바이스 등록 · 디바이스ID, 모델, OS

POST · `api/Anlei/uploadImg?type=android&userId=<id>` · **이미지 업로드** · 갤러리 사진 전체 탈취

POST · `api/Anlei/subAddress?type=ios&userId=<id>` · **주소록(연락처) 송출** · READ_CONTACTS 결과 — `type=ios`도 존재 = iOS 빌드 있음

POST · `api/Anlei/subSmsList?type=android&userId=<id>` · **SMS 목록 송출** · 권한 선언에는 SMS 없으나 동적 요청 가능

`[비공개] 패턴 (LD Monitor 텔레메트리)

메서드 · 엔드포인트 · 목적

POST · `[비공개] · 클라이언트 상태 보고

POST · `[비공개] · 클라이언트 상태 갱신

호스트: [비공개] ([비공개])

iOS 분기 발견

type=ios 파라미터 존재 → iOS 빌드 함께 운영 중. zip 목록에서 250323_Sxjoa2025.apk 발견 → 같은 운영자의 후속 Android 빌드 추정.

6. 암호화 / 통신 보호

클라이언트측 AES (정적 발견)

DEX strings에서 다음 클래스 확인:

· com.jiazai.mx.durian.utils.Aes

· com.jiazai.mx.durian.utils.AesCBC

· com.jiazai.mx.durian.utils.AesUtil

→ 페이로드는 AES-CBC로 암호화될 가능성. 키/IV는 native에서 동적 생성 또는 하드코딩. (Frida 동적 후크 실패로 키 추출은 보류.)

네트워크 보안 정책 (CRITICAL 취약점)

res/xml/network_security_config.xml:

```xml

<?xml version="1.0" encoding="utf-8"?>

<network-security-config>

<base-config cleartextTrafficPermitted="true" />

</network-security-config>

```

🔥 cleartextTrafficPermitted="true" — HTTP 평문 통신 전면 허용.

· [비공개]이 HTTP(평문)로 노출됨 → MITM 100% 가능

· 페이로드가 AES 암호화돼도 키 생성/배포 로직이 평문 채널에 노출되면 무력화

7. 의존성 / 라이브러리

UI 프레임워크

· Jetpack Compose (androidx.compose.*) — 모던 Android UI 선언적 프레임워크

· Kotlin Coroutines (kotlinx.coroutines.*)

· 회원가입/로그인 UI: bt_login, et_login_phone, et_login_yy (yy = 음성/언어 코드?)

네트워킹

· OkHttp3 (okhttp3/* 패키지)

· fastjson (Alibaba com.alibaba.fastjson) — JSON 직렬화 (취약점 이력 있는 라이브러리)

· Retrofit-like 어댑터: @Url must be okhttp3.HttpUrl, String, [비공개].URI, or [비공개].Uri type

텔레메트리 / SDK

· Tencent Bugly (com.tencent.bugly) — 크래시 리포팅 ([비공개])

· LD Monitor (com.ld.monitor.zzc) — LDPlayer 행위 추적 모듈

· ShareTrace (`[비공개]) — 사용자 추적

Rx

· io.reactivex.* + com.trello.rxlifecycle2.components

이미지

· Glide (GlideUtil)

· EXIF metadata parsing (PhotographicSensitivity, PhotometricInterpretation)

8. 핵심 내부 클래스 인벤토리

com.jiazai.mx.durian.* 패키지에서 strings로 발견된 클래스:

클래스 · 추정 역할

`base.MyApp` · Application 본체 (Jiagu가 로드함)

`ui.home.MainActivity` · 메인 액티비티

`ui.MyServices` · 백그라운드 서비스 ($1, $2, $3 inner class)

`web.FileUtils` · 파일 업로드 헬퍼

`http.Content` · 요청 컨텐츠

`http.NetUtil`, `http.HttpHelper`, `http.Disposables` · 네트워크 핵심

`http.CacheUtil`, `http.CommonLog` · 캐시 + 로깅

`bean.HttpResult<T>`, `bean.RejistBean` · 응답/등록 DTO

`utils.Aes`, `utils.AesCBC`, `utils.AesUtil` · AES 암호화 유틸

`utils.Autil` · 일반 유틸 (난독화)

`utils.Shooter` · **데이터 송출** (이름 — '쏘는 사람')

`utils.GsonUtil` · JSON

`utils.ICallback<T>` · 콜백

`utils.GlideUtil`, `utils.ImageUtil` · 이미지 처리

`utils.LDNetUtil` · **LDPlayer 네트워크 감지**

`utils.SpanUtils` · TextView Span

`customview.MyRec` · 커스텀 RecyclerView 또는 녹화?

9. 동적 분석 증거

화면 캡처 시퀀스

1. screen01_launch.png — Welcome + "회원 가입" 버튼 + 권한 1/2 다이얼로그 (연락처)

2. screen02_permission2.png — 동일 (거부 클릭 좌표 빗나감)

3. screen03_after_deny.png — 동일

Process 생명 주기

```

09:37:19 ActivityManager: START com.jiazai.mx.durian.ui.home.MainActivity from uid 2000

09:37:19 ActivityManager: Start proc 19539

09:37:19 NDK_JIAGU: app name: com.jiazai.mx.durian.base.MyApp ← Jiagu DEX 복호화 완료

09:38:54 System.err: SocketTimeoutException to [비공개] ← Bugly crash report 시도

09:38:54 com.ld.monitor.zzc: Request Error to [비공개] ← LD telemetry

09:39:34 ActivityManager: app died, no saved state ← 약 2분 후 강제 종료

```

→ 강제 종료 원인 추정: 권한 거부 + Frida 환경 감지 + 에뮬레이터 탐지 조합으로 자살 트리거.

10. 방어기제 매트릭스

기제 · 적용 여부 · 우회 시도 · 결과

**Jiagu 패킹** · ✅ · frida-dexdump 3회 · ❌ Frida-server 불안정으로 실패

**LDPlayer 감지** · ✅ · 별도 우회 없음 · ⚠️ 권한 거부 후 자살 트리거됨

**Anti-Frida** · ✅ (추정) · — · ❌ frida-server 자동 종료됨

**AES 페이로드 암호화** · ✅ (정적 클래스 확인) · 키 추출 불가 (정적) · ❌ 동적 분석 필요

**난수형 패키지명** · ✅ · — · ➖ 분석에 영향 없음

**권한 강제** · ✅ · 거부 시 죽음 · ⚠️ 정상 시나리오 무력화

11. 취약점 분석

V1. CleartextTraffic 평문 허용 (🔴 Critical)

network_security_config.xml에 cleartextTrafficPermitted="true" 명시 → HTTP 통신 가능. `[비공개] 평문 채널로 활용됨. MITM 공격에 무방비.

V2. AES 키 노출 가능성 (🟠 High)

DEX strings에서 Aes, AesCBC, AesUtil 클래스 평문 노출. Jiagu가 풀리면 (1회 메모리 덤프로) 키/IV가 그대로 드러남.

V3. Fastjson 의존 (🟡 Med)

Alibaba fastjson 사용 — CVE-2017-18349, CVE-2022-25845 등 deserialization RCE 이력. 운영자 서버측에서도 동일 라이브러리 가능성 → C2 침투 벡터.

V5. [비공개] 무료 도메인 + Alibaba Cloud (🟠 High)

무료 서브도메인 + 즉시 폐기 가능한 클라우드 IP — 테이크다운 회복력 약함. C2를 잃으면 백업 IP ([비공개] )도 같은 호스팅 → 일괄 차단 효과 큼.

12. IOC (Indicators of Compromise)

도메인

```

[비공개] (주 C2)

[비공개] (2차)

[비공개] (LD 텔레메트리)

[비공개] (subdomain) (서드파티 추적)

[비공개] (Tencent Bugly SDK)

```

IP

```

[비공개] (AWS Singapore — HTTP 평문)

[비공개] (Alibaba SG — [비공개])

[비공개] (Alibaba — MQTT, ESTABLISHED 관찰)

[비공개] (Alibaba SG)

[비공개] (Alibaba SG)

[비공개] (Alibaba SG)

```

패키지 / 파일

```

package: upxqr.svavc.xojgaijs.scubyvpgr

APK SHA256: AA018F81E9013CF62E8B7DCA2DDB81435ADD8EAFAF64A765F8C85A3A1604E4D2

APK MD5: 400BBE96AA81CBBFF343C6C3CDB8905A

Application: com.frezrik.jiagu.StubApp

Real entry: com.jiazai.mx.durian.base.MyApp

```

API 엔드포인트

```

POST [비공개]

POST [비공개]

POST [비공개]

POST [비공개]

POST [비공개]

POST [비공개]

```

13. 패밀리 분류 / 운영자 추적

신규 패밀리 명명 제안: **Sxjoa/Anlei 패밀리**

근거:

1. C2 베이스에 고유 키워드 Sxjoa ([비공개])

2. API 네임스페이스 Anlei ([비공개])

3. Java 패키지 jiazai.mx.durian — 코드네임 두리안

잠재적 연관 앱 (조사 필요)

후보 APK · 연관 단서

`250323_Sxjoa2025.apk` (zip에 존재) · C2 키워드 `Sxjoa` 완전 일치

`250408_Yhbzoa2025.apk` (zip에 존재) · 명명 패턴 유사 (zoa2025)

`250408_Yhbzoa2025.apk` 중복 entry

`260201_goldenlive.apk` / `260226_golden.apk` · golden + zhuye(主页)? — 확실치 않음

비밀톡 (등록됨) · 같은 `[비공개]` 패밀리 도메인

→ Sxjoa2025, Yhbzoa2025 추가 분석 필요. 비밀톡과 인프라 공유 여부 확인 필요.

14. 분석 기법 점검 (규칙서 14.13 강제 출력)

🔬 시도한 기법

· 14.1 정적 디컴파일: apktool d (성공, AndroidManifest + 4 smali 파일 확보)

· 14.2 Jiagu Stub 패턴 식별: com.frezrik.jiagu.StubApp (확정)

· 14.3 Frida 동적 DEX 덤프: frida-dexdump (실패 — frida-server LD에뮬에서 불안정)

· 14.4 logcat 동작 관찰: NDK_JIAGU 로그 + ld.monitor + bugly 호출 캡처

· 14.5 strings IOC 추출: classes.dex (jiagu 패킹에도 strings 평문 노출)

· 14.6 netstat 네트워크 관찰: MQTT 1883 ESTABLISHED 발견

· 14.7 native lib strings: libjiagu_x86_64.so (IOC 없음, jiagu 자체 코드)

· 14.8 권한 흐름 캡처: 권한 1/2 (READ_CONTACTS) 스크린샷 확보

· 14.9 network_security_config 분석: cleartextTrafficPermitted=true 발견

🆕 신규 기법: **[비공개] 패밀리 클러스터링**

기법명: INFRA-001 Free-Subdomain Operator Clustering

원리:

악성앱 운영자는 비용 + 익명성을 위해 무료 서브도메인 서비스([비공개], [비공개], is-a.dev 등)를 자주 사용. 같은 운영자는 같은 베이스 도메인 아래 다른 서브도메인을 발급받는다. {2차 도메인}.{무료 baseDomain} 패턴으로 운영자 클러스터를 식별할 수 있다.

예시:

· [비공개] (비밀톡, 2024-11)

· [비공개] (VioletToy, 2026-04) — 동일 운영자 후보

다음 단계: [비공개] NS/SOA 레코드 조회, 그 외 서브도메인 enumeration (Subfinder, crt.sh).

⚠️ 한계 / 실패

· L-001 Frida Spawn: LDPlayer + Android 9에서 frida-server 자동 종료. 다른 에뮬레이터(Genymotion, BlueStacks, 또는 물리기기)에서 재시도 필요.

· L-002 AES 키 추출: 정적 strings에 키 미노출. 동적 Frida 후크로 추출해야 함 — 현재 보류.

· L-003 권한 거부 후 앱 자살: 자살 트리거 회피 방법 미발견 — 권한 허용 시나리오 (테스트 데이터) 또는 패치된 APK (자살 코드 NOP) 필요.

· L-004 MQTT 1883 페이로드: ESTABLISHED는 관찰했으나 페이로드 내용 미캡처 (pcap 캡처 미실행).

다음 앱에서 시도할 아이디어

1. JADX strings preview — JADX의 strings 뷰어로 jiagu 패킹 앱에서 직접 IOC 추출

2. Custom Frida-server build — anti-detection 패치된 frida 빌드 사용

3. Magisk + EdXposed — 시스템 레벨 후크로 Jiagu 자체 우회

4. mitmproxy + iptables redirect — cleartext 통신을 강제 가로채기

15. 혁신 점검 (지속 혁신 의무)

항목 · 내용

**새 아이디어** · Jiagu Strings Leak Exploit (STR-001) 정식 기법화

**결과** · 성공 — Frida 실패 상황에서도 ML 레벨 분석 데이터 확보

**카탈로그 반영** · technique-master.js에 STR-001 등재 예정

**다음 시도** · Sxjoa2025, Yhbzoa2025를 STR-001로 즉시 분석 → 같은 패밀리 클러스터 완성

부록 A. 파일 산출물

```

apk/violettoy/

├── VioletToy.apk (원본, 15.28MB)

├── classes.dex (Jiagu stub dex, 17.4MB)

├── libjiagu_x86_64.so (native packer, x86_64)

├── libjiagu_64.so (native packer, arm64)

├── decoded/ (apktool 산출물)

│ ├── AndroidManifest.xml

│ ├── apktool.yml

│ ├── smali/ (4 파일 — stub 전용)

│ └── res/xml/network_security_config.xml ⚠️ cleartext=true

├── screen01_launch.png (권한 1/2 다이얼로그)

├── screen02_permission2.png

├── screen03_after_deny.png

├── logcat_dynamic_evidence.txt (logcat 동적 증거 grep)

├── extract_strings.py (분류된 키워드 strings 추출기)

├── extract_iocs.py (정규식 기반 IOC 추출기)

├── ui_dump.xml (UI hierarchy)

└── violettoy_quantum_nano_analysis_report.md (본 문서)

```

부록 B. 분석 환경

· 에뮬레이터: LDPlayer (emulator-5554), Android 9 (SDK 28), x86_64

· ADB: C:\Users\Admin\AppData\Local\Android\Sdk\platform-tools\adb.exe

· apktool: C:\Develop\apktool\apktool.bat

· aapt: C:\Users\Admin\AppData\Local\Android\Sdk\build-tools\35.0.0\aapt.exe

· Frida: 17.7.3 (frida-server 불안정)

· Python: 3.12 (strings 추출 스크립트)

> 침투·역공 등 민감 분석 섹션은 비공개입니다. 피해 상담·전체 열람 문의: [비공개]

본 보고서는 주식회사 아크링크 Deep-Coding 보안연구소가 피싱·몸캠피싱 피해자 구제를 목적으로 작성했습니다. 전체 열람·피해 상담: arklink.co.kr