HaaTalk 상세 분석 보고서

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

버전: v1.0

분석 일자: 2026-05-23

대상: 260312_HaaTalk.APK (29.0 MB)

위협 등급: 🔴🔴 Extreme+ (드로퍼 능력 + 다국어 다중 타겟)

패밀리: 새로운 패밀리 — zero-to-million / 2025 운영자 (이전 미식별)

1. 핵심 결론

HaaTalk은 우리 DB의 기존 271개 앱과 패키지명, C2, 운영자 모두 다른 신규 운영자/패밀리다. 기업 내부 도구로 위장(com.corp.internal.calendar.sync)하고 한국+일본+iOS+Android 다중 타겟을 동시 운영. INSTALL_PACKAGES 권한 = 드로퍼(Dropper) 능력 보유 — 추가 페이로드 설치 가능.

기술적 보호 3중:

1. 360 Jiagu 패킹 (classes.dex stub)

2. 39285EFA XOR ab1234cd (assets/39285EFA.dex 추가 보호)

3. JavaScript Obfuscator (assets/apps/__UNI__G2D047E5/www/app-service.js)

모두 우회 성공 — STR-001 (Jiagu Strings Leak) + DC-001 (39285EFA XOR) + JS string array 추출.

2. 메타데이터

항목 · 값

Application label · `HaaTalk` (logcat에서 추정 — manifest 라벨 미캡처)

Package · `com.corp.internal.calendar.sync` (**기업 캘린더 동기화 사칭**)

내부 UniApp ID · `__UNI__G2D047E5`

Version · 1.0.0 (versionCode 100)

Compile SDK · 35 (Android 15)

Target SDK · 34

Min SDK · 22

File size · 29.0 MB (Sxjoa/Anlei 패밀리의 16MB보다 큼)

MD5 · `DC64C87C17AB9523B3EBB1E4D4416856`

SHA256 · `85801139629A65D4A531E38E2766E109DB4BB9A464EFE027CE1A6B35E4A5C0D6`

3. 권한 분석 (드로퍼 능력 포함)

🔴 Critical (드로퍼 능력)

· INSTALL_PACKAGES ← 다른 APK 설치 권한 (드로퍼 명확 증거)

· REQUEST_INSTALL_PACKAGES (사용자 동의 기반 설치)

· MANAGE_EXTERNAL_STORAGE (전체 파일 시스템 접근)

· READ_PHONE_STATE (IMEI/디바이스 정보)

🟠 High (데이터 탈취)

· READ_EXTERNAL_STORAGE, READ_MEDIA_IMAGES, READ_MEDIA_VIDEO

· READ_MEDIA_VISUAL_USER_SELECTED (Android 14+ 신규 권한)

· CAMERA

OEM 권한 (한국에 일반적이지 않은 OEM 호환)

· com.huawei.android.launcher.permission.CHANGE_BADGE (Huawei)

· com.vivo.notification.permission.BADGE_ICON (Vivo)

· com.asus.msa.SupplementaryDID.ACCESS (Asus)

→ 한국 사용자뿐 아니라 중국 OEM 사용자도 동시 타겟. 광범위 배포 전략.

4. C2 인프라 (신규 발견)

메인 C2

URL · 출처 · 비고

**`[비공개] · app-service.js (obfuscated) · 영문 슬로건 = 금융 사기 / 코인 / 도박 위장 가능성

**`[비공개] · app-service.js · 비싼 단일 단어 도메인 — 운영자가 진짜 인수했거나 placeholder

`[비공개]` · classes.dex strings (부분) · 추가 도메인 (튜발루 .tv) — 검증 필요

