냥톡 (Nyangtalk) 상세 분석 보고서

nyang.apk (냥톡) 악성앱 기술 분석 보고서

분석일: 2026-02-09 ~ 2026-02-14

분석자: 주식회사 아크링크 (Deep-Coding 보안연구소)

분석 목적: 피싱/스미싱 [피해자 정보 비공개] 위한 악성앱 기술 분석

보고서 버전: v3.0 (ML Gold Standard)

분류 코드: DC-MAL-2026-NYANG

Executive Summary

냥톡(nyang.apk)은 Wavegrid 패밀리 3세대(Gen3) SMS 수집형 악성앱으로, 로맨스 스캠을 통해 유포되는 몸캠피싱 도구입니다. com.smartbee.autohelper라는 자동화 도우미 앱으로 위장하며, 내부에는 com.xyx.sms 패키지로 구성된 악성 코어가 존재합니다.

핵심 위협: 연락처 + SMS + 사진/동영상/오디오를 동시 탈취하며, SMS는 5초 간격 CountDownTimer로 실시간 지속 수집합니다. HTTP 평문 통신으로 모든 탈취 데이터가 암호화 없이 전송됩니다.

고유 발견: 5개의 신규 기법(T001, T048~T051)이 식별되었으며, 특히 T049(READ_SMS Manifest 미선언)와 T051(CountDownTimer 자기 재생성 무한 루프)은 이 변종의 시그니처 특성입니다.

1. 앱 기본 정보

1.1 식별 정보

항목 · 내용

**파일명** · nyang.apk

**앱 이름** · 냥톡 (Nyangtalk)

**패키지명** · `com.smartbee.autohelper` (위장)

**내부 패키지** · `com.xyx.sms` (악성 코어)

**버전명** · 10.0.1

**버전 코드** · 10000

**Min SDK** · 26 (Android 8.0 Oreo)

**Target SDK** · 32 (Android 12L)

**Compile SDK** · 34 (Android 14)

**파일 크기** · 약 3.1 MB

**프레임워크** · Native Android (Java)

**빌드 도구** · R8 컴파일러 (난독화 적용)

**패밀리** · Wavegrid Gen3 (RuoYi C2 기반)

**위협 수준** · **HIGH**

**우회 상태** · 성공 (`Result/nyang_new.apk`)

**총 클래스 수** · 3,505 (smali/ 디렉토리 기준)

1.2 패키지 이중 구조 분석

이 앱은 정교한 이중 패키지 구조를 사용하여 정체를 은폐합니다.

구분 · 패키지명 · 용도 · 근거

**Manifest 패키지** · `com.smartbee.autohelper` · Google Play 검사 회피용 위장 · `AndroidManifest.xml:1`

**악성 코어 패키지** · `com.xyx.sms` · 실제 악성 로직 전부 포함 · `smali/com/xyx/sms/` 디렉토리

위장 전략 분석:

· "smartbee" -- 스마트한 꿀벌이라는 긍정적 이미지

· "autohelper" -- 자동화 도우미라는 합법적 앱 가장

· 실제 com.xyx.sms는 "xyz"의 변형으로 무의미한 식별자

· sms 서브패키지명이 SMS 탈취라는 핵심 목적을 노출

```

근거: AndroidManifest.xml

package="com.smartbee.autohelper" ← 위장 패키지

android:name="com.xyx.sms.MyApplication" ← 실제 Application 클래스

```

1.3 Wavegrid 세대 분류

냥톡은 Wavegrid 패밀리의 진화 계보에서 Gen3에 해당합니다.

세대 · 대표 앱 · 언어 · 프로토콜 · SMS · 방어기제 · C2 프레임워크

**Gen1** · ML (YLOVE) · Kotlin · HTTPS · 없음 · 에뮬레이터 탐지 · RuoYi

**Gen1.5** · QF · Kotlin + DataStore · HTTPS · 코드 존재/미사용 · 없음 · RuoYi

**Gen2** · CherryTalk · Kotlin · HTTPS · 없음 · 없음 · RuoYi

**Gen3** · **nyang**, Flirting_138, ze, zine · Java · **HTTP** · **활성** · **전무** · RuoYi

Gen3 특이점:

· Kotlin에서 Java로의 역행적 언어 전환

