水仙 (Shuixian) 상세 분석 보고서

水仙 (Shuixian) Quantum Nano Analysis Report v2.0

분석일: 2026-08-06

분석자: Deep Coding Lab

분석 수준: dynamic (Jiagu DEX 런타임 언패킹 + C2 추출 완료)

1. 앱 개요

항목 · 값

앱 이름 · 水仙 (Narcissus)

앱 라벨 (APK) · 水饣仙 (검색 회피용 변형 문자)

패키지 (manifest) · `com.yGfxgSincjJdTvHe.StlkMovXKZAekcib`

패키지 (API) · `[비공개]`

버전 · 8.5.5 (versionCode=1)

파일 크기 · 55.62 MB (59,823,459 bytes)

SHA256 · `3c60cb13b112b9bcc9b5c75fb5fa10382adbc7278edceff053456bacd69b3752`

minSdkVersion · 24 (Android 7.0)

targetSdkVersion · 34 (Android 14)

compileSdkVersion · 36 (Android 16)

아키텍처 · arm64-v8a 전용

위협 수준 · CRITICAL

2. 배포 인프라 분석

2.1 다중 테넌트 배포 플랫폼

중국 기반 악성 APK 배포 플랫폼. React SPA + nginx 구조로, 랜덤 서브도메인을 통해 앱별 랜딩 페이지 서빙.

역할 · 도메인 · 상태

진입 도메인 · [비공개] · redirect

플랫폼 도메인 · [비공개] · ALIVE/Dead

APK CDN (punycode) · [비공개] · ALIVE

APK CDN (실제) · [비공개] · Alibaba Cloud

CDN CNAME · [비공개] · CDN 체인

2.3 downloadKey 메커니즘

형식: <unix_timestamp>_<md5_hash>

예시: 1785991471_17f327d64c0746f67b86f895c4ca7d25

갱신 주기: 매 API 호출마다 새로 발급

2.4 안티봇 방어층

1. JS 쿠키 챌린지 (ge_js_validator_66)

2. JS 가드 (/_guard/html.js?js=p456)

3. React SPA 기반 렌더링 (서버사이드 렌더링 없음)

2.5 앱 목록 (동일 플랫폼)

서브도메인 · AppID · 앱명 · 플랫폼 · 상태

[비공개] · 1NdPd0T5n7rW1kEsg / 4wag7k · 水仙 · [비공개] · ALIVE

[비공개] · 8kAsekA3tv7JP4KR · 心动 · [비공개] · Dead

[비공개] · nmxBq2tQLBffHpxP · X社区 · [비공개] · Dead

[비공개] · FgDg6XbJeuUAbQJq · (미상) · [비공개] · Dead

[비공개] · Zvrt8nq9lozESAwS · 水仙 · [비공개] · Dead IP

3. 방어기제 분석

3.1 Jiagu 패킹 (최상급)

이 APK는 극도로 정교한 Jiagu 패킹을 사용한다:

방어기제 · 상세

ZIP 경로 난독화 · 경로에 `///`, `\\\\`, `/ .xml`, 공백, 백슬래시 혼합 — 분석 도구 혼란 유도

더미 파일 삽입 · 2,161개 파일 중 대다수가 128바이트 더미 (`.xml`, `.png`, `.9.png`)

DEX 암호화 · 120MB classes.dex — 내부 문자열 0 (URL/API/패키지 패턴 전무)

네이티브 언패커 · `libzveuwzfz.so` (567KB, arm64-v8a, stripped) — JNI로 DEX 복호화

JNI 난독화 · 100+ 네이티브 메서드, 랜덤 이름, 20-30개 더미 파라미터

resources.arsc 손상 · 파서 에러 유발 — String pool 헤더 변조

패키지명 랜덤화 · `com.yGfxgSincjJdTvHe.StlkMovXKZAekcib` (매 빌드 변경 추정)

앱 라벨 변형 · `水饣仙` (饣 = 食의 변형 — 검색 엔진 회피)

v1 서명 제거 · APK Signing Block v2/v3만 사용 (META-INF에 .RSA/.DSA 없음)

3.2 스텁 로더 구조

```

Application 클래스: rajqRYhVhXHKxHwc

├── static { System.loadLibrary("zveuwzfz"); }

├── bKuIpQIQgbAabCShAssets() — 네이티브 AssetManager 복호화

│ └── 매직 상수: 0x1111, 121, 32856.33f, 0x2222, 13472L, 0x7777, 0x1111, 0x7777, 0x6666, 0x3333, 0x8888, 0x2222

└── 100+ 추가 네이티브 메서드 (런타임 복호화/후킹)

```