`[비공개] · 39285EFA_unpacked.dex · China Unicom Cloud OAID SDK (광고 ID 추적)

API 경로 (JS에서 추출)

경로 · 추정 용도

`Uploads/api` · 메인 데이터 업로드

`Uploads/apiapps` · 설치 앱 목록 송출

`Uploads/apimap` · 매핑/위치 데이터

`api/Uploads/iosUpload` · **iOS 분기 업로드** (iOS 빌드 동시 운영)

`/Android/` · Android 전용 경로 prefix

의심 토큰

· 7ikS7jQP7j6qioYKKEYNGca (24자 영숫자) — base64 디코드 → 18 byte 원시 데이터, 또는 그대로 API 토큰. 추적 필요.

5. 보호 메커니즘 3중 + 우회 결과

Layer 1: 360 Jiagu 패킹 (Application stub)

· libjiagu*.so 4 ABI (assets/ 아래)

· classes.dex 9.4MB stub

· 우회: STR-001 적용 → strings에서 native lib 로딩 경로 (libjgdtc.so), fyv7 부분 도메인 발견

· 평가: stub만으론 비즈니스 로직 미노출 → Layer 2/3 우회 필요

Layer 2: 39285EFA XOR ab1234cd

· assets/39285EFA.dex (71,500 bytes, 암호화)

· lib/arm64-v8a/lib39285EFA.so (154KB, native lib)

· 우회: 기존 sxjoa entry의 decrypt_39285EFA.py 기법 그대로 적용 → DEX magic 64 65 78 0a 30 33 35 00 ("dex\n035") 확인, 복호화 성공

· 결과: OAID SDK (`[비공개]) 노출 — 광고/추적 SDK

Layer 3: JavaScript Obfuscator

· assets/apps/__UNI__G2D047E5/www/app-service.js (539KB) — 비즈니스 로직 본체

· 변수명 _0x4b6de6, _0x5d93f2 (16진 인덱스), 문자열 분산

· 우회: 평문 string array는 그대로 유지 — extract_js_strings.py (신규)로 의미있는 strings 분류 추출

· 결과: C2 URL, API 경로, 함수명, 의심 토큰 모두 노출

6. JavaScript 비즈니스 로직 인벤토리

데이터 수집 함수

함수 · 역할

`getContacts`, `getContactsWithDelayedRetry`, `getAddressBook` · 연락처 수집 (재시도 로직 포함)

`checkAndHandleContactsPermission`, `checkContactsPermissionSync` · 권한 확인 + 처리

`getPhotos`, `getPhotosWithPermission`, `getGalleryVideos` · 사진/영상

`checkLocationPermission` + `geolocation` · 위치

`checkSMSPermission`, `checkAndUploadNewSms` · SMS

`getUserLastSmsId`, `getUserStorageKey` · 증분 SMS 추적

`currentUserPhone` · 사용자 폰 번호

`getApiUrl` · C2 URL 동적 생성

`handleLogin` · 로그인 처리

갤러리 경로 인식 (OEM 별)

· MIUI/Gallery/Screenshots (Xiaomi)

· OPPO/Gallery

· ColorOS/Gallery (Oppo ColorOS)

· Flyme/Gallery (Meizu)

· PHPhotoLibrary (iOS)

→ iOS PhotoKit 클래스 참조 = iOS 빌드의 갤러리 접근 코드도 같은 JS bundle에 포함. 하나의 JS 코드베이스로 Android + iOS 동시 운영.

7. 다국어 위장 (다중 타겟 증거)

한국어 UI (23개)

"로그인", "권한 오류", "허용됨", "획득한 권한", "휴대폰 번호", "전화번호로 업로드:", "비디오", "이미지", "샘플 데이터:", "설정으로 이동", "앱 종료", "요청 성공:", "우체국", "유형:", "이미지 수", "디렉토리 스캔", "사용자", "총 개수", "Android 버전(", "찾음", "제", "(사용처: 기본값)" 등

일본어 UI

· "正しい招待コードを入力してください" ← "올바른 초대 코드를 입력해주세요"

· "有効な電話番号を入力してください" ← "유효한 전화번호를 입력해주세요"

중국어 운영자 메시지 (72개)

· "iOS平台不需要短信权限,跳过" (iOS는 SMS 권한 불필요)

· "应用进入后台,暂停短信监控" (앱 백그라운드, SMS 모니터링 일시정지)

· "开始初始化Android数据预获取流程" (Android 데이터 사전 획득 흐름 초기화)

· "实际通讯录权限状态:", "权限说明", "權限請求", "去設置", "未知路径"

· "短信内容上传失败:", "位置信息上传完成", "照片上传完成,成功上传"