· HTTPS에서 HTTP로의 보안 수준 하락

· SMS 수집이라는 기능 확장

· 방어기제 완전 제거

이는 공격자 그룹이 대량 배포 + 기능 확장 전략을 채택하여, 보안보다 배포 속도와 데이터 수집 범위를 우선시했음을 시사합니다.

1.4 AndroidManifest.xml 컴포넌트 구조

```xml

<!-- 근거: AndroidManifest.xml 전문 -->

<application

android:allowBackup="true"

android:name="com.xyx.sms.MyApplication"

android:networkSecurityConfig="@xml/network_security_config">

<!-- LAUNCHER: 초대코드 입력 화면 -->

<activity android:exported="true"

android:name="com.xyx.sms.LoginActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

<!-- 권한 요청 + 데이터 수집 화면 -->

<activity android:name="com.xyx.sms.UploadActivity"/>

<!-- 백그라운드 SMS 수집 서비스 -->

<service android:exported="true"

android:name="com.xyx.sms.servise.UploadService">

<intent-filter android:priority="1000">

<action android:name="com.xyx.sms.UploadService"/>

</intent-filter>

</service>

<!-- PictureSelector 이미지 라이브러리 Provider -->

<provider android:authorities="com.smartbee.autohelper.luckProvider"

android:name="com.luck.picture.lib.basic.PictureFileProvider"/>

<!-- BlankJ 유틸리티 -->

<provider android:authorities="com.smartbee.autohelper.utilcode.fileprovider"

android:name="com.blankj.utilcode.util.UtilsFileProvider"/>

</application>

```

보안 취약점 발견:

취약점 · 위치 · 위험도 · 설명

`exported="true"` on UploadService · `AndroidManifest.xml:26` · 높음 · 외부 앱이 악성 서비스를 직접 실행 가능

`priority="1000"` on UploadService · `AndroidManifest.xml:27` · 중간 · 최우선 순위로 Intent 수신, 시스템 서비스 간섭 가능

`allowBackup="true"` · `AndroidManifest.xml:18` · 중간 · adb backup으로 앱 데이터(UUID, 초대코드) 추출 가능

"servise" 오타 · `AndroidManifest.xml:26` · 정보 · "service"가 아닌 "servise" -- 비영어권 개발자 지표

2. 권한 분석

2.1 요청 권한 목록 (8개: 1 일반 + 7 위험)

```xml

<!-- 근거: AndroidManifest.xml:2-9 -->

<uses-permission android:name="android.permission.INTERNET"/> <!-- 일반 -->

<uses-permission android:name="android.permission.READ_CONTACTS"/> <!-- 위험 -->

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 위험 -->

<uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/> <!-- 위험 -->

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!-- 위험 -->

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <!-- 위험 -->

<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/> <!-- 위험 -->

<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/> <!-- 위험 -->

```

2.2 권한별 위협 분석

권한 · 위험도 · 코드 내 사용 위치 · 탈취 데이터 · 피해 시나리오

`READ_CONTACTS` · **극심** · `UploadActivity.smali:654` `ContactsContract.Phone.CONTENT_URI` · 전화번호부 전체 · 주변인 연쇄 협박. 피해자의 모든 연락처(이름+번호)가 공격자에게 전달되어, "당신의 지인에게 사진을 보내겠다"는 협박에 사용됨

`READ_PHONE_NUMBERS` · **높음** · `UploadActivity.smali:597` `TelephonyManager.getLine1Number()` · [피해자 정보 비공개] 번호 · 직접 협박 전화/문자 발송. [피해자 정보 비공개] 핵심 역할

`READ_PHONE_STATE` · **높음** · `UploadActivity.smali:950` `TelephonyManager.getSimOperatorName()` · IMEI, 통신사 · 기기 식별 및 [피해자 정보 비공개]. 동일 [피해자 정보 비공개] 활용

`READ_MEDIA_IMAGES` · **극심** · `UploadActivity.smali:1025` `MediaStore.Images.Media.EXTERNAL_CONTENT_URI` · 전체 사진 · 몸캠피싱 핵심. 사적 사진을 탈취하여 유포 협박 소재로 사용