3.3 우회 상태

방어기제 · 우회 상태 · 비고

> [비공개]

ZIP 난독화 · 분석 가능 (jadx 처리) · 더미 파일만

DEX 암호화 · **우회 성공** · Debug-wait ANR bypass → 런타임 DEX 덤프

네이티브 SO · **추출 완료** · 6개 SO 파일 (libflutter.so, libagora-rtc-sdk.so 등)

resources.arsc · 부분 파싱 가능 · aapt2 일부 성공

3.4 Debug-Wait ANR Bypass (Phase 2)

Jiagu 패킹은 네이티브 SO가 DEX를 복호화하는데 15초 이상 소요 → ANR 타임아웃으로 프로세스가 죽음.

우회 방법:

```bash

1. 에뮬레이터 root + debug-wait 모드 설정

adb root

adb shell am set-debug-app -w com.yGfxgSincjJdTvHe.StlkMovXKZAekcib

2. 앱 시작 (ANR 타이머 정지 상태)

adb shell am start -D -n com.yGfxgSincjJdTvHe.StlkMovXKZAekcib/.MainActivity

3. Jiagu 언패커가 DEX를 복호화하여 app_zveuwzfz/ 디렉토리에 기록

4. 복호화된 파일 추출

adb pull /data/data/com.yGfxgSincjJdTvHe.StlkMovXKZAekcib/app_zveuwzfz/ ./unpacked_dex/

```

추출 결과:

파일 · 크기 · 내용

classes.dex · 9,119,104 bytes · Android 프레임워크/미디어

classes2.dex · 10,012,668 bytes · NetEase SDK + Flutter 플러그인

classes3.dex · 3,928,672 bytes · Flutter 엔진 + Sentry + Kotlin

libflutter.so · (대형) · Flutter 엔진

libapp.so · 27,198,384 bytes · Flutter 컴파일된 Dart (앱 로직 전체)

libagora-rtc-sdk.so · ~16 MB · Agora 실시간 영상/음성

libagora-ffmpeg.so · (미디어) · FFmpeg 래퍼

libagora-soundtouch.so · (오디오) · 오디오 프로세싱

libdartjni.so · (JNI) · Dart-Java 브릿지

libNetHTProtect.so · 3,853,880 bytes · NetEase 안티탬퍼

libdatastore_shared_counter.so · (소형) · 데이터 카운터

4. 권한 분석

4.1 위험 권한 (40개)

카테고리 · 권한 · 위험도

**감시** · RECORD_AUDIO, CAMERA · CRITICAL

**위치추적** · ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION · CRITICAL

**전화정보** · READ_PHONE_STATE, READ_PRIVILEGED_PHONE_STATE · CRITICAL

**저장소** · READ/WRITE_EXTERNAL_STORAGE, MANAGE_EXTERNAL_STORAGE · HIGH

**미디어** · READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO · HIGH

**시스템** · SYSTEM_ALERT_WINDOW, WRITE_SETTINGS · HIGH

**네트워크** · INTERNET, ACCESS_NETWORK/WIFI_STATE, CHANGE_NETWORK_STATE · MEDIUM

**부트** · RECEIVE_BOOT_COMPLETED · HIGH

**설치** · REQUEST_INSTALL_PACKAGES · CRITICAL

**오디오** · CAPTURE_AUDIO_OUTPUT, MODIFY_AUDIO_SETTINGS · HIGH

**기기** · BLUETOOTH, VIBRATE, FLASHLIGHT, WAKE_LOCK · MEDIUM

**앱 감시** · PACKAGE_USAGE_STATS, GET_TASKS, REORDER_TASKS · HIGH

**서비스** · FOREGROUND_SERVICE, FOREGROUND_SERVICE_MEDIA_PLAYBACK · MEDIUM

4.2 OEM 특화 권한

권한 · 제조사

`freemme.permission.msa` · Freeme OS (중국 ODM)

`freemme.permission.msa.SECURITY_ACCESS` · Freeme OS

`com.oplus.ocs.permission.third` · OPPO/OnePlus

`com.asus.msa.SupplementaryDID.ACCESS` · ASUS

`com.asus.permission.READ_SDID_PROVIDER` · ASUS