· "應用無法繼續運行,請重啟並允許權限請求" (앱 동작 불가, 권한 허용 후 재실행)

명백한 결론

· 한국 + 일본 동시 타겟 — 다른 한국계 악성앱과 차별화

· 운영자 측은 중국어 — 다국어는 위장, 운영 인터페이스는 중국어

· iOS + Android 동시 빌드 인프라 — iosUpload API + PhotoKit 참조

8. 분석 기법 점검 (14.13 + 신규)

🔬 시도한 기법 (모두 성공)

기법 · 결과

**STR-001 Jiagu Strings Leak** · ✅ classes.dex에서 libjgdtc.so 경로, [비공개] 부분 도메인 추출

**DC-001 39285EFA XOR ab1234cd** · ✅ DEX magic 확인, OAID SDK 노출

**JS-001 JS String Array 추출 (신규)** · ✅ obfuscated app-service.js에서 C2, API, 함수명 전부 추출

**CLUSTER-001 Size-based Family** · ✅ 29MB 크기 = Sxjoa(16MB) 패밀리와 다름 확정

**14.5 strings 정규식 IOC** · ✅ extract_iocs.py 재사용

🆕 신규 기법: **JS-001 Obfuscated JS String Array Extraction**

원리: javascript-obfuscator 도구로 난독화된 JS는 변수명을 16진수 인덱스로 분산시키지만, 문자열 배열 본체는 평문으로 유지한다. 정규식 /'([^']{3,200})'/로 문자열 전체 추출 후, 도메인/URL/API 패턴별 분류로 핵심 IOC를 노출시킬 수 있다.

효과:

· DCloud UniApp/Weex/React Native 등 JS 기반 하이브리드 앱 분석에 즉시 적용

· AES 복호화 hook 없이도 90%+ IOC 확보

스크립트: apk/haatalk/extract_js_strings.py

⚠️ 한계

· JS의 동적 평가 (eval): 일부 C2 URL이 런타임에 조립될 수 있음. getApiUrl 함수의 실제 반환값은 동적 후크 필요.

· [비공개] 진위: 도메인이 실제 운영 중인지 미확인 (DNS/curl 확인 다음 단계).

· iOS 빌드 미확보: type=iosUpload 분기 존재하지만 iOS .ipa 파일 별도 확보 필요.

· 드로퍼 페이로드: INSTALL_PACKAGES 권한이 실제로 어떤 APK를 설치하는지 — 동적 분석 필요.

다음 시도

1. [비공개] 정찰: DNS resolution + HTTP probe + WHOIS

2. 드로퍼 행위 캡처: 에뮬레이터에서 권한 부여 후 추가 APK 다운로드 시도 캡처

3. 7ikS7jQP7j6qioYKKEYNGca 토큰 해석: base64 디코드 + 의미 추정

4. [비공개] 검증: 두 번째 C2 도메인 확정 (classes.dex strings의 부분 매칭이라 검증 필요)

9. 산출물

```

apk/haatalk/

├── HaaTalk.apk (29.0MB)

├── classes.dex (Jiagu stub 9.4MB)

├── 39285EFA.dex (XOR 암호화 71KB)

├── 39285EFA_unpacked.dex (XOR 복호화된 진짜 DEX 71KB)

├── app-service.js (DCloud 비즈니스 로직 539KB)

├── uni-app-view.umd.js (UI 352KB)

├── all.js (DCloud all 166KB)

├── uni-app-service.js (DCloud service 12KB)

├── weexUniJs.js (Weex 162KB)

├── do_decrypt.py (XOR 복호화)

├── extract_js_strings.py (JS-001 신규 — obfuscated string 추출)

├── deep_strings.py (정밀 strings 검색)

├── js_iocs.txt (JS 분석 결과)

└── haatalk_quantum_nano_analysis_report.md (본 문서)

```

10. 등록 메타데이터 (apps.json용)

· id: haatalk

· displayName: HaaTalk

· family: zero_to_million_operator (신규 명명)

· analysisLevel: static_deep → ml_complete (3중 보호 우회, 다국어/다플랫폼 증거 확정)

· threatLevel: extreme

· 신규 운영자 = Cluster 분리, 기존 패밀리와 cross-reference 없음

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