Killer-1-Maui 상세 분석 보고서

GUAGT9 (Killer-1-Maui) 심층 분석 보고서

> 보고서 버전: v3.0

> 분석 일자: 2025-07-18 ~ 2026-02-14

> 분석 기관: 주식회사 아크링크 (378-88-03382)

> 분석가: [비공개] 대표

> 위협 등급: HIGH

> 프레임워크: Microsoft MAUI (.NET 8+)

> 보고서 등급: Gold Standard

목차

1. [앱 기본 정보](#1-앱-기본-정보)

2. [권한 분석](#2-권한-분석)

3. [코드 구조 분석](#3-코드-구조-분석)

4. [MAUI 프레임워크 심층 분석](#4-maui-프레임워크-심층-분석)

5. [네트워크/C2 분석](#5-네트워크c2-분석)

6. [SSL/TLS 우회 분석](#6-ssltls-우회-분석)

7. [방어기제 분석](#7-방어기제-분석)

8. [데이터 탈취 분석](#8-데이터-탈취-분석)

9. [암호화 모듈 분석 (Google Tink)](#9-암호화-모듈-분석-google-tink)

10. [취약점 카탈로그](#10-취약점-카탈로그)

11. [기법 카탈로그](#11-기법-카탈로그)

12. [우회 결과](#12-우회-결과)

13. [IOC (침해 지표)](#13-ioc-침해-지표)

14. [피해 영향 평가](#14-피해-영향-평가)

15. [분석 타임라인](#15-분석-타임라인)

16. [MALBIO 유전체](#16-malbio-유전체)

17. [결론 및 위험도 점수표](#17-결론-및-위험도-점수표)

1. 앱 기본 정보

항목 · 값

**파일명** · GUAGT9.APK

**패키지명** · com.jvy.aunounxf

**앱 이름** · Killer-1-Maui (런처 표시명: 蜜源)

**빌드 타임스탬프** · 2025-07-18_16_31_43

**프레임워크** · Microsoft MAUI (.NET 8+)

**런타임** · Mono (monosgen-2.0)

**minSdkVersion** · 21 (Android 5.0 Lollipop)

**targetSdkVersion** · 33 (Android 13)

**메인 액티비티** · crc646b2ca691d03784c3.MainActivity

**어셈블리 수** · 115개 (assemblies.manifest 기준)

**네이티브 라이브러리 아키텍처** · arm64-v8a, armeabi-v7a, x86, x86_64

**APK 내 파일 수** · 1,077개

**APK 크기** · 12.1MB

**보호 방식** · AndroidManifest.xml 암호화, AOT 컴파일

**DEX 파일** · classes.dex (7.1MB), classes2.dex (6.4MB)

**DEX 클래스 수** · 6,132개

**DEX 메소드 수** · 42,724개

**DEX 명령어 수** · 1,044,393개

1.1 MAUI 프레임워크 구조

이 앱은 Microsoft MAUI (.NET Multi-platform App UI) 프레임워크로 개발되었으며, 안드로이드 악성앱에서 극히 이례적인 기술 스택이다. MAUI 앱은 .NET 어셈블리(.dll) 내에 실제 비즈니스 로직이 포함되어 있어, 기존 Java/Kotlin 기반 분석과 완전히 다른 접근이 필요하다.

핵심 어셈블리 목록:

· Killer-1-Maui.dll (assembly_76, Hash32=0xc539b844, Hash64=0x2006e8f5575b1478) - 앱 핵심 로직

· Microsoft.Maui.dll (assembly_45) - MAUI 프레임워크 코어

· Microsoft.Maui.Controls.dll (assembly_43) - UI 컨트롤

· Microsoft.Maui.Essentials.dll (assembly_46) - 디바이스 API 접근

· [비공개].Http.dll (assembly_88) - 네트워크 통신

· [비공개].Sockets.dll (Blob 001) - 소켓 통신

· System.Security.Cryptography.dll (assembly_99) - 암호화 모듈

· System.Text.Json.dll (Blob 001) - JSON 직렬화/역직렬화

· System.Text.RegularExpressions.dll (Blob 001) - 정규식 패턴 매칭

어셈블리 배포 방식: AOT(Ahead-of-Time) 컴파일된 네이티브 라이브러리(libaot-*.dll.so)와 함께 assemblies.blob 내에 .dll 어셈블리가 번들링되어 있음. 아키텍처별 분리 배포: arm64_v8a (18개), armeabi_v7a (18개), x86 (18개), x86_64 (18개), generic (64개 + 107개).

1.2 빌드 환경 추정

항목 · 추정 값 · 근거

**.NET 버전** · .NET 8+ · MAUI 8 AOT 패턴

**Visual Studio 버전** · 2022 17.x+ · MAUI 지원 요구

**빌드 모드** · Release (AOT) · libaot-* 바이너리 존재

**빌드 타임스탬프** · 2025-07-18 16:31:43 · 타임스탬프 파일명

**개발 조직** · 중국 기반 추정 · 앱 이름 "蜜源", 34개 다국어 리소스

2. 권한 분석

2.1 AndroidManifest.xml 선언 권한

복호화된 AndroidManifest.xml 기준으로 선언된 권한:

권한 · 위험도 · 피해 시나리오

`INTERNET` · Normal · C2 서버 통신, 탈취 데이터 전송 기반

`ACCESS_NETWORK_STATE` · Normal · 네트워크 상태 확인으로 데이터 전송 타이밍 최적화

2.2 런타임 권한 추정

MAUI 프레임워크 내 Microsoft.Maui.Essentials.dll(44,858 bytes AOT) 및 MauiAppCompatActivity의 n_onRequestPermissionsResult 네이티브 메소드가 확인되어, 런타임에 다음 권한을 동적으로 요청하는 것으로 판단:

추정 권한 · 근거 · 피해 시나리오

`READ_CONTACTS` · Essentials Contacts API · 연락처 전체 탈취 후 보이스피싱 2차 공격

`READ_PHONE_STATE` · Essentials PhoneDialer API · IMEI/전화번호 수집으로 [피해자 정보 비공개] 식별

`CAMERA` · Essentials Camera API · 사진 촬영으로 사생활 침해 및 협박 소재

`READ_EXTERNAL_STORAGE` · FileProvider 구성 확인 · 갤러리/문서 파일 탈취

`ACCESS_FINE_LOCATION` · Essentials Geolocation API · 실시간 위치 추적으로 물리적 위험

`READ_SMS` · Essentials SMS API · SMS 내용 탈취로 인증코드 가로채기

`RECORD_AUDIO` · Essentials 미디어 API · 통화 녹음으로 협박 소재 확보

2.3 FileProvider 구성

microsoft_maui_essentials_fileprovider_file_paths.xml에서 다음 경로가 설정됨:

· cache-path - 내부 캐시 디렉토리

· external-cache-path - 외부 캐시 디렉토리

· external-path - 외부 저장소 전체

외부 저장소 전체 접근이 구성되어 있어, 파일 탈취 의도가 명확함.

2.4 권한 요청 메커니즘 (MAUI 특화)

```

[권한 요청 체인]

MauiAppCompatActivity.onRequestPermissionsResult()

├→ n_onRequestPermissionsResult() [JNI → .NET]

├→ Mono Runtime → Killer-1-Maui.dll

└→ Microsoft.Maui.Essentials.dll → Platform Permission API

```

MauiAppCompatActivity smali 코드에서 확인된 n_onRequestPermissionsResult 핸들러는 JNI를 통해 .NET 런타임으로 권한 결과를 전달한다. 이는 권한 요청이 Java 레이어가 아닌 .NET C# 코드에서 제어됨을 의미하며, 분석 난이도를 크게 높인다.

3. 코드 구조 분석

3.1 앱 아키텍처

```

GUAGT9.APK (12.1MB)

├── AndroidManifest.xml [ZIP 암호화됨 - 1,077개 중 유일]

├── classes.dex (7.1MB)

│ └── crc646b2ca691d03784c3.MainActivity (MAUI Java Bridge)

│ └── android.runtime.* (Mono Runtime Bridge)

│ └── [비공개].ActivityTracker

│ └── android.support.customtabs.* (Chrome Custom Tabs)

│ └── androidx.* (AndroidX 라이브러리)

├── classes2.dex (6.4MB)

│ └── crc64* [15개 CRC64 네임스페이스 - MAUI .NET 브릿지]

│ └── mono.* (Mono Runtime Package Manager)

│ └── net.dot.android.crypto.* (DotNet TLS)

│ └── [비공개].* (SSL 검증)

│ └── com.google.crypto.tink.* (Google Tink 암호화)

│ └── com.jvy.aunounxf.R* (리소스 참조)

├── assemblies/

│ ├── assemblies.blob (107개 .NET 어셈블리 번들)

│ ├── assemblies.manifest (115줄, 해시 + 이름 매핑)

│ ├── assemblies.arm64_v8a.blob (18개)

│ ├── assemblies.armeabi_v7a.blob (18개)

│ ├── assemblies.x86.blob (18개)

│ ├── assemblies.x86_64.blob (18개)

│ └── rc.bin (리소스 컴파일러 바이너리)

├── lib/

│ ├── arm64-v8a/ (52개 네이티브 라이브러리)

│ │ ├── libaot-Killer-1-Maui.dll.so [780,970 bytes - 핵심 앱 로직]

│ │ ├── libaot-Microsoft.Maui.Controls.dll.so [1,822,698 bytes - 최대]

│ │ ├── libaot-Microsoft.Maui.dll.so [653,865 bytes]

│ │ ├── libaot-Mono.Android.dll.so [687,834 bytes]

│ │ ├── libaot-Microsoft.Maui.Essentials.dll.so [44,858 bytes]

│ │ ├── [비공개].Http.dll.so

│ │ ├── libaot-System.Security.Cryptography.dll.so

│ │ ├── libaot-System.Text.Json.dll.so

│ │ ├── libaot-Java.Interop.dll.so [202,449 bytes]

│ │ ├── libmonodroid.so (Mono Android 런타임)

│ │ ├── libmonosgen-2.0.so (Mono GC 엔진)

│ │ ├── libxamarin-app.so (Xamarin 바인딩)

│ │ ├── libSystem.Security.Cryptography.Native.Android.so

│ │ ├── [비공개].Compression.Native.so

│ │ └── libSystem.Native.so

│ ├── armeabi-v7a/ (동일 구조)

│ ├── x86/ (동일 구조)

│ └── x86_64/ (동일 구조)

├── [난독화 파일] 16개 해시 파일명

│ ├── 2025-07-18_16_31_43 (2,074 bytes, binary data)

│ ├── 9n5j286n5pj16zyxg9r9s2c03qeal147m6ol

│ ├── 7tvb1h2va2ee

│ ├── 613m58z77783l

│ ├── vm9nysa5mst7x6gl0nhu4xd001n37p62q4

│ └── ... (총 16개)

├── res/ (Material Design 3 리소스)

│ ├── layout/ (flyoutcontent.xml, tabbar.xml, toolbar.xml)

│ ├── mipmap-anydpi-v26/ (appicon.xml, appicon_round.xml)

│ └── xml/ (fileprovider_file_paths, splits0, image_share_filepaths)

└── META-INF/

└── services/ (Kotlin Coroutines 핸들러)

```

3.2 CRC64 네임스페이스 매핑

MAUI는 Java에서 .NET으로의 브릿지 클래스를 CRC64 해시로 변환한다. 15개 CRC64 네임스페이스의 매핑:

CRC64 해시 · .NET 원본 네임스페이스 · 클래스 수 · 기능

`crc646b2ca691d03784c3` · `Killer_1_Maui` · 2 · **앱 핵심** (MainActivity, MainApplication)

`crc6488302ad6e9e4df1a` · `Microsoft.Maui` · 6 · MAUI 코어 (Activity, Application, ImageLoader)

`crc640ec207abc449b2ca` · `Microsoft.Maui.Controls.Compatibility` · 20+ · Shell/Flyout UI 컨트롤

`crc64338477404e88479c` · `Microsoft.Maui.Controls.Platform` · 15+ · 플랫폼 UI 핸들러

`crc6452ffdc5b34af3a0f` · `Microsoft.Maui.Platform` · 40+ · **핵심** - WebView, Navigation, Form 핸들러

`crc645d80431ce5f73f11` · `Microsoft.Maui.Controls.Handlers` · 10+ · CarouselView, CollectionView 핸들러

`crc643f2b18b2570eaa5a` · `Microsoft.Maui.Graphics` · 1 · 그래픽스 뷰

`crc640a8d9a12ddbf2cf2` · `Microsoft.Maui.Essentials` · 2 · 디바이스 센서 (디스플레이, 배터리)

`crc64a096dc44ad241142` · `Microsoft.Maui.Animations` · 1 · 애니메이션 타이머

`crc64e1fb321c08285b90` · `Microsoft.Maui.Controls.Compat` · 38 · **핵심** - ListView, TableView, Cell 렌더러

`crc64b5e713d400f589b7` · (미확인) · - · 추가 모듈

`crc64ba438d8f48cf7e75` · (미확인) · - · 추가 모듈

`crc649ff77a65592e7d55` · (미확인) · - · 추가 모듈

`crc64f728827fec74e9c3` · (미확인) · - · 추가 모듈

`crc64fcf28c0e24b4cc31` · (미확인) · - · 추가 모듈

3.3 난독화된 파일 분석

APK 내 16개의 난독화된 파일명이 발견됨. 모두 apktool.yml에서 unknownFiles (compression method: 8 = Deflate)로 분류:

파일명 · 크기 · 추정 용도

`2025-07-18_16_31_43` · 2,074 bytes · 빌드 타임스탬프 + 바이너리 메타데이터

`9n5j286n5pj16zyxg9r9s2c03qeal147m6ol` · 미확인 · 암호화된 설정/C2 주소

`vm9nysa5mst7x6gl0nhu4xd001n37p62q4` · 미확인 · 암호화된 인증 토큰

`5b86j29f36t66l2582s9p422ss053s1` · 미확인 · 런타임 복호화 대상

`7tvb1h2va2ee` · 미확인 · 짧은 해시 - 키 또는 IV

`613m58z77783l` · 미확인 · 난독화된 리소스

`3149zuoq03` · 미확인 · 난독화된 리소스

`z6cjegt1cc259` · 미확인 · 난독화된 리소스

`gm8t201fcydf857` · 미확인 · 난독화된 리소스

`ki19y8s992209k5gxnur` · 미확인 · 난독화된 리소스

`311nt5vent` · 미확인 · 가능한 이벤트 설정 파일

`4c3qder35g833aw5hkc6so82ujz6229` · 미확인 · 해시 기반 파일명

`bq41gp319378q67d3g7f` · 미확인 · 해시 기반 파일명

`l6muue7zt93hvrwo1r97` · 미확인 · 해시 기반 파일명

`rx6lw9lgcy4b` · 미확인 · 해시 기반 파일명

`t4rvl9iui2mcpx2g` · 미확인 · 해시 기반 파일명

분석 의견: 이 파일들은 런타임에 .NET 코드([비공개] + System.Security.Cryptography)를 통해 복호화되어 C2 서버 주소, API 엔드포인트, 암호화 키 등으로 사용될 가능성이 높다. 파일명의 무작위 패턴은 빌드 시 자동 생성된 해시 기반 난독화로 판단.

3.4 DEX 레벨 구조

항목 · classes.dex · classes2.dex

**크기** · 7.1 MB · 6.4 MB

**주요 패키지** · android.runtime, [비공개], android.support, androidx · crc64*, mono, net.dot, xamarin, com.google.crypto.tink

**역할** · Mono 런타임 초기화, AndroidX 라이브러리 · MAUI 브릿지, SSL/TLS, Tink 암호화

3.5 리소스 분석

· Material Design 3 (M3) 컴포넌트 사용: m3_alert_dialog.xml, m3_side_sheet_dialog.xml

· MAUI FlyoutPage 레이아웃: flyoutcontent.xml (사이드 네비게이션 메뉴)

· 탭 기반 네비게이션: tabbar.xml

· 다국어 리소스: 34개 언어(ar, ca, cs, da, de, el, es, fi, fr, he, hi, hr, hu, id, it, ja, ko, ms, nb, nl, pl, pt-BR, pt, ro, ru, sk, sv, th, tr, uk, vi, zh-HK, zh-Hans, zh-Hant)

4. MAUI 프레임워크 심층 분석

4.1 Mono 런타임 초기화 체인

앱 시작 시 실행되는 초기화 체인을 smali 코드 레벨에서 추적:

```

[앱 시작 체인]

Android OS → MainApplication.onCreate()

├→ MonoPackageManager.setContext(this) [Java → Mono 초기화]

│ ├→ MonoPackageManager.LoadApplication() [synchronized]

│ │ ├→ IntentFilter("android.intent.action.TIMEZONE_CHANGED") 등록

│ │ ├→ Locale.getDefault() → 언어 감지

│ │ ├→ Mono Runtime 초기화 [네이티브 바이너리]

│ │ └→ initialized = true [이중 초기화 방지 플래그]

│ └→ MonoPackageManager_Resources.Assemblies 로딩

├→ n_onCreate() [JNI → .NET MauiApplication.OnCreate()]

│ └→ Killer-1-Maui.dll 내 MauiProgram.CreateMauiApp()

└→ DI Container 초기화 (Microsoft.Extensions.DependencyInjection)

Android OS → MainActivity.onCreate(Bundle)

├→ MauiAppCompatActivity.onCreate() [부모 클래스]

│ └→ n_onCreate() [JNI → .NET]

│ ├→ TypeManager.Activate("Killer_1_Maui.MainActivity") [.NET 타입 활성화]

│ └→ Killer-1-Maui.dll → UI 렌더링 + 인증 화면

└→ 사용자에게 로그인 화면 표시

```

4.2 JNI 브릿지 아키텍처

MAUI 앱의 Java ↔ .NET 통신은 3단계 브릿지 구조:

```

[3단계 브릿지]

Layer 1: Java/Kotlin (smali)

└→ crc646b2ca691d03784c3.MainActivity extends MauiAppCompatActivity

└→ public native void n_onCreate(Bundle) [JNI 선언]

Layer 2: Mono JNI Bridge (libmonodroid.so)

└→ mono.android.Runtime.register(

"Killer_1_Maui.MainActivity, Killer-1-Maui",

MainActivity.class,

"__md_methods" 매핑

)

Layer 3: .NET / C# (libaot-Killer-1-Maui.dll.so)

└→ Killer_1_Maui.MainActivity : MauiAppCompatActivity

└→ OnCreate(Bundle) { /* 실제 앱 로직 */ }

```

보안 분석 시사점: 실제 악성 로직은 Layer 3의 AOT 컴파일된 네이티브 바이너리 내에 존재하여, 일반적인 Java/smali 분석으로는 접근 불가. 780,970 bytes의 libaot-Killer-1-Maui.dll.so 분석이 핵심.

4.3 MauiAppCompatActivity 이벤트 핸들러 매핑

smali 코드에서 확인된 __md_methods 문자열을 통해 Java → .NET 이벤트 핸들러 매핑:

Java 메소드 · JNI 네이티브 호출 · .NET 핸들러

`onCreate(Bundle)` · `n_onCreate` · `GetOnCreate_Landroid_os_Bundle_Handler`

`dispatchTouchEvent(MotionEvent)` · `n_dispatchTouchEvent` · 터치 이벤트 가로채기

`onActivityResult(int, int, Intent)` · `n_onActivityResult` · 카메라/파일 선택 결과

`onBackPressed()` · `n_onBackPressed` · 뒤로가기 차단/제어

`onConfigurationChanged(Configuration)` · `n_onConfigurationChanged` · 언어/화면 변경 감지

`onNewIntent(Intent)` · `n_onNewIntent` · 딥링크/외부 호출 처리

`onPostCreate(Bundle)` · `n_onPostCreate` · 초기화 완료 후 처리

`onPostResume()` · `n_onPostResume` · 포그라운드 복귀 시 데이터 전송

`onRestart()` · `n_onRestart` · 앱 재시작 감지

`onRequestPermissionsResult(int, String[], int[])` · `n_onRequestPermissionsResult` · **권한 응답 처리**

`onRestoreInstanceState(Bundle)` · `n_onRestoreInstanceState` · 상태 복원

주목할 점: dispatchTouchEvent와 onBackPressed가 네이티브로 위임되어, 사용자의 터치 입력 가로채기와 뒤로가기 차단이 .NET 레벨에서 제어됨.

4.4 의존성 주입 (DI) 분석

Microsoft.Extensions.DependencyInjection.dll(96,130 bytes AOT)과 Microsoft.Extensions.Logging.dll(19,530 bytes)이 포함되어 있어, 정교한 서비스 구조가 구축됨:

```

[추정 DI 서비스 구조]

MauiProgram.CreateMauiApp()

├→ builder.Services.AddSingleton<IHttpClientFactory>() [C2 통신]

├→ builder.Services.AddSingleton<IDataCollector>() [데이터 탈취]

├→ builder.Services.AddSingleton<ICryptoService>() [암호화]

├→ builder.Services.AddTransient<IAuthService>() [인증]

└→ builder.Services.AddSingleton<IDeviceInfoService>() [디바이스 정보]

```

4.5 MAUI UI 컴포넌트 분석

crc64 네임스페이스의 smali 파일 분석으로 확인된 UI 구조:

UI 컴포넌트 · smali 파일 · 기능

**WebView** · `MauiWebView.smali`, `MauiWebViewClient.smali`, `MauiWebChromeClient.smali` · 피싱 페이지 표시/JavaScript 실행

**FlyoutPage** · `ShellFlyoutLayout.smali`, `ShellFlyoutRenderer.smali` · 사이드 메뉴 네비게이션

**NavigationView** · `NavigationViewFragment.smali`, `StackNavigationManager_Callbacks.smali` · 페이지 간 이동

**SearchView** · `MauiSearchView.smali`, `ShellSearchView.smali` · 검색 기능 ([피해자 정보 비공개] 검색?)

**SwipeView** · `MauiSwipeView.smali`, `MauiSwipeRefreshLayout.smali` · 새로고침 제스처

**ListView/TableView** · `ListViewRenderer.smali`, `TableViewRenderer.smali` · 데이터 목록 표시

**Modal Dialog** · `ModalNavigationManager_ModalContainer.smali` · 모달 팝업 (권한 요청 UI)

5. 네트워크/C2 분석

5.1 네트워크 모듈 구성

모듈 · AOT 크기 · 용도

`[비공개].Http.dll` · 포함됨 · HttpClient - HTTPS 통신

`[비공개].Sockets.dll` · Blob 001 · 저수준 소켓 (TCP/UDP)

`[비공개].Requests.dll` · 포함됨 · 레거시 WebRequest API

`[비공개].Primitives.dll` · 포함됨 · IPAddress, DNS, Socket 기본 타입

`[비공개].NameResolution.dll` · 포함됨 · DNS 해석

`System.Private.Uri.dll` · 포함됨 · URI 파싱 및 구성

`System.Text.Json.dll` · Blob 001 · JSON 직렬화 (API 통신 데이터 포맷)

`System.Text.Encodings.Web.dll` · Blob 001 · 웹 인코딩 (HTML 이스케이프)

5.2 C2 서버 은닉 분석

현재까지 정적 분석으로 하드코딩된 C2 서버 주소는 발견되지 않았다. 이는 MAUI 프레임워크의 AOT 컴파일 특성상 의도적 은닉이 가능하기 때문이다.

C2 주소 은닉 추정 위치 (우선순위):

순위 · 위치 · 근거 · 분석 난이도

1 · `libaot-Killer-1-Maui.dll.so` 내 문자열 · 780KB 핵심 바이너리, 앱 로직 포함 · Very High

2 · 난독화 파일 16개 중 하나 · 런타임 복호화 대상 · High

3 · 런타임 동적 조합 · 문자열 조합 + Base64 디코딩 · Very High

4 · assemblies.blob 내 .dll 리소스 · Embedded Resource로 은닉 · High

5 · SharedPreferences 원격 주입 · 서버에서 최초 실행 시 주입 · Medium

추정 C2 통신 패턴:

```

[추정 네트워크 흐름]

앱 시작

├→ 난독화 파일 복호화 → C2 URL 추출

├→ HttpClient.PostAsync(c2_url + "[비공개], deviceInfo)

├→ 인증 성공 응답 → 토큰 저장

├→ 주기적 데이터 전송

│ ├→ POST [비공개] → 연락처

│ ├→ POST [비공개] → SMS

│ ├→ POST [비공개] → 파일

│ └→ POST [비공개] → 위치

└→ 명령 수신 (Polling 또는 WebSocket)

```

6. SSL/TLS 우회 분석

6.1 SSL/TLS 구조 (3중 검증 체계)

이 앱은 .NET의 자체 TLS 스택을 사용하며, 3중 SSL 검증 체계를 구현:

```

[3중 SSL 검증 체계]

Layer 1: DotnetProxyTrustManager (net.dot.android.crypto)

└→ JNI 네이티브 호출: verifyRemoteCertificate(sslStreamProxyHandle)

└→ Java 레벨 인증서 검증 → .NET 런타임에서 최종 결정

Layer 2: ServerCertificateCustomValidator_TrustManager ([비공개])

└→ Mono.Android 런타임 등록 (TypeManager.Activate)

└→ n_checkServerTrusted() → .NET의 X509CertificateValidator 호출

Layer 3: AlwaysAcceptingHostnameVerifier ([비공개])

└→ IHostnameVerifier 구현

└→ verify() → .NET 호스트명 검증 위임

보조: FakeSSLSession ([비공개])

└→ SSLSession 전체 인터페이스 구현 (21개 메소드)

└→ .NET에서 인증서 체인 검사 수행

```

6.2 DotnetProxyTrustManager 상세 분석

```smali

net/dot/android/crypto/DotnetProxyTrustManager.smali

#

핵심: sslStreamProxyHandle (long) 필드를 통해 .NET SSL 스트림 참조

verifyRemoteCertificate()는 static native - Mono 런타임 내 구현

.method public checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V

sslStreamProxyHandle을 가져와 네이티브 검증

iget-wide p1, p0, ->sslStreamProxyHandle:J

invoke-static {p1, p2}, ->verifyRemoteCertificate(J)Z

move-result p1

if-nez p1, :cond_0 # true면 예외 발생 (인증서 거부)

return-void # false면 통과 (인증서 수락)

:cond_0

new-instance p1, Ljava/security/cert/CertificateException;

throw p1 # CertificateException 발생

.end method

```

우회 방법: if-nez → if-eqz 조건 반전으로 인증서 검증 결과 반전. verifyRemoteCertificate()가 false(유효)를 반환해도 예외가 발생하고, true(무효)를 반환하면 통과하도록 변경.

6.3 ServerCertificateCustomValidator 상세 분석

```smali

xamarin/android/net/ServerCertificateCustomValidator_TrustManager.smali

#

Mono.Android 런타임에 등록: TypeManager.Activate()

실제 검증 로직은 n_checkServerTrusted() 네이티브 메소드

.method static constructor <clinit>()V

const-string v0, "[비공개].ServerCertificateCustomValidator+TrustManager, Mono.Android"

invoke-static {v0, v1, v2}, Lmono/android/Runtime;->register(...)V

.end method

.method public checkServerTrusted(...)V

invoke-direct {p0, p1, p2}, ->n_checkServerTrusted(...)V # .NET 위임

return-void

.end method

```

우회 방법: checkServerTrusted 메소드 본문을 return-void로 교체하여 .NET 검증 자체를 호출하지 않음.

6.4 FakeSSLSession - SSL 세션 위조

FakeSSLSession은 21개의 SSLSession 인터페이스 메소드를 모두 구현하며, 각 메소드가 .NET 네이티브로 위임됨. 이는 MITM 분석 시 SSL 세션 정보를 정교하게 위조하기 위한 구조:

```

[FakeSSLSession 구현 메소드 - 21개]

getApplicationBufferSize() → n_getApplicationBufferSize()

getCipherSuite() → n_getCipherSuite()

getCreationTime() → n_getCreationTime()

isValid() → 패치됨: 항상 true 반환

getLastAccessedTime() → n_getLastAccessedTime()

getLocalPrincipal() → n_getLocalPrincipal()

getPacketBufferSize() → n_getPacketBufferSize()

getPeerHost() → n_getPeerHost()

getPeerPort() → n_getPeerPort()

getPeerPrincipal() → n_getPeerPrincipal()

getProtocol() → n_getProtocol()

getSessionContext() → n_getSessionContext()

getId() → n_getId()

getLocalCertificates() → n_getLocalCertificates()

getPeerCertificateChain() → n_getPeerCertificateChain()

getPeerCertificates() → n_getPeerCertificates()

getValue(String) → n_getValue(String)

getValueNames() → n_getValueNames()

invalidate() → n_invalidate()

putValue(String, Object) → n_putValue(String, Object)

removeValue(String) → n_removeValue(String)

```

6.5 Hostname

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