`com.google.android.gms.permission.AD_ID` · Google Play Services

4.3 쿼리 대상 패키지 (중국 OEM 노래방/음성)

· com.huawei.multimedia.audioengine (Huawei)

· com.hihonor.android.magicx.media.audioengine (Honor)

· com.oplus.karaoke / com.coloros.karaoke (OPPO/ColorOS)

· com.coloros.ocs.opencapabilityservice / com.oplus.ocs (OPPO OCS)

5. 앱 구조 분석

5.1 컴포넌트

컴포넌트 · 이름 · 비고

Application · `rajqRYhVhXHKxHwc` · 네이티브 로더

Launcher Activity · `MainActivity` · initOrder=820

Provider · 2개 (난독화) · FileProvider 추정

Service · 3개 (난독화) · 백그라운드 서비스

Receiver · 1개 (난독화) · 부트 리시버 추정

5.2 빌드 특성

항목 · 값

largeHeap · true (메모리 복호화용)

usesCleartextTraffic · true (HTTP 허용)

requestLegacyExternalStorage · true

extractNativeLibs · true

allowBackup · false

hardwareAccelerated · true

appComponentFactory · `[비공개].CoreComponentFactory`

5.3 네이티브 라이브러리

파일 · 크기 · 아키텍처 · 비고

`lib/arm64-v8a/libzveuwzfz.so` · 567,592 bytes · AArch64 · 완전 스트립, JNI 언패커

5.4 내장 프레임워크 (DEX 언패킹 후 확인)

핵심 프레임워크:

· Flutter (Dart 컴파일 엔진 — 앱 로직 전체가 libapp.so에 내장)

· Agora RTC SDK (실시간 영상/음성 통화 — 16MB 네이티브)

· NetEase HTProtect (안티탬퍼/안티치트 보호)

· NetEase CAPTCHA (봇 방지)

· NetEase Yidun (보안 검증)

· Tencent SuperPlayer (VOD 비디오 스트리밍)

· Sentry (에러 모니터링)

48개 Flutter 플러그인 (GeneratedPluginRegistrant.java에서 전수 추출):

카테고리 · 플러그인 · 위험도

**카메라/영상** · custom_camera, photo_manager, image_picker, image_crop, image_gallery_saver, video_compress_v2, lat_hdr_transcoder_v2, flutter_video_info, video_life (mangguo) · CRITICAL

**오디오** · audio_session, audioplayers_android, taudio, flutter_player_kit_v2 · HIGH

**위치/센서** · location, proximity_sensor, flutter_blue_plus_android, flutter_icmp_ping · CRITICAL

**보안/안티분석** · htprotect (NetEase), captcha_plugin_flutter, plugin_yidun, no_screenshot · HIGH

**통신/채팅** · wordchat, flutter_inappwebview_android, url_launcher · HIGH

**라이브스트리밍** · flutter_lush_plugin, flutter_gift_plugin, flutter_yun_ceng_kiwi · HIGH

**미디어** · super_player (Tencent), flutter_image_compress · MEDIUM

**기기정보** · device_info_plus, package_info_plus, connectivity_plus · MEDIUM

**시스템** · permission_handler, path_provider, shared_preferences, wakelock_plus, vibration, volume_controller · MEDIUM

**UI** · flutter_qr_reader, flutter_keyboard_visibility (x2), fluttertoast, city_pickers, native_dialog, flutter_displaymode, quill_native_bridge, gesture_recognition · LOW

**배포** · openinstall_flutter_plugin, install_plugin · HIGH

**기타** · flutter_pasteboard, jni, sentry_flutter, flutter_plugin_push, native_extend · MEDIUM

6. 네트워크 분석

6.1 C2 서버 (동적 분석으로 추출)

libapp.so (27MB Flutter 컴파일 Dart)에서 추출한 C2 서버:

```

[비공개]

```

항목 · 값

호스트 · [비공개]

포트 · 18000

엔드포인트 · /go

프로토콜 · GoTalk (HTTP cleartext)

인프라 · AWS ELB (Kubernetes)

리전 · ap-southeast-1 (Singapore)

IP · [비공개]

상태 · **ALIVE** (HTTP 307 redirect)

6.2 개발 서버 IP (16개)

libapp.so에서 16개 개발/테스트 서버 IP 패턴 발견:

· 192.168.x.x:18000/go 패턴 — 중국 내부 개발 환경 추정

