Files
2026-10-27 15:56:27 +01:00

12 KiB

Hisense HE40E5600FFWTS — Root & Modding — Final Documentation

Ein Ordner, zwei Abteilungen, kein Suchen mehr. TV: Hisense HE40E5600FFWTS, FW V0100.01.00A.N0410, LAN 192.168.188.94 Host: Linux, Python 3, arm-linux-gnueabihf-*; Host-IP im Beispiel 192.168.188.150 Stand: 2026-10-26 — Root + Dropbear-SSH (key-only) + PTY live bestätigt; Boot-Persistenz installiert (Reboot-Test offen). SFTP optional (statischer OpenSSH-sftp-server + gepatchter Dropbear).


Die drei Fragen in 30 Sekunden

Welches Linux?

Hisense/MediaTek Embedded Linux, kein Standard-Distro:

  • Linux 3.18.25, ARMv7 (Cortex-A53, NEON/VFPv4), MediaTek MT53xx/MT5863-Klasse (mt53xx-emmc, mt5863_sa_768_linux)
  • glibc 2.18, BusyBox 1.18.5, SysV-Init (inittab/rcS/rc.local), kein systemd
  • Kein /etc/os-release; Firmware V0100.01.00A.N0410
  • squashfs-ro: / (38.8 MB, 100 %), /3rd (141 MB, 100 %)
  • ext4-rw: /3rd_rw (1.1 GB, 56 %), /data (1.9 GB), /perm (3.9 MB); /spdata ro
  • Kein overlayfs → Modding über rw-Partitionen + mount --bind

Gibt es einen Package Manager?

Nein. Kein apt, dpkg, opkg, ipkg, rpm, apk, yum, pacman; keine /etc/opkg//var/lib/dpkg.
Konsequenz: statische ARM-Binaries/Shell-Skripte bauen, per File.download/SSH/base64/tar nach /3rd_rw bringen. Kein opkg install.

Wo ist das UI und wie läuft es?

TV-UI = Web-UI im hisenseUI-Browser (root, GLES):

/basic/autorun.sh (Zeile 168)
  → /3rd/opera4x/hisenseUI/start-UI.sh
    → ./bin/hisenseUI --hw-gles --jsplugins-dir=/3rd/UI_jsplugins \
         --disable-web-security ... -u /3rd_rw/UI/index.html
  • UI: /3rd_rw/UI/index.html (PIXI), UI-Prozess hisenseUI (z. B. PID 589), DevTools 9223
  • Launcher/Apps: /3rd_rw/appdata/launcher/ mit preset.txt (26 vorinstallierte Tiles), Appinfo.json (User-Apps), deletedPresetApp.txt (ausgeblendet), data/Category*.xml, PicInfo.xml, res/
  • LauncherService: /3rd/launcherservice/bin/LauncherService (via startLS.sh aus delayrun.sh)
  • Native Apps / AM: /basic/app_man -c /basic/am_config -s /basic/am_start.ini; dtv_svc, netflix, dialserver, samba, browser_base, securetime, …; Steuerung :am,<app>,:<verb>=<val>
  • Web-Browser (nicht das TV-UI): hisense_browser (z. B. PID 1320), run-Browser.sh, --hw-dfb, --allow-file-access-from-files, DevTools 9224; hier läuft die Recon-Seite.

UI ≠ Browser: hisenseUI (TV-UI) und hisense_browser (Web-Browser) sind getrennte Prozesse mit eigenen Startskripten, Renderern, JS-Plugins und Debug-Ports.


Ordnerstruktur