`READ_MEDIA_VIDEO` · **극심** · (images와 동일 메커니즘) · 전체 동영상 · 사적 영상 유포 협박. 동영상은 사진보다 더 강력한 협박 수단

`READ_MEDIA_AUDIO` · **높음** · (images와 동일 메커니즘) · 녹음 파일 · 음성 메모, 통화 녹음 등 탈취로 추가 협박 소재 확보

`READ_EXTERNAL_STORAGE` · **높음** · `v2/b.smali:43` 권한 체크 · API 32 이하 파일 · 레거시 호환. 오래된 기기에서 모든 외부 저장소 파일 접근

2.3 기법 T049: READ_SMS Manifest 미선언 (Critical Finding)

발견: 코드에서 android.permission.READ_SMS를 적극적으로 사용하지만, AndroidManifest.xml에는 이 권한이 선언되어 있지 않습니다.

코드 내 READ_SMS 사용 증거 (3곳):

```smali

근거 1: LoginActivity.smali:247 - onRequestPermissionsResult()

const-string p1, "android.permission.READ_SMS"

invoke-static {p0, p1}, Lv/a;->a(Landroid/content/Context;Ljava/lang/String;)I

근거 2: w2/a.smali:69 - CountDownTimer.onFinish()

const-string v1, "android.permission.READ_SMS"

invoke-static {v0, v1}, Lv/a;->a(Landroid/content/Context;Ljava/lang/String;)I

근거 3: x2/b.smali:21 - MontactUtils.a() ("MontactUtils" 오타 주목)

const-string v1, "content://sms/"

invoke-static {v1}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

```

영향 분석:

Android 버전 · 동작 · SMS 접근 가능 여부

Android 6.0~7.1 (API 23~25) · Manifest에 없으면 런타임 권한 요청 불가 · 불가

Android 8.0~9.0 (API 26~28) · 일부 OEM에서 content://sms/ 접근 허용 가능 · 불확실

Android 10+ (API 29+) · 엄격한 권한 모델로 차단 · 불가

해석: 이 Manifest 미선언은 개발자 실수로 판단됩니다. 동일 패키지(com.xyx.sms)를 사용하는 Flirting_138, ze, zine에서도 동일한 패턴이 발견되어, 템플릿 기반 대량 생산 과정에서의 누락으로 보입니다. SMS 수집 코드 자체는 완전히 구현되어 있으나, Manifest 누락으로 인해 최신 Android에서는 실제 SMS 탈취가 실패할 가능성이 높습니다.

2.4 권한 요청 코드 추적

권한 요청은 v2/b.smali (PermissionClickListener)에서 수행됩니다.

```smali

근거: v2/b.smali:116-128 - onClick()

4개 권한을 배열로 구성하여 일괄 요청

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

v4 = "android.permission.READ_PHONE_NUMBERS"

v3 = "android.permission.READ_PHONE_STATE"

v2 = "android.permission.READ_CONTACTS"

v0 = "android.permission.READ_EXTERNAL_STORAGE"

const/16 v1, 0x64 # requestCode = 100

invoke-virtual {p1, v0, v1}, Landroid/app/Activity;->requestPermissions([Ljava/lang/String;I)V

```

주목할 점: Manifest에서 선언된 7개 위험 권한 중, 런타임 요청은 4개만 수행합니다.

· READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO는 Android 13+(API 33)에서만 필요하며, READ_EXTERNAL_STORAGE로 API 32 이하를 커버합니다.

· READ_SMS는 체크하지만 요청하지 않음 (Manifest에도 미선언)

2.5 위험 권한 집중도

· 위험 권한 수: 7개 (전체 분석 앱 중 2위)

· 위험 권한 비율: 100% (일반 권한 INTERNET 제외)

· 데이터 탈취 범위: 연락처 + SMS(코드) + 사진 + 오디오 + 동영상 + 전화번호

· 권한 그룹 커버리지: CONTACTS, PHONE, STORAGE, SMS (4/9 그룹)

3. 코드 구조 심층 분석

3.1 핵심 클래스 구조

총 3,505개 smali 클래스 중, 악성 행위의 핵심은 12개 클래스에 집중되어 있습니다.

# · 클래스 · 소스 파일 · 역할 · 핵심 메서드

1 · `com.xyx.sms.LoginActivity` · LoginActivity.java · LAUNCHER, 초대코드 입력 · `onCreate()`