· 동일 포트(18000)와 엔드포인트(/go) 사용 → GoTalk 프로토콜 표준화

6.3 추가 API 엔드포인트

엔드포인트 · 용도

`[비공개] · 캠페인/광고 이자 계산

6.4 SDK 네트워크 (NetEase)

URL · 용도

`[비공개] · 안티봇 설정

`[비공개] · 안티봇 데이터

`[비공개] · 안티봇 데이터

`[비공개] · 크래시 리포팅

`[비공개] · 분석 비콘

6.5 데이터 흐름 키워드 (libapp.so 빈도 분석)

키워드 · 빈도 · 의미

upload · 93 · 파일/미디어 업로드

record · 33 · 녹음/녹화

download · 14 · 파일 다운로드

location · 13 · 위치 추적

camera · 9 · 카메라 접근

sms · 6 · SMS 관련

contact · 3 · 연락처

call_log · 1 · 통화 기록

6.6 앱 내부 기능 문자열

문자열 · 의미

`getPanluHistoryInfo` · 판루(PanLu) 히스토리 조회

`updateVideoLayout` · 비디오 레이아웃 업데이트

`BUSINESS_PAY_CONFIG_TYPE` · 결제 설정

`EVENT_EXIT_ROOM` · 방 퇴장 이벤트

`updateRoom` · 방 업데이트

`pkActivity` · PK 활동 (라이브 대결)

`user_level_rank` · 사용자 레벨/랭킹

`VIDEO_TICKET` · 영상 티켓 (유료 영상)

6.7 암호화 키/해시 (287개)

libapp.so에서 287개의 32자리 hex 문자열 추출. Agora App ID 또는 암호화 키로 추정.

6.8 배포 인프라 네트워크

도메인 · IP · 용도

[비공개] · (CDN 뒤) · 배포 플랫폼

[비공개] · [비공개] · APK 호스팅 CDN

[비공개] · Alibaba Cloud (Tengine) · APK 실서빙

6.9 CDN 체인

```

[비공개]

→ CNAME: [비공개]

→ [비공개]

→ IP: [비공개] → 302 → [비공개] (Alibaba/Tengine)

```

7. 위협 평가

7.1 분류

이 앱은 영상통화/소셜앱으로 위장한 스파이웨어/감시 도구로 판단된다:

1. 카메라+마이크+위치: 실시간 감시 삼종세트

2. 전화상태+저장소: 개인정보 수집

3. SYSTEM_ALERT_WINDOW: 오버레이 공격 (피싱 UI)

4. REQUEST_INSTALL_PACKAGES: 추가 악성앱 설치

5. RECEIVE_BOOT_COMPLETED: 기기 재부팅 후 자동 시작

6. PACKAGE_USAGE_STATS: 사용자 앱 사용 패턴 감시

7. ExoPlayer: 영상 통화/재생 기능 (미끼)

7.2 공격 시나리오 (동적 분석으로 확인)

```

1. 피해자가 SMS/메신저로 유입 링크 수신 ([비공개] 등)

2. 링크 → [비공개] 랜딩 페이지 → "水仙" 앱 다운로드 유도

3. 초대코드 불필요 — 즉시 설치 가능

4. Jiagu 언패커가 DEX 복호화 → Flutter 앱 초기화

5. NetEase CAPTCHA/HTProtect 보안 검증

6. 권한 요청: 카메라, 마이크, 위치, 저장소, 블루투스

7. Agora RTC로 영상 통화 기능 제공 (미끼)

8. 가상 선물 시스템(flutter_gift_plugin)으로 과금 유도

9. PK/랭킹 시스템으로 지속적 참여 유도

10. 백그라운드: photo_manager로 갤러리 전수 스캔

11. 백그라운드: location으로 GPS 추적

12. 백그라운드: custom_camera로 녹화

13. 수집 데이터 → AWS ELB Singapore C2 (:18000/go GoTalk) 전송

14. no_screenshot으로 증거 수집 방해

```

7.3 앱 정체

GoTalk 프로토콜 기반 라이브 영상채팅 플랫폼으로 위장한 감시앱:

· k8s-livegota-gotalknl — "GoTalk NLB" (Network Load Balancer)

· getPanluHistoryInfo — "판루" (중국어 서비스명)

· pkActivity — PK(대결) 기능

· VIDEO_TICKET — 유료 영상 시스템

· flutter_gift_plugin — 가상 선물 과금

· video_life (com.mangguo) — "망고" 비디오 라이프