hisense-he40e5600-root-modding/
├── README.md                         # diese Datei
├── dead-ends.md                      # kurze Liste der Sackgassen
├── SHA256SUMS
├── root/                             # ABTEILUNG 1: Root
│   ├── ROOT-GUIDE.md                 # kompletter Weg (manuell + Skripte)
│   ├── README.md                     # kurzer Index
│   ├── tools/
│   │   ├── server.py                 # Host: Recon + /pub + /cmd + /recon + /dump
│   │   ├── recon.html                # TV-Seite (fileXHR/listDir/HiBrowser-Hook)
│   │   ├── live_cmd.txt              # optionaler Live-Kanal (leer)
│   │   └── pub/                      # ausgelieferte Dateien
│   │       ├── libtvsysinfo.so       # finaler Root-Payload
│   │       ├── dropbear/dropbearkey  # statischer ARM-Dropbear 2022.83
│   │       ├── dropbear-sftp         # Dropbear mit SFTPSERVER_PATH=/3rd_rw/sshd/sftp-server
│   │       ├── sftp-server           # statischer OpenSSH-9.9p1-sftp-server
│   │       ├── authorized_keys       # dein Public Key
│   │       ├── start_sshd.sh         # Dropbear + passwd/PTY-Bindmounts
│   │       ├── root_loop.sh          # Root-Kommandokanal
│   │       ├── hamservice-wrapper.sh # Boot-Hook
│   │       ├── deploy_sshd.sh        # Installation als root
│   │       ├── verify.sh / rollback.sh
│   ├── scripts/
│   │   ├── host/
│   │   │   ├── prepare_usb.sh        # ext4/MBR-Stick + tvi-Symlink
│   │   │   ├── start_http.sh         # Server auf :9000
│   │   │   ├── plant_payload.js      # Payload durch tvi schreiben
│   │   │   ├── upload_to_appdata.js  # Dropbear/Deploy nach appdata
│   │   │   ├── run_root_cmd.js       # root_cmd/root_out
│   │   │   ├── build_payload.sh      # Payload reproduzieren
│   │   │   ├── build_tvi_payload.py  # Builder (deterministisch)
│   │   │   ├── build_dropbear.sh     # Dropbear aus sources/ bauen
│   │   │   ├── build_sftp_server.sh  # statischen sftp-server bauen
│   │   │   ├── patch_dropbear_sftp.py # Dropbear-SFTP-Pfad patchen
│   │   │   └── install_sftp.sh       # SFTP installieren/testen/auf 22 tauschen
│   │   └── tv/
│   │       ├── start_sshd.sh
│   │       ├── root_loop.sh
│   │       ├── hamservice-wrapper.sh
│   │       ├── deploy_sshd.sh
│   │       ├── verify.sh
│   │       ├── rollback.sh
│   │       ├── install_sftp_stage.sh # sftp-server + Test-Dropbear auf 2222
│   │       ├── enable_sftp.sh        # Tausch auf 22 planen
│   │       └── swap_sftp.sh          # Tausch detached ausführen
│   └── artifacts/
│       ├── tvi_original.so           # Original-Lib (33.220 B)
│       └── keys/{authorized_keys,host-key-fingerprint.txt}
├── modding/                          # ABTEILUNG 2: Modding
│   ├── README.md                     # Modding-Index/TL;DR
│   ├── 01-system-linux.md            # Linux/SoC/Userland/PackageManager/Storage
│   ├── 02-boot.md                    # Boot, autorun, developer.sh, Services
│   ├── 03-ui.md                      # hisenseUI vs hisense_browser, UI-Daten, AM
│   ├── 04-modding.md                 # Rezepte: eigene App/UI/Services/Bloat
│   ├── 05-bloat.md                   # 26 Preset-Apps, Service-Matrix, Deaktivieren
│   ├── 06-toolchain-deploy.md        # statisch ARM bauen/deployen, SSH/PTY
│   ├── 07-evidence-unknowns.md       # Belege, Status, bekannte Unknowns
│   └── templates/
│       ├── developer.sh              # früher Root-Boot-Hook
│       ├── custom-app.json           # Appinfo-Tile
│       ├── hide-preset.json          # deletedPresetApp.txt
│       ├── custom-ui.html            # minimale Custom-UI
│       ├── start-UI-custom.sh        # start-UI.sh mit custom.html
│       └── README.md
└── sources/
    ├── dropbear-2022.83.tar.bz2      # Offline-Buildquelle
    └── openssh-9.9p1.tar.gz          # Offline-Buildquelle für sftp-server

In 11 Schritten replizieren

# 1) Host: Stick (DESTRUKTIV)
sudo root/scripts/host/prepare_usb.sh /dev/sdX
# 2) Host: Server
root/scripts/host/start_http.sh
# 3) TV: http://<host-ip>:9000/recon.html öffnen
# 4) TV-Konsole: USB-Dev anpassen, plant_payload.js ausführen
#    -> /3rd_rw/loglevel/lib/libtvsysinfo.so (33500 B, SHA 37b13f…)
# 5) TV rebooten
# 6) Root prüfen: /3rd_rw/root_proof.txt = ROOT_EXEC_TVI
# 7) TV-Konsole: upload_to_appdata.js
# 8) TV-Konsole: run_root_cmd.js (deploy_sshd.sh)
# 9) ssh root@192.168.188.94
#10) Rollback: /bin/sh /3rd_rw/appdata/rollback.sh
#11) SFTP optional: root/scripts/host/install_sftp.sh
#    danach: sftp root@192.168.188.94

Vollständig: root/ROOT-GUIDE.md
Modding: modding/README.md
Sackgassen: dead-ends.md
Integrität: sha256sum -c SHA256SUMS