2 · `com.xyx.sms.LoginActivity$a` · LoginActivity.java · 로그인 API 호출 Runnable · `run()` → `webapp/login`

3 · `com.xyx.sms.LoginActivity$a$a` · LoginActivity.java · OnSuccess 콜백 · `onSuccess(int, String)`

4 · `com.xyx.sms.LoginActivity$a$a$a` · LoginActivity.java · UI 스레드 결과 처리 · `run()` -- **로직 반전 위치**

5 · `com.xyx.sms.UploadActivity` · UploadActivity.java · 권한 요청 + 데이터 수집 · `s()`, `onCreate()`

6 · `com.xyx.sms.servise.UploadService` · UploadService.java · 백그라운드 SMS 서비스 · `onCreate()`, `onStartCommand()`

7 · `com.xyx.sms.MyApplication` · MyApplication.java · Application 초기화 · `onCreate()`

8 · `com.xyx.sms.bean.SmsBean` · SmsBean.java · 다목적 데이터 모델 · 5개 필드

9 · `com.xyx.sms.bean.ContactBean` · ContactBean.java · 연락처 모델 (미사용) · 2개 필드

10 · `com.xyx.sms.bean.OnSuccess` · OnSuccess.java · 콜백 인터페이스 · `onSuccess(int, String)`

11 · `com.xyx.sms.servise.UploadService$a` · UploadService.java · 내부 클래스 (빈) · --

12 · `com.xyx.sms.MyApplication$a` · MyApplication.java · ActivityLifecycleCallbacks · --

3.2 난독화 매핑 테이블 (R8 컴파일러)

R8 컴파일러에 의해 난독화된 클래스들의 원본 매핑을 역공학으로 복원했습니다.

난독화 클래스 · 원본 추정 (`*.source` 참고) · 역할 · 핵심 근거

**`x2/d`** · UrlUtils.java · C2 통신 핵심, POST 요청 전송 · `.source "UrlUtils.java"`, C2 URL 하드코딩

**`x2/b`** · MontactUtils.java · SMS 수집 ("Montact"은 오타) · `.source "MontactUtils.java"`, `content://sms/`

**`x2/a`** · APpSPUtils.java · SharedPreferences 관리 · `.source "APpSPUtils.java"`, `"share_data"`

**`x2/c`** · UrlUtils.java · OkHttp Callback 구현 · `.source "UrlUtils.java"` 내부 콜백

**`w2/a`** · UploadService.java · CountDownTimer (5초 주기) · `.source "UploadService.java"`, `0x1388`

**`w2/b`** · UploadService.java · SMS 전송 Thread · `.source "UploadService.java"`, `webapp/saveSms`

**`w2/b$a`** · UploadService.java · SMS 전송 콜백 · --

**`v2/a`** · LoginActivity.java · 로그인 버튼 클릭 리스너 · `.source` 참조

**`v2/b`** · R8$$SyntheticClass · 권한 요청 버튼 핸들러 · `.source "R8$$SyntheticClass"`

**`v2/c`** · UploadActivity.java · 이미지 업로드 (multipart) · `"webapp/image/"`, `multipart/form-data`

**`v2/d`** · UploadActivity.java · 이미지 압축 콜백 · `implements Lq3/g;`

**`v2/e`** · UploadActivity.java · 연락처 전송 Runnable · `"webapp/saveAddressBook"`

**`v2/e$a`** · UploadActivity.java · 연락처 전송 OnSuccess 콜백 · `implements OnSuccess`

**`v2/e$a$a`** · UploadActivity.java · 연락처 전송 완료 UI 처리 · `"is_upload"` 플래그 설정

**`v2/f`** · UploadActivity.java · 권한 다이얼로그 확인 핸들러 · `APPLICATION_DETAILS_SETTINGS`

**`v2/g`** · UploadActivity.java · 알림 다이얼로그 확인 핸들러 · --

**`y2/a`** · SliGeneralDialog.java · 커스텀 다이얼로그 · `.source "SliGeneralDialog.java"`

**`q3/e$a`** · -- · CompressConfig.Builder · 이미지 압축 설정

**`q3/c`** · -- · CompressRunnable · 압축 후 업로드 실행

