분석일: 2026-08-06
분석자: Deep Coding Lab
분석 수준: dynamic (Jiagu DEX 런타임 언패킹 + C2 추출 완료)
항목 · 값
앱 이름 · 水仙 (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
중국 기반 악성 APK 배포 플랫폼. React SPA + nginx 구조로, 랜덤 서브도메인을 통해 앱별 랜딩 페이지 서빙.
역할 · 도메인 · 상태
진입 도메인 · [비공개] · redirect
플랫폼 도메인 · [비공개] · ALIVE/Dead
APK CDN (punycode) · [비공개] · ALIVE
APK CDN (실제) · [비공개] · Alibaba Cloud
CDN CNAME · [비공개] · CDN 체인
형식: <unix_timestamp>_<md5_hash>
예시: 1785991471_17f327d64c0746f67b86f895c4ca7d25
갱신 주기: 매 API 호출마다 새로 발급
1. JS 쿠키 챌린지 (ge_js_validator_66)
2. JS 가드 (/_guard/html.js?js=p456)
3. React SPA 기반 렌더링 (서버사이드 렌더링 없음)
서브도메인 · AppID · 앱명 · 플랫폼 · 상태
[비공개] · 1NdPd0T5n7rW1kEsg / 4wag7k · 水仙 · [비공개] · ALIVE
[비공개] · 8kAsekA3tv7JP4KR · 心动 · [비공개] · Dead
[비공개] · nmxBq2tQLBffHpxP · X社区 · [비공개] · Dead
[비공개] · FgDg6XbJeuUAbQJq · (미상) · [비공개] · Dead
[비공개] · Zvrt8nq9lozESAwS · 水仙 · [비공개] · Dead IP
이 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 없음)
```
Application 클래스: rajqRYhVhXHKxHwc
├── static { System.loadLibrary("zveuwzfz"); }
├── bKuIpQIQgbAabCShAssets() — 네이티브 AssetManager 복호화
│ └── 매직 상수: 0x1111, 121, 32856.33f, 0x2222, 13472L, 0x7777, 0x1111, 0x7777, 0x6666, 0x3333, 0x8888, 0x2222
└── 100+ 추가 네이티브 메서드 (런타임 복호화/후킹)
```
방어기제 · 우회 상태 · 비고
> [비공개]
ZIP 난독화 · 분석 가능 (jadx 처리) · 더미 파일만
DEX 암호화 · **우회 성공** · Debug-wait ANR bypass → 런타임 DEX 덤프
네이티브 SO · **추출 완료** · 6개 SO 파일 (libflutter.so, libagora-rtc-sdk.so 등)
resources.arsc · 부분 파싱 가능 · aapt2 일부 성공
Jiagu 패킹은 네이티브 SO가 DEX를 복호화하는데 15초 이상 소요 → ANR 타임아웃으로 프로세스가 죽음.
우회 방법:
```bash
adb root
adb shell am set-debug-app -w com.yGfxgSincjJdTvHe.StlkMovXKZAekcib
adb shell am start -D -n com.yGfxgSincjJdTvHe.StlkMovXKZAekcib/.MainActivity
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 · (소형) · 데이터 카운터
카테고리 · 권한 · 위험도
**감시** · 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
권한 · 제조사
`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
· 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)
컴포넌트 · 이름 · 비고
Application · `rajqRYhVhXHKxHwc` · 네이티브 로더
Launcher Activity · `MainActivity` · initOrder=820
Provider · 2개 (난독화) · FileProvider 추정
Service · 3개 (난독화) · 백그라운드 서비스
Receiver · 1개 (난독화) · 부트 리시버 추정
항목 · 값
largeHeap · true (메모리 복호화용)
usesCleartextTraffic · true (HTTP 허용)
requestLegacyExternalStorage · true
extractNativeLibs · true
allowBackup · false
hardwareAccelerated · true
appComponentFactory · `[비공개].CoreComponentFactory`
파일 · 크기 · 아키텍처 · 비고
`lib/arm64-v8a/libzveuwzfz.so` · 567,592 bytes · AArch64 · 완전 스트립, JNI 언패커
핵심 프레임워크:
· 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
libapp.so (27MB Flutter 컴파일 Dart)에서 추출한 C2 서버:
```
[비공개]
```
항목 · 값
호스트 · [비공개]
포트 · 18000
엔드포인트 · /go
프로토콜 · GoTalk (HTTP cleartext)
인프라 · AWS ELB (Kubernetes)
리전 · ap-southeast-1 (Singapore)
IP · [비공개]
상태 · **ALIVE** (HTTP 307 redirect)
libapp.so에서 16개 개발/테스트 서버 IP 패턴 발견:
· 192.168.x.x:18000/go 패턴 — 중국 내부 개발 환경 추정
· 동일 포트(18000)와 엔드포인트(/go) 사용 → GoTalk 프로토콜 표준화
엔드포인트 · 용도
`[비공개] · 캠페인/광고 이자 계산
URL · 용도
`[비공개] · 안티봇 설정
`[비공개] · 안티봇 데이터
`[비공개] · 안티봇 데이터
`[비공개] · 크래시 리포팅
`[비공개] · 분석 비콘
키워드 · 빈도 · 의미
upload · 93 · 파일/미디어 업로드
record · 33 · 녹음/녹화
download · 14 · 파일 다운로드
location · 13 · 위치 추적
camera · 9 · 카메라 접근
sms · 6 · SMS 관련
contact · 3 · 연락처
call_log · 1 · 통화 기록
문자열 · 의미
`getPanluHistoryInfo` · 판루(PanLu) 히스토리 조회
`updateVideoLayout` · 비디오 레이아웃 업데이트
`BUSINESS_PAY_CONFIG_TYPE` · 결제 설정
`EVENT_EXIT_ROOM` · 방 퇴장 이벤트
`updateRoom` · 방 업데이트
`pkActivity` · PK 활동 (라이브 대결)
`user_level_rank` · 사용자 레벨/랭킹
`VIDEO_TICKET` · 영상 티켓 (유료 영상)
libapp.so에서 287개의 32자리 hex 문자열 추출. Agora App ID 또는 암호화 키로 추정.
도메인 · IP · 용도
[비공개] · (CDN 뒤) · 배포 플랫폼
[비공개] · [비공개] · APK 호스팅 CDN
[비공개] · Alibaba Cloud (Tengine) · APK 실서빙
```
[비공개]
→ CNAME: [비공개]
→ [비공개]
→ IP: [비공개] → 302 → [비공개] (Alibaba/Tengine)
```
이 앱은 영상통화/소셜앱으로 위장한 스파이웨어/감시 도구로 판단된다:
1. 카메라+마이크+위치: 실시간 감시 삼종세트
2. 전화상태+저장소: 개인정보 수집
3. SYSTEM_ALERT_WINDOW: 오버레이 공격 (피싱 UI)
4. REQUEST_INSTALL_PACKAGES: 추가 악성앱 설치
5. RECEIVE_BOOT_COMPLETED: 기기 재부팅 후 자동 시작
6. PACKAGE_USAGE_STATS: 사용자 앱 사용 패턴 감시
7. ExoPlayer: 영상 통화/재생 기능 (미끼)
```
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으로 증거 수집 방해
```
GoTalk 프로토콜 기반 라이브 영상채팅 플랫폼으로 위장한 감시앱:
· k8s-livegota-gotalknl — "GoTalk NLB" (Network Load Balancer)
· getPanluHistoryInfo — "판루" (중국어 서비스명)
· pkActivity — PK(대결) 기능
· VIDEO_TICKET — 유료 영상 시스템
· flutter_gift_plugin — 가상 선물 과금
· video_life (com.mangguo) — "망고" 비디오 라이프
유형 · 값
SHA256 · `3c60cb13b112b9bcc9b5c75fb5fa10382adbc7278edceff053456bacd69b3752`
도메인 · 유형
[비공개] · 배포 플랫폼
[비공개] · 배포 플랫폼
[비공개] · 배포 플랫폼
[비공개] · 배포 플랫폼
[비공개] · APK CDN
[비공개] · APK CDN (실서빙)
[비공개] · 진입 리다이렉트
[비공개] · 진입 리다이렉트
[비공개] · 진입 리다이렉트
[비공개] · CDN
[비공개] · CDN
패키지명 · 출처
`com.yGfxgSincjJdTvHe.StlkMovXKZAekcib` · AndroidManifest
`[비공개]` · API (bid 필드)
파일 · 설명
`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 스텁 클래스
IP · 용도
[비공개] · C2 서버 (AWS Singapore)
[비공개] · C2 서버 (AWS Singapore)
[비공개] · APK CDN
[비공개] · APK CDN
도메인 · 유형
[비공개] · NetEase 안티봇
[비공개] · NetEase 크래시
[비공개] · NetEase 분석
· 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 디컴파일 불가 — 문자열 추출만 가능
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