SFile-2 상세 분석 보고서

Sfile (sfile) 양자 나노 분석 보고서

분석 일자: 2026-02-26

보고서 버전: v2.0

분석 수행: 주식회사 아크링크 ([비공개])

1. Executive Summary

Sfile("S파일")은 WaveGrid Gen3 Pre-R8 v4-A' 패밀리에 속하는 악성 데이터 탈취 앱이다.

파일명에서 추출한 초대코드 NWH5, 배포 도메인 m.cloudon1.net으로 유통되었다.

C2 서버는 `[비공개], wolf([비공개])→SLS([비공개])→Sfile([비공개])로

이어지는 SL-060 C2 도메인 회전 패턴의 최신 변종이다.

핵심 발견: Sfile은 wolf/SLS와 동일한 com.example.sms 내부 패키지를 사용하면서도,

API 엔드포인트 네이밍이 완전히 변경되었다. 기존 flat path(/sms/, /photo, /contact)에서

webapp/ 네임스페이스 접두사(webapp/saveSms, webapp/image/, webapp/saveAddressBook)로

마이그레이션한 것은 동일 개발팀의 진행 중인 API 리팩토링을 증명한다. 이를 **SL-062 API Endpoint

Namespace Migration** 기법으로 명명한다.

versionCode 21145는 wolf(1), SLS(66)에 비해 극단적으로 높아, SL-061(빌드 번호 비상관) 패턴의

추가 증거이며, versionName 1.1.35는 SLS(1.1.16)보다 19 패치 이상 진행된 것을 의미한다.

위험도: CRITICAL — SMS/연락처/사진 탈취 + 5초 폴링 무한루프 + SEND_SMS 선언

2. 앱 기본 정보 (Smali 검증)

항목 · 값 · 출처

앱 이름 · S파일 (Sfile) · 스크린샷 + auto_analysis

외부 패키지 · [비공개] · AndroidManifest.xml

내부 패키지 · com.example.sms · 전 smali 파일

versionCode · 21145 · auto_analysis.json:21

versionName · 1.1.35 · auto_analysis.json:22

minSdk · 27 (Android 8.1) · auto_analysis.json:23

targetSdk · 32 (Android 12) · auto_analysis.json:24

SHA256 · b2dd2a110c2b2eb4913fa985f1b18af6b44d4f00fe3169a9e27395bac654e8e9 · auto_analysis.json:8

파일 크기 · 11,830,704 bytes (11.3MB) · auto_analysis.json:7

DEX 수 · 2 (classes.dex + classes2.dex) · auto_analysis.json:9

Smali 파일 수 · 7,469개 · apktool 디컴파일

R8 난독화 · 미적용 (Pre-R8) · 전체 클래스명 보존 확인

네이티브 라이브러리 · libscannative.so (arm64-v8a, armeabi-v7a) · auto_analysis.json:11-12

초대코드 · NWH5 · 파일명 추출

배포 도메인 · [비공개] · 파일명 추출

수집일 · 2024-11-10 · 파일명 타임스탬프 1732267875

패밀리 · wavegrid (Gen3 Pre-R8 v4-A') · 구조 분석

2.1 외부 vs 내부 패키지 이중 구조

Sfile의 외부 패키지 [비공개]은 의미 없는 랜덤 문자열로,

Google Play Store 정책을 회피하기 위한 위장이다. 실제 모든 비즈니스 로직은

com.example.sms 네임스페이스에 존재한다.

이 이중 구조는 wolf(kfeafs.zowjifasdf.opiawiegasd.zdnaoing),

SLS(kfeafs.zowjifasdf.opiawiegasd.zdnaoing과 동일 — 공유 패키지)와 같은 패턴이다.

2.2 MessengerUtils 액션명 불일치

AndroidManifest.xml의 MessengerUtils 서비스 액션:

```

[비공개].messenger