Was der Root-Weg macht (Kurz)

  1. Browser ist root: hisense_browser UID/GID 0, CapEff voll, Single-Process, kein Seccomp.
  2. USB-Schreibprimitive: dangling Symlink tvi auf ext4 → IsSubDentry-Bypass → neue Root-Datei.
  3. Loader-Shadow: libtvsysinfo.so ist direktes NEEDED; LD_LIBRARY_PATH-Index 17 ist /3rd_rw/loglevel/lib; dort liegt die Shadow-Lib.
  4. DT_INIT-Payload: appended Code am Dateiende, RX p_filesz/memsz erweitert, DT_INIT=0x81c4; unlink self, Proof, fork/exec root_loop.sh, Original-Init.
  5. Root-Loop: root_cmd.sh → root_out.txt.
  6. SSH: Dropbear 2022.83 statisch, key-only, /etc/passwd-Bind (Root-Home /3rd_rw/sshd/home), devpts auf /dev/shm/pts → bind /dev/pts (PTY), HamService-Wrapper für Boot-Persistenz.
  7. SFTP (optional): Dropbear hat keinen eigenen sftp-server; statischer OpenSSH-9.9p1-sftp-server + Dropbear mit SFTPSERVER_PATH=/3rd_rw/sshd/sftp-server. Installation testet Port 2222, dann Tausch auf 22; danach sftp root@….

Sicherheit / Spielregeln

  • Kein Flash, kein .pkg, kein Bootloader. Rootfs//3rd sind squashfs-ro; Änderungen nur in /3rd_rw, /data, /perm, Bind-Mounts.
  • SSH ist key-only root im LAN. Kein Passwort; privaten Key schützen; nicht ins Internet exponieren.
  • SFTP ist optional und root-equivalent. Key-only wie SSH; Installation testet zuerst 2222, Backup /3rd_rw/sshd/dropbear.nosftp, Rollback im Root-Guide.
  • Der Root-Loop ist root-equivalent. Wer root_cmd.sh schreiben kann (Browser root), kann Root-Befehle ausführen.
  • Backup vor UI-/AM-/Launcher-Eingriffen. Besonders /3rd_rw/UI/index.html, /3rd_rw/appdata/launcher/*, /basic/am_config/am_start.ini.
  • SSH/Root als Rettungsweg behalten. Kaputte UI = schwarzer Bildschirm; hisenseUI per SSH/root-Loop killen/neu starten, Seite aus Backup zurückholen.
  • developer.sh ist ein früher Root-Hook (vor ms_service/UI/app_man/delayrun); Fehler dort können den Boot/UI beeinflussen.
  • /3rd_rw/patch/opera4x ist ein full bind mount über /3rd/opera4x; nur mit vollständiger Kopie/Symlink-Baum; für einzelne Dateien lieber Datei-Bind-Mount via developer.sh.
  • Keine Secrets im Ordner: kein Root-Hash, kein privater SSH-Key; nur Public Key + Host-Fingerprint.
  • Nicht alles ist getestet: Root/SSH/PTY live; die Modding-Rezepte sind aus statischen/live Daten abgeleitet; Status in modding/07-evidence-unknowns.md.

Verifikationsstatus (Auszug)

Punkt Status
Browser root / CapEff voll CONFIRMED live
USB-ext4-Symlink-Bypass CONFIRMED live
libtvsysinfo-Shadow / DT_INIT CONFIRMED live (ROOT_EXEC_TVI, Self-Unlink)
Root-Loop / Kommandokanal CONFIRMED live (uid=0, root_out.txt)
Dropbear-SSH / Port 22 / Pubkey root CONFIRMED live
PTY / interaktive Shell CONFIRMED live (pts/0)
SFTP (optional) statischer sftp-server + gepatchter Dropbear; Installer testet 2222 vor 22; TV-Test nach Install
HamService-Boot-Persistenz eingerichtet; Reboot-Test im Root-Guide
Modding-Rezepte / Custom UI / Bloat UNVERIFIED (static/live abgeleitet, noch nicht alle ausgeführt)

Host-Key (SSH): SHA256:7tFL8xcKAh7+wC/3T5QiutxYMqcBTM7p+P4uEMAOwts
Dein Key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKLzgdRrwTGWMSHIurddPrQBY/2zOk+BlsU4jJWtPh/B (Fingerprint SHA256:RzgGjRHkR756azwKjS6mTClWOZFa/nyLMdi7TqgrHoY)


Provenienz

Der frühere Run-Ordner docs/re/20261025-vidaa-takeover/ (im alten Projekt) bleibt als Evidence/History erhalten. Für die Replikation und das Modding brauchst du ihn nicht: dieser Ordner enthält den finalen Stand, die Binaries, die Skripte und die Doku. Die alten Experimente/Dead Ends sind in dead-ends.md kurz zusammengefasst.