İçeriğe geç
Aile TV’sini root etmeye çalıştım
  1. Kâğıt önce, cihaz sonra
  2. Root’un kalbi: üç kapılı koridor
  3. IR savaşı: 38 kHz’de günler, 56 kHz’de dakikalar
  4. Kernel kazısı ve kötü haber
  5. Reboot yalanı ve 40 dakikalık kaza
  6. Temizlik: TV’yi olduğu gibi geri vermek
  7. Kapanış: imkansızlık da sonuçtur
Tersine mühendislik8 dk okuma

Aile TV’sini root etmeye çalıştım: 8 gün, 56 kHz ve bitmeyen kapılar (dürüst kapanış)

Salonumuzun TV’si bir süredir bana bakıp bir soru soruyordu: “Beni gerçekten sahibi misin?” TCL 65T61C — Android TV 12, Realtek çipli, kumandası bile çift dilli (Bluetooth + IR) modern bir cihaz. Benimki daha teknik bir soruydu: bu cihaza yazılımsal root alınabilir mi? Cevabın “evet” olması gerekmiyordu; olması gereken şey kanıtı olan bir cevaptı. Sekiz gün sürdü. Bu yazı, o sekiz günün dürüst hikâyesi — kazandıklarımız, kaybettiklerimiz ve en sonunda matematikle kapanan kapı.

Kâğıt önce, cihaz sonra

İlk ders denemekten değil, okumaktan çıktı: TCL’nin güncelleme sunucusundan cihazın tam firmware paketini (~2 GB) indirdim ve hiçbir şeyi denemeden önce kâğıtta çözdüm. Paketin içinden daemon’lar, HAL servisleri, fabrika bölmesi ve boot imajı çıktı — kernel dahil. Canlı TV’de sadece doğrulama yaptım. Bu disiplin, cihazı sekiz gün boyunca tek bir gereksiz yeniden başlatmaya sokmadan çalışmamızı sağladı.

Firmware’de bir kapı buldum: TCL’nin teşhis servisi, doğru ayarla uid-1000 (system_app) olarak istediğim kodu çalıştırıyordu. Root değil — ama root yüzeyine uzanan parmaklar. Bu kapıdan daemon’u yöneten, fabrika veritabanına yazan küçük araçlar (M-jar’lar) koştum.

Root’un kalbi: üç kapılı koridor

TV’nin içinde tclfactoryos adlı root daemon çalışıyor. İçini satır satır çözdüm; içinde system() çağrısına açık bir komut işlemcisi var — yani kanal açılırsa root komutu çalıştırmak tek satır. O işlemciye giden tam üç yol vardı: fabrika kumandasının IR dizisi, fiziksel UART hattı ve TV’nin kendisinin dışarıya arayıp bağlandığı gizli bir p2p kanalı. Kapak açmayacaktım; UART düştü. Geriye IR ve p2p kaldı — ve ikisinin aslında tek kapı olduğu sonradan ortaya çıkacaktı.

IR savaşı: 38 kHz’de günler, 56 kHz’de dakikalar

Kumandanın dilini öğrenmek için kendi verici devremi kurdum: Arduino, transistörlü sürücü, kızılötesi LED. Günlerce kod gönderdim — TV’den tek ses yok. Zamanlama doğruydu, bit düzeni doğruydu, ışık çıkıyordu (telefon kamerası mor parıltıyı görüyordu). Sonunda ucuz bir alıcı modülüyle kumandanın kendi sinyalini ölçtüm ve gerçek bomba patladı: kaynakların hepsinde yazan 38 kHz yanlıştı; bu alıcı 56 kHz istiyordu. Protokolü yeniden kurdum: 24 bit, adres + komut + tersleri. 40 tuşun tamamının kodunu çıkardım; TV’yi artık kendi devremle tuş tuş kontrol ediyordum.

Kernel kazısı ve kötü haber

Root dizisi (IP + port yazıp TV’yi kendi bilgisayarıma bağlatan fabrika akışı) IR üzerinden gönderilebilirdi — teoride. Kernel sürücüsünü disassemble edince tablo netleşti: TV, tuş kodlarını bir tuş tablosuyla eşleştiriyor; tabloda olmayan her sinyal sessizce çöpe gidiyor. Fabrika dizisinin hane değerleri de tablodan geliyor. Son adım matematti: dizinin sabit 0x01 ve 0x0C marker baytlarının tabloda hiç yok olduğu görüldü. Yani bu firmware’de geçerli bir dizi hiçbir şekilde kurulamaz. İmkansızlık, ispatlandı.

Reboot yalanı ve 40 dakikalık kaza

Bu arada iki şey daha öğrenildi, ikisi de zor yoldan. Birincisi: bir keresinde fabrika modu açıkken TV’yi yeniden başlattım — TV piksel testi ekranına kilitlendi; kumanda ölü, Wi-Fi ölü, 40 dakika uğraşarak kurtardım. O günden sonra projenin değişmez kuralı oldu: reboot ancak benim onayımla. İkincisi: “veritabanına IP’yi yaz, reboot at, gizli kanal kalkar” umudunun da çürütülmesi gerekti. Disassembly gösterdi ki o kanalı doğuran kod açılışta hiç çalışmıyor — yalnızca geçerli IR dizisi doğuruyor. Reboot boşunaydı; kanıtlandı. riskli bir adım atılmadan önce kurtarıldı.

Temizlik: TV’yi olduğu gibi geri vermek

Projenin en kısa ama en önemli bölümü kapanıştı: fabrika veritabanına yazdıklarımı boşalttım, daemon’u bir daha açılmayacak şekilde kapattım, cihaza bıraktığım tüm araç jar’larını sildim, teşhis kapısını kilitledim ve ailenin Bluetooth kumandasını geri açtım. TV, bulduğumdan daha temiz bırakıldı. “Her adım geri alınabilir” baştan ilkeydi; sonunda yerine getirildi.

Kapanış: imkansızlık da sonuçtur

Root alamadım. Ama sekiz günün sonunda eldeki şey sıradan bir başarısızlık değil: cihazın fabrika katmanının tam haritası, 56 kHz keşfi, 40 tuşluk kod tablosu, kernel sürücüsünün çözümü, 20+ kapatılmış saldırı vektörünün gerekçeli envanteri ve yazılımsal root’un kanıtlı imkansızlık ispatı. Hepsi, gerçek devre fotoğrafı ve ham log kesitleriyle birlikte açık kaynak: github.com/4onurdemir/tcl-androidtv-root-attempts. İngilizce ve Türkçe. Kimseyi “root rehberi” vaadiyle kandırmıyor; bir sonraki meraklıya, benim günlerimi harcatan taşların yerini gösteriyor.

Ve bir “devam edebilir” notu: aynı ailenin başka modelinde tuş tablosu farklıysa, aynı zincir orada çalışabilir. Repoda kontrol tarifi de var. Belki bir gün birileri o taşı kaldırır.