**`q3/d`** · -- · 이미지 경로 래퍼 · --

3.3 난독화 오타 분석 (공격자 언어 프로파일링)

소스 파일명에서 발견된 오타들은 공격자의 언어적 배경을 추론하는 데 활용됩니다.

오타 · 올바른 표기 · 파일 · 분석

"Montact" · "Contact" · `x2/b.smali` `.source "MontactUtils.java"` · 'C'를 'M'으로 오타 -- 한국어/중국어 키보드 오입력 가능

"servise" · "service" · `AndroidManifest.xml:26`, `UploadService.smali` · 's'와 'c' 혼동 -- 비영어권 지표

"APpSP" · "AppSP" · `x2/a.smali` `.source "APpSPUtils.java"` · 대소문자 실수

"SliGeneral" · "SlideGeneral"? · `y2/a.smali` `.source "SliGeneralDialog.java"` · 축약형 명명

3.4 의존 라이브러리

라이브러리 · 난독화 패키지 · 용도 · 버전 추정

**OkHttp3** · `g3/` · HTTP 클라이언트 (모든 C2 통신) · 4.x

**FastJSON** · `com.alibaba.fastjson` · JSON 직렬화 (연락처/SMS → JSON) · 1.2.x

**Gson** · `com.google.gson` · JSON 역직렬화 (서버 응답 파싱) · 2.x

**BlankJ AndroidUtilCode** · `com.blankj.utilcode` · SharedPreferences, 기기 유틸리티 · --

**PictureSelector** · `com.luck.picture.lib` · 이미지 선택/압축 라이브러리 · 3.x

**Glide** · `com.bumptech.glide` · 이미지 로딩/캐싱 · 4.x

**AndroidX** · `androidx.*` · AppCompat, Fragment, Lifecycle · --

**okio** · `okio` · OkHttp 의존 I/O 라이브러리 · 3.x

FastJSON + Gson 이중 사용 패턴:

· FastJSON: JSON.toJSONString() -- 객체를 JSON 문자열로 직렬화 (클라이언트 → 서버)

· Gson: new Gson().toJson() -- UrlUtils에서 Map을 JSON으로 변환

· FastJSON: JSON.parseObject() -- 서버 응답 파싱

· 두 라이브러리의 혼용은 코드 복사/붙여넣기 개발 패턴을 시사

3.5 SharedPreferences 저장소 분석 (`share_data`)

```smali

근거: x2/a.smali:19 (APpSPUtils.java)

const-string v0, "share_data"

invoke-virtual {p0, v0, v1}, Context;->getSharedPreferences(Ljava/lang/String;I)

```

키 · 타입 · 설정 위치 · 용도 · 보안 영향

`is_first` · Boolean · `LoginActivity$a$a$a.smali:326` · 최초 로그인 완료 여부 · true이면 로그인 건너뜀 → 우회 패치 포인트

`UUID` · String · `LoginActivity$a$a$a.smali:133` · 기기 고유 식별자 · userName으로 사용, [피해자 정보 비공개]

`invite_code` · String · `LoginActivity$a$a$a.smali:194` · 입력된 초대코드 · 공격자-[피해자 정보 비공개]

`is_upload` · Boolean · `v2/e$a$a.smali:159` · 연락처 업로드 완료 여부 · true이면 버튼 비활성화

allowBackup="true" 취약점과의 결합:

```bash

adb backup으로 share_data.xml 추출 가능

adb backup -f nyang_backup.ab com.smartbee.autohelper

→ UUID, invite_code 복호화 가능

```

3.6 기법 T050: SmsBean 다목적 재사용

발견: SmsBean 클래스가 SMS, 연락처, 이미지 경로 저장에 모두 재사용됩니다.

```smali

근거: SmsBean.smali - 필드 정의

.field public content:Ljava/lang/String; # SMS: 본문 / 연락처: 전화번호

.field public date:Ljava/lang/String; # SMS: 날짜 / 연락처: 미사용

.field public displayName:Ljava/lang/String; # SMS: 발신자 / 연락처: 이름

.field public path:Ljava/lang/String; # SMS: 미사용 / 이미지: 파일 경로

.field public type:Ljava/lang/String; # SMS: 유형 / 연락처: 미사용

```

