버전: v1.0
분석 일자: 2026-05-23
대상: 260312_HaaTalk.APK (29.0 MB)
위협 등급: 🔴🔴 Extreme+ (드로퍼 능력 + 다국어 다중 타겟)
패밀리: 새로운 패밀리 — zero-to-million / 2025 운영자 (이전 미식별)
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 추출.
항목 · 값
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`
· INSTALL_PACKAGES ← 다른 APK 설치 권한 (드로퍼 명확 증거)
· REQUEST_INSTALL_PACKAGES (사용자 동의 기반 설치)
· MANAGE_EXTERNAL_STORAGE (전체 파일 시스템 접근)
· READ_PHONE_STATE (IMEI/디바이스 정보)
· READ_EXTERNAL_STORAGE, READ_MEDIA_IMAGES, READ_MEDIA_VIDEO
· READ_MEDIA_VISUAL_USER_SELECTED (Android 14+ 신규 권한)
· CAMERA
· com.huawei.android.launcher.permission.CHANGE_BADGE (Huawei)
· com.vivo.notification.permission.BADGE_ICON (Vivo)
· com.asus.msa.SupplementaryDID.ACCESS (Asus)
→ 한국 사용자뿐 아니라 중국 OEM 사용자도 동시 타겟. 광범위 배포 전략.
URL · 출처 · 비고
**`[비공개] · app-service.js (obfuscated) · 영문 슬로건 = 금융 사기 / 코인 / 도박 위장 가능성
**`[비공개] · app-service.js · 비싼 단일 단어 도메인 — 운영자가 진짜 인수했거나 placeholder
`[비공개]` · classes.dex strings (부분) · 추가 도메인 (튜발루 .tv) — 검증 필요
`[비공개] · 39285EFA_unpacked.dex · China Unicom Cloud OAID SDK (광고 ID 추적)
경로 · 추정 용도
`Uploads/api` · 메인 데이터 업로드
`Uploads/apiapps` · 설치 앱 목록 송출
`Uploads/apimap` · 매핑/위치 데이터
`api/Uploads/iosUpload` · **iOS 분기 업로드** (iOS 빌드 동시 운영)
`/Android/` · Android 전용 경로 prefix
· 7ikS7jQP7j6qioYKKEYNGca (24자 영숫자) — base64 디코드 → 18 byte 원시 데이터, 또는 그대로 API 토큰. 추적 필요.
· libjiagu*.so 4 ABI (assets/ 아래)
· classes.dex 9.4MB stub
· 우회: STR-001 적용 → strings에서 native lib 로딩 경로 (libjgdtc.so), fyv7 부분 도메인 발견
· 평가: stub만으론 비즈니스 로직 미노출 → Layer 2/3 우회 필요
· 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
· assets/apps/__UNI__G2D047E5/www/app-service.js (539KB) — 비즈니스 로직 본체
· 변수명 _0x4b6de6, _0x5d93f2 (16진 인덱스), 문자열 분산
· 우회: 평문 string array는 그대로 유지 — extract_js_strings.py (신규)로 의미있는 strings 분류 추출
· 결과: C2 URL, API 경로, 함수명, 의심 토큰 모두 노출
함수 · 역할
`getContacts`, `getContactsWithDelayedRetry`, `getAddressBook` · 연락처 수집 (재시도 로직 포함)
`checkAndHandleContactsPermission`, `checkContactsPermissionSync` · 권한 확인 + 처리
`getPhotos`, `getPhotosWithPermission`, `getGalleryVideos` · 사진/영상
`checkLocationPermission` + `geolocation` · 위치
`checkSMSPermission`, `checkAndUploadNewSms` · SMS
`getUserLastSmsId`, `getUserStorageKey` · 증분 SMS 추적
`currentUserPhone` · 사용자 폰 번호
`getApiUrl` · C2 URL 동적 생성
`handleLogin` · 로그인 처리
· MIUI/Gallery/Screenshots (Xiaomi)
· OPPO/Gallery
· ColorOS/Gallery (Oppo ColorOS)
· Flyme/Gallery (Meizu)
· PHPhotoLibrary (iOS)
→ iOS PhotoKit 클래스 참조 = iOS 빌드의 갤러리 접근 코드도 같은 JS bundle에 포함. 하나의 JS 코드베이스로 Android + iOS 동시 운영.
"로그인", "권한 오류", "허용됨", "획득한 권한", "휴대폰 번호", "전화번호로 업로드:", "비디오", "이미지", "샘플 데이터:", "설정으로 이동", "앱 종료", "요청 성공:", "우체국", "유형:", "이미지 수", "디렉토리 스캔", "사용자", "총 개수", "Android 버전(", "찾음", "제", "(사용처: 기본값)" 등
· "正しい招待コードを入力してください" ← "올바른 초대 코드를 입력해주세요"
· "有効な電話番号を入力してください" ← "유효한 전화번호를 입력해주세요"
· "iOS平台不需要短信权限,跳过" (iOS는 SMS 권한 불필요)
· "应用进入后台,暂停短信监控" (앱 백그라운드, SMS 모니터링 일시정지)
· "开始初始化Android数据预获取流程" (Android 데이터 사전 획득 흐름 초기화)
· "实际通讯录权限状态:", "权限说明", "權限請求", "去設置", "未知路径"
· "短信内容上传失败:", "位置信息上传完成", "照片上传完成,成功上传"
· "應用無法繼續運行,請重啟並允許權限請求" (앱 동작 불가, 권한 허용 후 재실행)
· 한국 + 일본 동시 타겟 — 다른 한국계 악성앱과 차별화
· 운영자 측은 중국어 — 다국어는 위장, 운영 인터페이스는 중국어
· iOS + Android 동시 빌드 인프라 — iosUpload API + PhotoKit 참조
기법 · 결과
**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 재사용
원리: 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의 부분 매칭이라 검증 필요)
```
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 (본 문서)
```
· 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