> 보고서 버전: 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-결론-및-위험도-점수표)
항목 · 값
**파일명** · 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개
이 앱은 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개).
항목 · 추정 값 · 근거
**.NET 버전** · .NET 8+ · MAUI 8 AOT 패턴
**Visual Studio 버전** · 2022 17.x+ · MAUI 지원 요구
**빌드 모드** · Release (AOT) · libaot-* 바이너리 존재
**빌드 타임스탬프** · 2025-07-18 16:31:43 · 타임스탬프 파일명
**개발 조직** · 중국 기반 추정 · 앱 이름 "蜜源", 34개 다국어 리소스
복호화된 AndroidManifest.xml 기준으로 선언된 권한:
권한 · 위험도 · 피해 시나리오
`INTERNET` · Normal · C2 서버 통신, 탈취 데이터 전송 기반
`ACCESS_NETWORK_STATE` · Normal · 네트워크 상태 확인으로 데이터 전송 타이밍 최적화
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 · 통화 녹음으로 협박 소재 확보
microsoft_maui_essentials_fileprovider_file_paths.xml에서 다음 경로가 설정됨:
· cache-path - 내부 캐시 디렉토리
· external-cache-path - 외부 캐시 디렉토리
· external-path - 외부 저장소 전체
외부 저장소 전체 접근이 구성되어 있어, 파일 탈취 의도가 명확함.
```
[권한 요청 체인]
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# 코드에서 제어됨을 의미하며, 분석 난이도를 크게 높인다.
```
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 핸들러)
```
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` · (미확인) · - · 추가 모듈
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 엔드포인트, 암호화 키 등으로 사용될 가능성이 높다. 파일명의 무작위 패턴은 빌드 시 자동 생성된 해시 기반 난독화로 판단.
항목 · 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 암호화
· 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)
앱 시작 시 실행되는 초기화 체인을 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 렌더링 + 인증 화면
└→ 사용자에게 로그인 화면 표시
```
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 분석이 핵심.
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 레벨에서 제어됨.
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>() [디바이스 정보]
```
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)
모듈 · 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 이스케이프)
현재까지 정적 분석으로 하드코딩된 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)
```
이 앱은 .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에서 인증서 체인 검사 수행
```
```smali
#
.method public checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V
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(무효)를 반환하면 통과하도록 변경.
```smali
#
.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 검증 자체를 호출하지 않음.
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)
```
본 보고서는 주식회사 아크링크 Deep-Coding 보안연구소가 피싱·몸캠피싱 피해자 구제를 목적으로 작성했습니다. 전체 열람·피해 상담: arklink.co.kr