
Documenta il reverse engineering di un layer di fabbrica TCL Android TV: protocollo IR a 56 kHz, daemon tclfactoryos, driver IR del kernel e prove che il root software è irraggiungibile.

🌐 Lingue: Inglese (questo file) · 🇹🇷 Türkçe
Otto giorni, un TCL 65T61C, un Arduino Uno e centinaia di porte chiuse. Questo repo non è una "guida al root" — è un rapporto di chiusura: il livello di fabbrica/servizio del TV è stato mappato dall'inizio alla fine, è stato dimostrato — con prove — che il root software è irraggiungibile su questo firmware, e tutto è stato documentato così che il prossimo ricercatore non debba ripercorrere il cimitero.
La storia in breve: dentro il TV gira un demone root chiamato tclfactoryos, e dentro
esso gira un processore di comandi con una chiamata system() alle spalle. Tre canali
portano lì: IR, UART e p2p. Abbiamo completamente fatto reverse engineering del protocollo
IR (56 kHz!), disassemblato il driver del kernel e dimostrato che i byte marcatore fissi
della sequenza di tasti di fabbrica semplicemente non esistono nella tabella dei tasti
del TV — nessuna sequenza valida può mai essere trasmessa. La UART è fisica; il thread
p2p viene generato solo da una sequenza IR valida. La superficie software: esaurita.
Questo repo è l'intero percorso.
Una nota sulle lingue: questo README è in inglese, e così è la documentazione completa: i sette documenti di fase si trovano in
docs/en/(gli originali turchi indocs/). I commenti al codice seguono l'inglese dove conta.
| Modello | TCL 65T61C (65", Android TV 12) |
| Piattaforma | Realtek RTD2875P / rtd6748 |
| Firmware | V8-R75PT01-LF1V618 (build STT2.230203.001 release-keys) |
| Kernel | 5.4.284+ · patch di sicurezza 2025-12-05 |
| Telecomando | RC833A dual-mode (Bluetooth HID + IR) |

Il rig reale che ha comunicato con il TV: Arduino Uno + driver 2N2222A + LED IR da 940 nm — fotografato durante le sessioni. Questo circuito alzava e abbassava il volume del TV, tasto per tasto, e ha veicolato ogni sonda di fabbrica in docs/04.
La ricerca è stata condotta su un dispositivo di proprietà dell'autore, rigorosamente all'interno della propria rete domestica. Il TV non è mai stato aperto; nessuna scrittura persistente, nessuna manomissione di chiavi/MID/SN; il dispositivo è stato riportato allo stato di fabbrica nel momento in cui il lavoro è terminato.
ADDR(4)|CMD(8)|~ADDR(4)|~CMD(8) a 24 bit
MSB-first, bit = mark di 500 µs + spazio di 1000/2000 µs. Tabella completa dei 40
codici tasto: data/TCL-kumanda-kodlari.md.w19 a 32 bit; la
tabella dei tasti confronta questi valori (VOL+ = 0x0b0f4f00, verificato byte per
byte). I tasti di fabbrica emergono come eventi di input speciali type-0x19 — e il
byte argomento proviene dalla tabella dei tasti, non dal frame.0x01 e 0x0C; quei valori devono provenire dalla famiglia di cifre
della tabella ({b2,a3,f7,ac,81,58,92,ef}); lì non esistono. Nessuna sequenza
valida può essere costruita. In più, il flag di modalità report che abilita
l'emissione di type-0x19 si trova dietro un sysfs accessibile solo da root.Ogni affermazione è stata verificata rispetto a log/getevent/disassembly; estratti di esempio:
data/kanit-ornekleri.md · log grezzo delle misurazioni IR:
data/tus_kaydi_ham.log · la tabella dei tasti del kernel stessa:
data/ir_table.bin (+ parser: tools/arduino/ir_tablo_parse.py).
docs/ the seven phase documents — Turkish originals
docs/en/ the same seven documents, fully in English
tools/arduino/fabrika/ the universal IR blaster (fabrika.ino + firing script)
tools/arduino/{kumanda,tus_kaydet,ogren_gonder,ses_ac_oto}/ the IR tool-chain sketches
tools/arduino/rcu_hesap.py RCU 13-byte + CRC16-CCITT-FALSE generator (note: legacy word format — docs/04)
tools/factorysock.py client for the 27856 factory socket
tools/p2pclient.py ts-protocol client skeleton
data/ key table + kernel ir_table.bin + raw log + evidence excerpts
assets/ cover GIF + real-rig photo + receiver/TV wiring guide (PDF)