İçeriğe geç
Tersine mühendislik
Tüm projeler

TCL Android TV Root Denemeleri

Tersine mühendislik

Rol
Tersine mühendislik, donanım, dokümantasyon
Süre
8 gün, 2026
Kullanılanlar
Python, arduino, linux, hardware

Sorun

Neden yapıldı

Salonumuzda duran TCL 65T61C (Android TV 12, Realtek platformu) tek bir soruyla projeye dönüştü: “Bu cihazın içinde ne var ve root olabilir mi?” Amaç sızma değil, sahiplikti — cihaz bizim, yazılımı da anlaşılmalıydı. Kural baştan kondu: TV’nin kapağı hiç açılmayacak, aile etkilenmeyecek, her adım geri alınabilir olacak.

Yaklaşım

Yöntem

8 gün boyunca önce kâğıt, sonra cihaz: TCL’nin sunucusundan cihazın tam firmware paketi (~2 GB) indirildi ve daemon, HAL servisleri, hatta kernel image statik olarak çözüldü. Canlı TV’de yalnızca doğrulamalar yapıldı. TCL’nin teşhis servisindeki bir kapı keşfedildi: uid-1000 (system_app) olarak istenen kod çalıştırma. IR tarafında ise kumandanın dilini öğrenmek için kendi verici devremiz kuruldu.

Nasıl çalışıyor

Mimari

TV’nin içinde tclfactoryos adlı root daemon çalışıyor; içinde system() çağrısına açık bir komut işlemcisi var. Bu işlemciye giden tam 3 kanal vardı: fabrika kumanda dizisi (IR), fiziksel UART ve dışarıya kendi bağlanan p2p TCP kanalı. Yani root’a giden yol üç kapılı bir koridora benziyordu — ve çalışma, bu üç kapının da kilitlerini tek tek belgeledi.

Teknik özet

Bulgular

Kumandanın IR protokolü ölçerek çözüldü: kaynaklarda 38 kHz yazar ama alıcı 56 kHz ister — bütün erken denemelerin sessiz ölüm sebebi buydu. 40 tuşun tam kod tablosu çıkarıldı, TV kendi devremizle tuş tuş kontrol edildi. Kernel sürücüsü disassemble edilince fabrika tuşlarının özel type-0x19 olaylarıyla bildirildiği ve dizinin hane değerlerinin tuş tablosundan geldiği görüldü. Son adım matematikti: dizinin sabit 0x01/0x0C marker baytları tabloda hiç yok — hiçbir geçerli dizi kurulamaz.

Önemli değişiklik

Kırılma anları

Üç kırılma anı projeyi döndürdü: (1) ucuz bir alıcı modülüyle kumandanın sinyali ölçülünce 56 kHz gerçeği ortaya çıktı; (2) p2p kanalının daemon açılışında değil, yalnızca geçerli IR dizisinde doğduğu kanıtlandı — “reboot at, düzelir” umudunu öldüren bulgu; (3) transistör bacak sırasının kurulum kılavuzlarında yanlış yazıldığı (C–B–E) fark edildi. Ve bir kaza: P-mode açıkken atılan reboot TV’yi 40 dakika fabrika test ekranına kilitledi — projenin en değerli kuralı (reboot ancak onayla) bu kazadan doğdu.

Sonuç

Kapanış

Root alınamadı — ama kanıtla kapatıldı: bu firmware’de yazılımsal root kurulamaz, çünkü fabrikanın kendi tuş tablosu dizinin sabit baytlarını içermiyor. 20+ kapatılmış saldırı vektörü gerekçeleriyle envanterlendi. Çalışma biterken TV tüm izlerden temizlendi: daemon bir daha açılmayacak şekilde kapatıldı, araçlar silindi, Bluetooth geri açıldı. Her şey — dokümantasyon, araçlar, kanıt kesitleri — açık kaynak repoda: github.com/4onurdemir/tcl-androidtv-root-attempts

Ekranlar

Kanıtlar

Yukarıdaki fotoğraf, TV ile konuşan gerçek devre: Arduino Uno + 2N2222A sürücü + 940nm IR LED. Bu devre TV’nin sesini açıp kapattı ve tüm fabrika problarını taşıdı. Log kesitleri, ham IR ölçümleri ve kernel tuş tablosu repoda: github.com/4onurdemir/tcl-androidtv-root-attempts

Ne öğrendim

Dersler

En büyüğü: ölçmeden inanma. Ne veritabanları ne kernel kaynağı, bu alıcının gerçek taşıyıcısını yazmıyordu. İkincisi: her iddianın ölçütü “ışık çıktı” değil, “TV’de gözlenen etki + log kaydı” olmalı. Üçüncüsü: imkansızlık da sonuçtur — kanıtlı bir kapanış, yarı bırakılmış bir başarıdan değerlidir. Ve dördüncüsü: ölü yolları belgeleyerek öldür; hafızası olmayan proje aynı taşı iki kez kaldırır.

Sıradaki dal senin projen

Ne yapmak istediğini birkaç cümleyle yaz. Genelde aynı gün, en geç ertesi gün dönüyorum.

Şu an yeni işlere açığım: proje bazlı serbest işler, uzaktan ya da İstanbul’da yerinde. Bir web platformu, eğitilecek bir model ya da inatçı bir cihaz; hangisiyse yaz ya da ara.