버전: v1.0
분석 일자: 2026-05-23
분석자: 아크링크 보안연구팀
대상 APK: 260409_VioletToy.apk (15.28 MB)
위협 등급: 🔴 Extreme (개인정보 탈취 + 클리어텍스트 통신 + 패킹 보호)
항목 · 값
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 회피용
권한 · 위험도 · 용도 추정
`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")
→ 권한을 강제하는 설계: 거부 시 앱 자체가 동작하지 않음. 정상 사용자는 어쩔 수 없이 허용하게 됨.
증거 · 값
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에 주입.
· 시도 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 평문 보존 약점).
· logcat: com.ld.monitor.zzc.zza.zzb (LD Monitor 모듈 호출)
· DEX strings: LDNetUtil 클래스 존재
· 앱이 권한 거부 직후 강제 종료 → 에뮬 탐지 또는 안티-디버그 트리거 추정
URL · 역할 · 호스팅
`[비공개] · **주 C2 베이스** · [비공개] 패밀리 도메인
`[비공개] · 2차 도메인 (별칭) · [비공개] 직접 도메인
`[비공개] · **백업 IP + 포트 8101** · AWS Singapore (ap-southeast-1)
`[비공개]` → `[비공개]` · 텔레메트리 (LD Monitor) · Alibaba Cloud Singapore
`[비공개] · 트래킹 SDK (third-party) · ShareTrace (트래킹 서비스)
원격 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 (신규)
→ 동일 운영자 또는 같은 운영체 공유 가능성 ([비공개] 무료 서브도메인 사용 — 익명성 + 비용 회피).
메서드 · 엔드포인트 · 목적 · 데이터
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 없으나 동적 요청 가능
메서드 · 엔드포인트 · 목적
POST · `[비공개] · 클라이언트 상태 보고
POST · `[비공개] · 클라이언트 상태 갱신
호스트: [비공개] ([비공개])
type=ios 파라미터 존재 → iOS 빌드 함께 운영 중. zip 목록에서 250323_Sxjoa2025.apk 발견 → 같은 운영자의 후속 Android 빌드 추정.
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 동적 후크 실패로 키 추출은 보류.)
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 암호화돼도 키 생성/배포 로직이 평문 채널에 노출되면 무력화
· 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
· Tencent Bugly (com.tencent.bugly) — 크래시 리포팅 ([비공개])
· LD Monitor (com.ld.monitor.zzc) — LDPlayer 행위 추적 모듈
· ShareTrace (`[비공개]) — 사용자 추적
· io.reactivex.* + com.trello.rxlifecycle2.components
· Glide (GlideUtil)
· EXIF metadata parsing (PhotographicSensitivity, PhotometricInterpretation)
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 또는 녹화?
1. screen01_launch.png — Welcome + "회원 가입" 버튼 + 권한 1/2 다이얼로그 (연락처)
2. screen02_permission2.png — 동일 (거부 클릭 좌표 빗나감)
3. screen03_after_deny.png — 동일
```
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 환경 감지 + 에뮬레이터 탐지 조합으로 자살 트리거.
기제 · 적용 여부 · 우회 시도 · 결과
**Jiagu 패킹** · ✅ · frida-dexdump 3회 · ❌ Frida-server 불안정으로 실패
**LDPlayer 감지** · ✅ · 별도 우회 없음 · ⚠️ 권한 거부 후 자살 트리거됨
**Anti-Frida** · ✅ (추정) · — · ❌ frida-server 자동 종료됨
**AES 페이로드 암호화** · ✅ (정적 클래스 확인) · 키 추출 불가 (정적) · ❌ 동적 분석 필요
**난수형 패키지명** · ✅ · — · ➖ 분석에 영향 없음
**권한 강제** · ✅ · 거부 시 죽음 · ⚠️ 정상 시나리오 무력화
network_security_config.xml에 cleartextTrafficPermitted="true" 명시 → HTTP 통신 가능. `[비공개] 평문 채널로 활용됨. MITM 공격에 무방비.
DEX strings에서 Aes, AesCBC, AesUtil 클래스 평문 노출. Jiagu가 풀리면 (1회 메모리 덤프로) 키/IV가 그대로 드러남.
Alibaba fastjson 사용 — CVE-2017-18349, CVE-2022-25845 등 deserialization RCE 이력. 운영자 서버측에서도 동일 라이브러리 가능성 → C2 침투 벡터.
무료 서브도메인 + 즉시 폐기 가능한 클라우드 IP — 테이크다운 회복력 약함. C2를 잃으면 백업 IP ([비공개] )도 같은 호스팅 → 일괄 차단 효과 큼.
```
[비공개] (주 C2)
[비공개] (2차)
[비공개] (LD 텔레메트리)
[비공개] (subdomain) (서드파티 추적)
[비공개] (Tencent Bugly SDK)
```
```
[비공개] (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
```
```
POST [비공개]
POST [비공개]
POST [비공개]
POST [비공개]
POST [비공개]
POST [비공개]
```
근거:
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.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 통신을 강제 가로채기
항목 · 내용
**새 아이디어** · Jiagu Strings Leak Exploit (STR-001) 정식 기법화
**결과** · 성공 — Frida 실패 상황에서도 ML 레벨 분석 데이터 확보
**카탈로그 반영** · technique-master.js에 STR-001 등재 예정
**다음 시도** · Sxjoa2025, Yhbzoa2025를 STR-001로 즉시 분석 → 같은 패밀리 클러스터 완성
```
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 (본 문서)
```
· 에뮬레이터: 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