```

"Sile"은 "Sfile"의 오타 또는 의도적 변형이다. 이전 빌드에서 wolf는 다른 액션명을 사용했을 가능성이 높으며,

앱 이름에 맞게 수동으로 수정하는 과정에서 오타가 발생했다. 이는 수작업 빌드 변형의 증거다.

3. 권한 분석 (11개)

3.1 권한 전수 목록

# · 권한 · 위험도 · 실제 사용 (smali 검증)

1 · INTERNET · 일반 · ✅ OkHttp C2 통신 (HttpUtils.smali)

2 · READ_CONTACTS · 위험 · ✅ ReadContactUtils.getContact()

3 · READ_PHONE_STATE · 위험 · ✅ TelephonyManager.getLine1Number()

4 · READ_PHONE_NUMBERS · 위험 · ✅ 전화번호 수집 (UploadService:131)

5 · READ_EXTERNAL_STORAGE · 위험 · ✅ 앨범/사진 수집 (ReadContactUtils.getAlbum())

6 · READ_MEDIA_IMAGES · 위험 · ✅ Android 13+ 이미지 접근

7 · READ_MEDIA_AUDIO · 위험 · ⚠️ 잠재적 — 현재 코드에서 미사용

8 · READ_MEDIA_VIDEO · 위험 · ⚠️ 잠재적 — 현재 코드에서 미사용

9 · READ_SMS · 위험 · ✅ ReadContactUtils.getMsgs()

10 · SEND_SMS · 위험 · ❌ **SN-040 Reverse: 선언만, 사용 없음**

11 · ACCESS_NETWORK_STATE · 일반 · ✅ 네트워크 상태 확인

3.2 SN-040 Reverse 분석 (SEND_SMS)

android.permission.SEND_SMS는 AndroidManifest.xml에 선언되어 있으나,

com.example.sms 전체 smali를 검색한 결과 SmsManager나 sendTextMessage 호출이 없다.

이는 wolf/SLS에서도 확인된 동일 패턴으로, 두 가지 가설이 있다:

1. 미래 기능 예약: SMS 릴레이 기능이 서버 측에서 활성화될 수 있음

2. 빌드 템플릿 잔재: Gen3 Pre-R8 기본 템플릿에 포함된 권한이 제거되지 않음

3.3 권한 요청 2단계 체인

1단계 — LoginActivity.requestPermission() (line 127):

```smali