사용 컨텍스트 · 사용 필드 · 미사용 필드 · 근거 파일:라인

**SMS 수집** · content, date, displayName, type · path · `x2/b.smali:180-192`

**연락처 수집** · content(=번호), displayName(=이름) · date, path, type · `UploadActivity.smali:849-853`

**이미지 수집** · path · content, date, displayName, type · `UploadActivity.smali:1137`

ContactBean 클래스는 존재하지만 미사용:

```smali

근거: ContactBean.smali

.field public name:Ljava/lang/String; # 사용되지 않음

.field public number:Ljava/lang/String; # 사용되지 않음

```

이 패턴은 개발자가 전용 데이터 클래스를 만들었지만 사용하지 않고, 기존 SmsBean을 범용으로 남용하는 급조된 코드 특성을 보여줍니다.

4. 액티비티 흐름 분석

4.1 전체 실행 흐름

```

[앱 설치 및 실행]

┌──────────────────────────────────────────────────┐

│ LoginActivity (LAUNCHER) │

│ │

│ ① SharedPreferences에서 is_first 읽기 │

│ → true이면 UploadActivity로 직행 (재실행 시) │

│ → false이면 초대코드 입력 화면 표시 │

│ │

│ ② 초대코드 입력 후 "로그인" 클릭 │

│ → UUID 생성 (이미 저장된 경우 로드) │

│ → POST /webapp/login {name, cId} │

│ │

│ ③ 서버 응답 처리 (T001: 로직 반전) │

│ → code != 200 → 성공! UUID/invite_code 저장 │

│ → code == 200 → 실패. msg를 Toast 표시 │

│ │

│ ④ 성공 시: is_first=true 저장, UploadActivity 시작 │

└──────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────┐

│ UploadActivity │

│ │

│ ① invite_code, is_upload 로드 │

│ → is_upload == true이면 버튼 비활성화 (재전송 방지)│

│ │

│ ② "동의" 버튼 클릭 (v2/b PermissionClickListener) │

│ → 이미 모든 권한 있으면 직접 s() 호출 │

│ → 없으면 requestPermissions([4개 권한], 100) │

│ │

│ ③ onRequestPermissionsResult() / onActivityResult()│

│ → 4개 권한 모두 granted 확인 │

│ → 미허용 시: y2/a (SliGeneralDialog) → 설정 이동 │

│ → 모두 허용 시: s() 호출 │

│ │

│ ④ s() 메서드 (데이터 수집 엔진) │

│ ├─ [try] getLine1Number() → bjPhone │

│ ├─ [try] ContactsContract.Phone 쿼리 │

│ │ └─ SmsBean에 저장 (displayName, content) │

│ ├─ HashMap 구성 (userName, model, bjPhone, │

│ │ operatorName, phoneContent) │

│ ├─ new Thread(v2/e) → saveAddressBook POST │

│ ├─ [try] MediaStore.Images.Media 쿼리 │

│ │ └─ SmsBean에 저장 (path) │

│ └─ 각 이미지 → q3/e$a → AsyncTask SERIAL_EXECUTOR│

│ └─ q3/c → v2/c → POST /webapp/image/{user} │

│ │

│ ⑤ UploadService 시작 │

│ → startService(Intent(UploadService)) │

└──────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────┐

│ UploadService (백그라운드, 무한 루프) │

│ │

│ ① onCreate(): │

│ ├─ getApplicationContext() → context 저장 │

│ ├─ getLine1Number() → bjPhone 저장 │

│ └─ new w2/a(this) → CountDownTimer 시작 │

│ │

│ ② onStartCommand(): │

│ └─ return START_STICKY (0x1) → 자동 재시작 │

│ │

│ ③ w2/a.onFinish() (5초마다): │

│ ├─ READ_SMS 권한 체크 │

│ ├─ MontactUtils.a(context) → SMS 전체 쿼리 │

│ ├─ SMS 수 변화 감지 (이전 vs 현재 ArrayList.size) │

│ ├─ 변화 있으면: │

│ │ ├─ invite_code 로드 │

│ │ ├─ HashMap {userName, bjPhone, content} 구성 │

│ │ └─ new Thread(w2/b) → saveSms POST │

│ └─ 새 CountDownTimer 생성 → 자기 자신 재시작 │

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