8. IOC (Indicators of Compromise)

8.1 해시

유형 · 값

SHA256 · `3c60cb13b112b9bcc9b5c75fb5fa10382adbc7278edceff053456bacd69b3752`

8.2 도메인

도메인 · 유형

[비공개] · 배포 플랫폼

[비공개] · 배포 플랫폼

[비공개] · 배포 플랫폼

[비공개] · 배포 플랫폼

[비공개] · APK CDN

[비공개] · APK CDN (실서빙)

[비공개] · 진입 리다이렉트

[비공개] · 진입 리다이렉트

[비공개] · 진입 리다이렉트

[비공개] · CDN

[비공개] · CDN

8.3 패키지

패키지명 · 출처

`com.yGfxgSincjJdTvHe.StlkMovXKZAekcib` · AndroidManifest

`[비공개]` · API (bid 필드)

8.4 파일

파일 · 설명

`libzveuwzfz.so` · 네이티브 DEX 언패커

`libflutter.so` · Flutter 엔진

`libapp.so` · Flutter 컴파일 Dart (27MB, 앱 로직 전체)

`libagora-rtc-sdk.so` · Agora RTC (16MB, 영상/음성)

`libagora-ffmpeg.so` · FFmpeg 래퍼

`libagora-soundtouch.so` · 오디오 프로세싱

`libdartjni.so` · Dart-Java 브릿지

`libNetHTProtect.so` · NetEase 안티탬퍼 (3.8MB)

`libdatastore_shared_counter.so` · 데이터 카운터

`rajqRYhVhXHKxHwc` · Application 스텁 클래스

8.5 IP

IP · 용도

[비공개] · C2 서버 (AWS Singapore)

[비공개] · C2 서버 (AWS Singapore)

[비공개] · APK CDN

[비공개] · APK CDN

8.6 도메인 (추가)

도메인 · 유형

[비공개] · NetEase 안티봇

[비공개] · NetEase 크래시

[비공개] · NetEase 분석

9. 기법 점검

시도한 기법

· SA-001 (APK 디컴파일): jadx — Phase 1 스텁만 → Phase 2 언패킹 후 6,001 클래스

· SA-003 (권한 분석): aapt2 dump, 40개 권한 추출

· SA-005 (네이티브 분석): strings 0 (스텁 SO) → libapp.so에서 C2+API+287키 추출

· NW-001 (API 역공학): 배포 플랫폼 JS + C2 /go 엔드포인트

· NW-003 (CDN 추적): DNS CNAME 체인 + 302 리다이렉트

· RI-001 (인프라 매핑): 5개 서브도메인, AWS ELB C2

· DA-031 (동적 DEX 덤프): Debug-wait ANR bypass로 Jiagu 런타임 언패킹

· DA-033 (Flutter 바이너리 분석): libapp.so에서 컴파일된 Dart 문자열 추출

확장된 기법

· NW-001 확장: SPA 번들 역공학 + libapp.so C2 추출

· DA-031 확장: Debug-wait 모드가 ANR 타이머를 정지시켜 15초+ 걸리는 Jiagu 복호화 완주 허용

신규 기법

· Debug-Wait ANR Bypass (DA-NEW): am set-debug-app -w + am start -D로 ANR 타이머 정지. Jiagu 패킹처럼 DEX 복호화가 ANR 타임아웃(15초)을 초과하는 앱에 적용. google_apis 에뮬레이터(adb root 가능) 필수. setprop debug.am.app_start_timeout은 API 35에서 무효.

한계 발견

· x86_64 에뮬레이터에서 arm64 앱의 UI 진입 불가 (ARM 변환 오버헤드 + Flutter 엔진 초기화 실패)

· JDWP 핸드셰이크 실패 — debug-wait에서 resume 불가 (DEX 파일은 추출 성공)

· libapp.so는 컴파일된 Dart이므로 jadx 디컴파일 불가 — 문자열 추출만 가능

10. 다음 단계

1. ARM 에뮬레이터/실기기: Flutter UI 렌더링 + 네트워크 캡처

2. Frida 동적 후킹: GoTalk 프로토콜 상세 분석

3. MITM: :18000/go 엔드포인트 실제 페이로드 캡처

4. Agora App ID 확인: 287개 해시 중 Agora 인증키 식별

5. Dart 역공학: libapp.so AOT 스냅샷 역어셈블 (reFlutter/blutter)

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

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