filled-new-array {v0, v1, v2, v3}, [Ljava/lang/String;

READ_SMS, READ_PHONE_NUMBERS, READ_PHONE_STATE, READ_CONTACTS

```

→ 4개 권한 (requestCode=0x64=100)

2단계 — UploadActivity.requestAllPermission() (line 154):

```smali

filled-new-array {v0, v1, v2, v3, v4}, [Ljava/lang/String;

READ_SMS, READ_PHONE_NUMBERS, READ_PHONE_STATE, READ_CONTACTS, READ_EXTERNAL_STORAGE

```

→ 5개 권한 (requestCode=0x64=100)

1단계에서 이미 획득한 4개 권한에 READ_EXTERNAL_STORAGE만 추가하여 2단계에서 재요청한다.

이는 사진 수집을 위한 별도 권한 획득 전략이다.

4. C2 서버 심층 분석

4.1 C2 URL (Smali 직접 추출)

HttpUtils.smali:7:

```smali

.field public static base_url:Ljava/lang/String; = "[비공개]

```

항목 · 값

프로토콜 · HTTP (비암호화)

도메인 · [비공개]

경로 · [비공개]

포트 · 80 (기본값)

TLS · 없음

4.2 SL-060 C2 도메인 회전 (확장)

Sfile은 love19.store를 사용하며, Gen3 Pre-R8 패밀리의 C2 도메인 회전 궤적에서

가장 최신 변종 중 하나이다:

# · 앱 · C2 도메인 · TLD · 특징

1 · wolf · [비공개] · .website · 초기 도메인

2 · SLS · [비공개] · .website · 정수 접미사 추가

3 · Sfile · [비공개] · .store · **완전 리브랜딩**

love19.store는:

· zcloud → love19로 브랜드 변경

· .website → .store로 TLD 변경

· "love"라는 연애/데이팅 앱 위장 키워드 사용

· SLS 배포 도메인([비공개])과 "love19" 접두사를 공유

4.3 [비공개] 서버 프레임워크

`[비공개] 경로는 RuoYi 프레임워크의 기본 프로덕션 API 프리픽스다.

wolf/SLS/Sfile 모두 동일한 서버 인프라를 사용하고 있으며,

이는 단일 공격 그룹이 동일 백엔드를 운영하고 있음을 의미한다.

4.4 HTTP 평문 통신 취약점

love19.store와의 통신은 HTTP(비암호화)로, Android 9+ 기본 cleartext 차단 정책에

대응하기 위해 network_security_config.xml이 사용된다:

```xml

android:networkSecurityConfig="@xml/network_security_config"

```

이는 MITM(Man-in-the-Middle) 공격에 취약하며, 중간 네트워크 장비에서

탈취 데이터를 가로챌 수 있다. 역설적으로, 보안 연구 관점에서는 트래픽 분석이 용이하다.

5. API 엔드포인트 심층 분석 (Smali 검증)

5.1 엔드포인트 전수 목록

# · 엔드포인트 · 메서드 · 호출 위치 (smali) · 목적

1 · `webapp/login` · GET · LoginActivity:74 · 초대코드 인증

2 · `webapp/saveSms` · POST · UploadActivity$7:52, UploadService$3:52 · SMS 데이터 업로드

3 · `webapp/saveAddressBook` · POST · UploadActivity$6:52 · 연락처 데이터 업로드

4 · `webapp/image/` · POST · UploadActivity$5$1:112 · 사진 파일 업로드

5.2 SL-062 API Endpoint Namespace Migration (신규 기법)

발견: Sfile의 API 엔드포인트 명명 체계가 wolf/SLS와 완전히 다르다.

기능 · wolf/SLS (구형) · Sfile (신형) · 변경 유형

인증 · `webapp/login` · `webapp/login` · 동일

SMS · `/sms/` 계열 · `webapp/saveSms` · 네임스페이스 추가

사진 · `/photo` · `webapp/image/` · 네임스페이스 + 이름 변경

연락처 · `/contact` 계열 · `webapp/saveAddressBook` · 네임스페이스 + 이름 변경

분석:

· 모든 엔드포인트가 webapp/ 접두사를 사용하도록 통일

· 엔드포인트 이름이 camelCase 동사+명사 패턴으로 정규화 (saveSms, saveAddressBook)

· 이는 서버 측 API 리팩토링을 반영하며, 동일 개발팀이 코드베이스를 적극적으로 관리하고 있음을 증명

· wolf/SLS는 webapp/login만 webapp/ 접두사 → Sfile에서 전면 확장

의의: 이 기법은 정적 시그니처 기반 탐지를 우회하는 효과가 있다.

/sms/를 탐지하는 규칙이 webapp/saveSms를 놓치게 된다.

5.3 webapp/login — GET 인증 (LoginActivity:60-117)

```smali

const-string v1, "webapp/login"

StringBuilder로 base_url + "webapp/login" 결합

Request.Builder → .url(url) → .build() (POST 없음 = GET)

OkHttpClient.newCall().enqueue(LoginActivity$2 콜백)

```

특이점: POST가 아닌 GET으로 인증 수행. 초대코드가 URL 파라미터로 전달되는 구조.

이는 서버 로그에 초대코드가 평문으로 기록됨을 의미한다.

5.4 webapp/saveSms — POST (이중 호출)

1. UploadActivity$7 (사용자 트리거): 사용자가 "동기화" 버튼 클릭 시

2. UploadService$3 (자동 트리거): 5초 폴링 타이머에 의해 자동 호출

전송 페이로드:

```json

{

> [비공개]

"bjPhone": "<전화번호>",

"content": "<SMS JSON 배열>"

}

```

5.5 webapp/saveAddressBook — POST (연락처)

UploadActivity$6에서 호출. 전송 페이로드:

```json

{

> [비공개]

"model": "android",

"bjPhone": "<전화번호>",

"operatorName": "<통신사명>",

"phoneContent": "<연락처 JSON 배열>"

}

```

특이점: operatorName 필드가 추가됨 — wolf/SLS에서는 확인되지 않은 신규 필드.

ReadContactUtils.getOperatorName()으로 통신사(SKT, KT, LGU+ 등)를 수집한다.

5.6 webapp/image/ — POST (사진)

UploadActivity$5$1에서 postFile()로 호출. Luban 라이브러리로 압축 후 전송:

```smali

invoke-static {v2}, Ltop/zibin/luban/Luban;->with(Landroid/content/Context;)Ltop/zibin/luban/Luban$Builder;

```

MediaType: image/* → application/octet-stream 혼용 (코드 레벨 불일치)

6. 데이터 수집 구조 (4채널)

6.1 채널 구조

CH · 데이터 · 수집 메서드 · API · 전송 방식

CH-1 · SMS · ReadContactUtils.getMsgs() · webapp/saveSms · JSON POST

CH-2 · 사진 · ReadContactUtils.getAlbum() · webapp/image/ · MultipartBody

CH-3 · 연락처 · ReadContactUtils.getContact() · webapp/saveAddressBook · JSON POST

CH-4 · 전화번호 · TelephonyManager.getLine1Number() · (CH-1,3에 내장) · bjPhone 필드

6.2 wolf/SLS 대비 구조적 차이

항목 · wolf/SLS · Sfile

SMS 엔드포인트 · /sms/ · webapp/saveSms

연락처 엔드포인트 · /contact · webapp/saveAddressBook

사진 엔드포인트 · /photo · webapp/image/

통신사 수집 · 미확인 · ✅ operatorName 필드

이미지 압축 · 직접 업로드 · Luban 라이브러리 압축

인증 · webapp/login GET · webapp/login GET (동일)

6.3 UploadActivity의 3버튼 UI

UploadActivity는 사용자에게 데이터 동기화를 유도하는 UI를 제공:

· btn_sms — SMS 동기화 (getSmsDataUpload())

· btn_contact — 연락처 동기화 (getContactDataUpload())

· btn_album — 앨범 동기화 (getAlbumDataUpload())

· btn_sync — 전체 동기화

각 버튼에 대응하는 requestCode:

· smsP = 0x65 (101)

· contactP = 0x66 (102)

· albumP = 0x6a (106)

7. UploadService 분석 (5초 폴링)

7.1 CountDownTimer 무한 루프

UploadService.smali:188-206:

```smali

const-wide/16 v2, 0x1388 # 5000ms = 5초

const-wide/16 v4, 0x3e8 # 1000ms = 1초 tick

invoke-direct/range {v0 .. v5}, Lcom/example/sms/servise/UploadService$2;-><init>(...)

```

CountDownTimer(5000, 1000) — 5초 카운트다운 후 onFinish()에서:

1. SMS 데이터 수집 (getMsgs())

2. C2 서버 전송 (webapp/saveSms)

3. 타이머 재시작 → 무한 루프

7.2 onStartCommand 반환값

```smali

.method public onStartCommand(Landroid/content/Intent;II)I

const/4 p1, 0x1 # START_STICKY

return p1

```

START_STICKY = 시스템이 서비스를 죽여도 자동 재시작.

5초 폴링과 결합하여, 기기가 켜져 있는 한 지속적으로 SMS를 탈취한다.

7.3 서비스 시작 흐름

1. LoginActivity → 초대코드 인증 성공

2. startMain() → UploadActivity 시작

3. UploadActivity → UploadService 시작

4. UploadService.onCreate() → countDown() 호출

5. 5초마다 getSmsDataUpload() → webapp/saveSms POST → 무한 반복

8. LoginActivity 심층 분석

8.1 인증 흐름

1. 사용자가 초대코드 입력 (et_code EditText)

2. LoginActivity$1 (OnClickListener) → login() 호출

3. webapp/login GET 요청 (비동기 enqueue)

4. LoginActivity$2 콜백에서 응답 처리

5. 성공 시: SPUtils.put("is_first", true) → UploadActivity로 이동

8.2 uploadImgnew() 죽은 코드 (LoginActivity:183-319)

```smali

const-string v2, "" # 빈 URL!

invoke-virtual {v1, v2}, Lokhttp3/Request$Builder;->url(Ljava/lang/String;)Lokhttp3/Request$Builder;

```

LoginActivity에 uploadImgnew() 메서드가 있으나, URL이 빈 문자열("")로 설정되어 있다.

이는 죽은 코드(dead code)이며, 이전 빌드에서 사용하던 기능의 잔재로 보인다.

실제 이미지 업로드는 UploadActivity$5$1에서 webapp/image/ 엔드포인트를 통해 수행된다.

8.3 UUID 생성

LoginActivity에 uuid 필드가 있으며, LoginActivity$1$1에서 사용된다.

이는 기기 고유 식별자 생성에 사용될 가능성이 있다.

9. versionCode 21145 분석 (SL-061 확장)

9.1 빌드 번호 비교

앱 · versionCode · versionName · R8 · 패밀리

wolf · 1 · 1.0 · No · Gen3 Pre-R8

SLS · 66 · 1.1.16 · No · Gen3 Pre-R8

**Sfile** · **21145** · **1.1.35** · **No** · **Gen3 Pre-R8**

9.2 SL-061 확장 분석

versionCode 21145의 의미:

1. 빌드 번호 인플레이션: 1 → 66 → 21145는 지수적 증가가 아닌 무작위 점프

2. 빌드 시스템 변경 가능성: CI/CD 파이프라인에서 자동 생성되는 빌드 번호일 수 있음

3. 21145의 잠재적 의미: 2024년 11월 45일차? 날짜 기반 빌드 번호 (241145→21145)로는 불가능

4. R8 미적용은 불변: versionCode가 21145까지 올라갔음에도 R8 난독화가 여전히 미적용

9.3 versionName 1.1.35 분석

SLS(1.1.16) → Sfile(1.1.35)는 19 패치 이상의 차이를 보인다.

이는 두 앱 사이에 최소 19회의 마이너 업데이트가 있었음을 시사하며,

활발한 개발 활동의 증거다.

10. 방어기제 분석

10.1 탐지된 방어기제

# · 기제 · 상태 · 증거

1 · 패키지명 위장 · 활성 · 외부=[비공개], 내부=com.example.sms

2 · network_security_config · 활성 · cleartext HTTP 허용

3 · 에뮬레이터 감지 (추정) · 부분 · ANR 발생 — 에뮬레이터 환경에서 지연

4 · R8 미적용 · - · 난독화 없음 (의도적 또는 개발 단계)

5 · 앱 이름 위장 · 활성 · "S파일" — 파일 관리 앱으로 위장

6 · SEND_SMS 예약 · 대기 · SN-040 — 미래 기능 활성화 가능

10.2 에뮬레이터 환경 ANR

Sfile은 에뮬레이터(DeepCoding_API35)에서 실행 시 즉시 ANR(Application Not Responding)을 발생시켰다.

가능한 원인:

1. 블랜크유틸(BlankJ UtilCode)의 DeviceUtils: 에뮬레이터 감지 루틴이 메인 스레드를 차단

2. Huawei HMS ScanKit 초기화: HMS 서비스가 에뮬레이터에서 응답 지연

3. 네트워크 요청 메인 스레드 실행: NetworkOnMainThreadException은 아니지만, 동기 호출 지연

스크린샷에서 "Process system isn't responding" 다이얼로그가 확인되었으며,

이는 앱 자체가 아닌 시스템 프로세스의 ANR이다. 이는 앱이 시스템 리소스를 과도하게

사용하고 있을 가능성을 시사한다.

11. 네트워크 보안 분석

11.1 HTTP 평문 통신

모든 C2 통신이 HTTP(비암호화)로 수행된다:

· `[비공개] — 초대코드 평문 전송

· `[비공개] — SMS 내용 평문 전송

· `[비공개] — 연락처 평문 전송

· `[비공개] — 사진 평문 전송

11.2 SSL Pinning 부재

OkHttpClient가 기본 생성자로 초기화되며(new OkHttpClient()),

SSL 인증서 고정(pinning)이 없다. MITM 프록시 도구(Burp Suite, mitmproxy)로

모든 트래픽을 가로채고 분석할 수 있다.

11.3 JSON 직렬화

FastJSON(com.alibaba.fastjson.JSONObject)을 사용하여 데이터를 직렬화한다:

```smali

invoke-static {v1}, Lcom/alibaba/fastjson/JSONObject;->toJSONString(Ljava/lang/Object;)Ljava/lang/String;

```

FastJSON의 알려진 취약점(CVE-2022-25845 등)이 있으며,

서버 측에서도 FastJSON으로 역직렬화한다면 RCE 가능성이 있다.

12. 취약점 분석

# · 취약점 · 심각도 · 설명

1 · HTTP 평문 통신 · HIGH · 모든 데이터가 암호화 없이 전송

2 · SSL Pinning 부재 · HIGH · MITM 공격 완전 노출

3 · UploadService exported=true · MEDIUM · 외부 앱이 서비스 시작 가능

4 · FastJSON 사용 · MEDIUM · 알려진 역직렬화 취약점

5 · 빈 URL 죽은 코드 · LOW · LoginActivity.uploadImgnew()에서 빈 URL

12.1 UploadService exported=true

```xml

<service android:exported="true" android:name="com.example.sms.servise.UploadService">

```

이 서비스는 exported="true"로 설정되어, 어떤 앱이든 이 서비스를 시작할 수 있다.

악의적인 앱이 의도적으로 UploadService를 시작하여 데이터 탈취를 유발할 수 있다.

13. 라이브러리 의존성 분석

라이브러리 · 용도 · 특이점

OkHttp3 · HTTP 통신 · C2 서버 통신 전담

Alibaba FastJSON · JSON 직렬화 · SMS/연락처 데이터 변환

Google Gson · JSON 처리 · postGson()에서 사용 (이중 JSON 라이브러리)

Luban · 이미지 압축 · 사진 업로드 전 압축 처리

PictureSelector (com.luck.picture) · 사진 선택 · 갤러리 접근 UI

BlankJ UtilCode · 유틸리티 · DeviceUtils, EncryptUtils 등

Huawei HMS ScanKit · QR 코드 스캔 · 초대코드 QR 입력 용도 추정

Huawei ML Kit · 머신러닝 · 카메라/이미지 처리

Glide (Bumptech) · 이미지 로딩 · 썸네일 표시

AndroidX · 기반 프레임워크 · AppCompatActivity 등

13.1 이중 JSON 라이브러리 (FastJSON + Gson)

Sfile은 FastJSON과 Gson을 동시에 사용한다:

· Gson: HttpUtils.postGson()에서 GsonBuilder().disableHtmlEscaping() 사용

· FastJSON: UploadActivity/UploadService에서 JSONObject.toJSONString() 사용

이는 코드베이스가 점진적으로 발전했음을 보여주며,

초기에 Gson을 사용하다가 FastJSON으로 마이그레이션했지만 완전히 전환하지 않은 것이다.

14. IOC (Indicators of Compromise)

14.1 해시

· SHA256: b2dd2a110c2b2eb4913fa985f1b18af6b44d4f00fe3169a9e27395bac654e8e9

14.2 도메인

· C2: [비공개]

· 배포: [비공개]

14.3 URL

· `[비공개]

· `[비공개]

· `[비공개]

· `[비공개]

14.4 패키지

· [비공개] (외부)

· com.example.sms (내부)

14.5 파일

· classes.dex, classes2.dex

· lib/arm64-v8a/libscannative.so

· lib/armeabi-v7a/libscannative.so

14.6 네트워크 시그니처

· HTTP POST to */webapp/saveSms with JSON body containing "userName", "bjPhone", "content"

· HTTP POST to */webapp/saveAddressBook with JSON body containing "userName", "bjPhone", "phoneContent", "operatorName"

· HTTP GET to */webapp/login

15. 탐지 규칙

15.1 YARA 규칙

```yara

rule WaveGrid_Gen3_Sfile {

meta:

description = "WaveGrid Gen3 Pre-R8 Sfile variant"

author = "ArkLink Deep-Coding Lab"

date = "2026-02-26"

strings:

$c2 = "[비공개]" ascii

$api1 = "webapp/saveSms" ascii

$api2 = "webapp/saveAddressBook" ascii

$api3 = "webapp/image/" ascii

$pkg = "com.example.sms" ascii

$key1 = "bjPhone" ascii

$key2 = "operatorName" ascii

condition:

$c2 and $pkg and any of ($api*)

}

```

15.2 Snort 규칙

```

alert http $HOME_NET any -> $EXTERNAL_NET any (

msg:"WaveGrid Gen3 Sfile C2 Communication";

content:"[비공개]"; http_host;

content:"webapp/save"; http_uri;

sid:202-**-**; rev:1;

)

```

16. 포렌식 아티팩트

위치 · 아티팩트 · 설명

SharedPreferences · is_first=true · 최초 실행 후 인증 완료 표시

SharedPreferences · invite_code=NWH5 · 사용된 초대코드

/data/data/[비공개] · 앱 데이터 · 캐시된 사진, SMS 복사본

Logcat · TAG="TAG" · HttpUtils.postGson() 로그

17. 동적 분석 결과

17.1 에뮬레이터 실행

· 환경: DeepCoding_API35 (API 35, x86_64)

· 설치: 성공 (adb install)

· 실행: LoginActivity 표시 성공

· UI: "S파일" 로고 + "초대코드를 입력해주세요" 입력 필드

· ANR: "Process system isn't responding" — 에뮬레이터 환경에서 시스템 부하

· 스크린샷: screenshot_launch.png 캡처 성공

17.2 logcat 캡처

logcat_launch.txt (108,386줄) 캡처 완료. 주요 분석 대상:

· UploadService 시작 여부

· C2 서버 연결 시도

· 권한 요청 흐름

18. 대역폭 분석

18.1 전송 데이터 추정

채널 · 데이터 크기 (예상) · 빈도

SMS · 50-500KB/회 (대화량 의존) · 5초마다 (UploadService)

연락처 · 10-100KB/회 · 사용자 트리거

사진 · 100KB-2MB/장 (Luban 압축) · 사용자 트리거

전화번호 · <1KB · 매 전송마다 포함

18.2 일일 데이터 소모

5초 폴링 기준:

· 24시간 = 17,280회 전송 시도

· SMS 데이터가 변하지 않아도 매번 전체 재전송

· 예상 일일 소모: 100MB-1GB (SMS 양에 따라)

19. Gen3 Pre-R8 패밀리 진화 분석

19.1 wolf → SLS → Sfile 진화 트리

```

wolf (vCode=1, vName=1.0)

├─ C2: [비공개]

├─ API: /sms/, /photo, /contact (flat)

└─ 배포: [비공개]

SLS (vCode=66, vName=1.1.16)

├─ C2: [비공개] (정수 접미사)

├─ API: /sms/, /photo, /contact (flat, 동일)

└─ 배포: [비공개]

Sfile (vCode=21145, vName=1.1.35)

├─ C2: [비공개] (완전 리브랜딩)

├─ API: webapp/* (네임스페이스 마이그레이션!)

├─ 배포: [비공개]

└─ 신규: operatorName 수집, Luban 압축

```

19.2 진화의 방향성

1. C2 도메인: 점진적 변경 → 완전 리브랜딩

2. API 구조: flat path → 네임스페이스 표준화 (webapp/)

3. 데이터 수집: 기본 3채널 유지 + operatorName 추가

4. 이미지 처리: 직접 업로드 → Luban 압축 후 업로드 (대역폭 최적화)

5. R8: 끝까지 미적용 (일관된 특징)

20. auto_analysis.json 교정

항목 · auto_analysis 값 · Smali 검증값 · 판정

C2 서버 · [비공개] (정확) · [비공개] · ✅ 일치

로그인 엔드포인트 · 미명시 · webapp/login (GET) · 추가

SMS 엔드포인트 · 미명시 · webapp/saveSms (POST) · 추가

연락처 엔드포인트 · 미명시 · webapp/saveAddressBook (POST) · 추가

사진 엔드포인트 · 미명시 · webapp/image/ (POST) · 추가

invitation_code · true (정확) · NWH5 (파일명) · ✅

versionCode · 21145 (정확) · 21145 · ✅

21. 교차 참조 (Cross-Reference)

21.1 동일 패밀리 비교

특성 · wolf · SLS · Sfile

내부 패키지 · com.example.sms · com.example.sms · com.example.sms

R8 · No · No · No

Smali 파일 수 · 7,469 · 7,469 · 7,469

C2 프레임워크 · RuoYi · RuoYi · RuoYi

인증 · GET webapp/login · GET webapp/login · GET webapp/login

JSON 라이브러리 · FastJSON+Gson · FastJSON+Gson · FastJSON+Gson

UploadService · 5초 폴링 · 5초 폴링 · 5초 폴링

SEND_SMS · 선언, 미사용 · 선언, 미사용 · 선언, 미사용

operatorName · 미확인 · 미확인 · ✅ 신규

21.2 Sfile의 고유 특징

1. versionCode 21145 — 패밀리 내 최고 빌드 번호

2. webapp/ 네임스페이스 — API 리팩토링 최신 상태

3. operatorName 수집 — 통신사 정보 추가 수집

4. Luban 압축 — 이미지 업로드 최적화

5. [비공개] 배포 — 클라우드 서비스 위장 도메인

22. 🔬 기법 점검

22.1 시도한 기법

코드 · 기법명 · 결과

SN-040 · SEND_SMS Reverse · ✅ 선언-미사용 패턴 확인

QN-038 · Pre-R8 구조 분석 · ✅ 7,469 smali, 전체 클래스명 보존

WF-059 · Gen3 패밀리 식별 · ✅ com.example.sms + 동일 구조

SL-060 · C2 도메인 회전 · ✅ [비공개] — zcloud→love 리브랜딩

SL-0

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