1 puan yazan GN⁺ 2023-10-30 | 1 yorum | WhatsApp'ta paylaş
  • Tozo T6 kulak içi kulaklıkların eşleştirme, bağlanma ve bağlantıyı kesme sırasındaki sistem sesleri çok yüksek olduğu için, çözüm olarak firmware içindeki ses dosyalarının gain değerleri doğrudan düşürüldü
  • Yonga setinin Airoha AB1562 serisi olduğu tahmin edildi ve AirReps156X uygulaması üzerinden tanılama bilgilerine erişilebildiği ve değiştirilmiş firmware yükleme ihtimali olduğu doğrulandı
  • Tozo uygulamasının güncelleme kontrol trafiği mitmproxy ile yakalanarak /api/v1/getOtaVersionV3 yanıtından kulaklık firmware binary bağlantısı elde edildi
  • Firmware, sol ve sağ kulaklık için 2 FotaPackage ve 2 FileSystemImage dosyasından oluşuyordu; değiştirilmesi hedeflenen dosya sistemi imajının içinde mp3 dosyaları özgün halleriyle bulunuyordu
  • mp3gain ile mp3 dosyaları yeniden kodlanmadan veya uzunlukları değiştirilmeden yalnızca -19.5dB düşürüldü, ardından imaj içindeki baytlar değiştirilerek flashlandı; cihaz normal çalıştı ve ses çok daha düşük hale geldi

Çok yüksek sistem sesleri ve başlangıç varsayımları

  • Tozo T6 kulak içi kulaklıklar eşleştirme, bağlanma ve bağlantıyı kesme sırasında ses çalıyordu; bu ses, kullanıcının tercih ettiği seviyeden çok daha yüksekti
  • Ekolayzırda tüm frekans bantlarını birkaç dB düşürmek sorunu çözmedi; Tozo'ya e-posta ile sorulduğunda şirket yapabilecekleri bir şey olmadığını söyledi
  • Amaç, cihazda çalışan firmware'i değiştirerek ilgili ses dosyasının ses seviyesini düşürmekti
  • Başta birkaç varsayımla yola çıkıldı
    • Cihaza ait firmware binary dosyası çevrim içi bulunabilir
    • Firmware, ELF gibi anlaşılması kolay bir binary yapısına sahip olabilir
    • Ses dosyaları firmware'in içinde yer alıyor olabilir ve offset ile uzunluk bilinirse değiştirilebilir
    • Ses, PCM gibi basit bir formatta olabilir
    • Değiştirilmiş firmware, cihaza veya yonga setine yönelik araçlarla flashlanabilir
  • Gerçekte bu varsayımların birçoğu tutmadı; tersine mühendisliğin kendisinden çok proxy gibi analiz altyapısı kurmaya ve dolambaçlı yollar aramaya zaman harcandı

Cihaz ve yonga setinin belirlenmesi

  • Düşük maliyetli elektronik cihazlarda genellikle birden fazla taraf ve katman iç içedir
    • Ürünü kendi markasıyla satan vendor bu örnekte Tozo'dur
    • Firmware'i çalıştıran temel donanım olan bir yonga seti vardır
    • Yonga seti, ARM veya MIPS gibi temel teknolojilerden türetilmiş bir ISA kullanabilir
    • Ek yardımcı işlemciler veya donanım arayüzlerine yönelik işlevler entegre edilmiş olabilir
  • Tozo Android uygulaması disassemble edilirken Airoha SDK ve belirli yonga modeli referansları ile cihazla iletişim kuran temel işlevler bulundu
  • Reddit'teki AirPods kopyalarıyla ilgili /r/airreps topluluğundan ilerleme yönüne dair bilgi edinildi ve AirReps156X uygulaması da incelendi
  • AirReps156X uygulaması Airoha SDK'yı kullanıyor ve Airoha cihazları için tanılama bilgileri sağlayabiliyordu
  • Cihaz bu uygulamaya bağlandığında QW_1562U_SDK1.5.1 tanılama dizesi gösterildi; buna dayanarak cihazın yonga setinin Airoha AB1562 serisi olduğu değerlendirildi
  • AirReps156X uygulamasında yeni firmware flashlama işlevi de bulunduğundan, değiştirilmiş firmware'i cihaza yüklemek için kritik koşul sağlanmış oldu

Tozo uygulama trafiğinde firmware URL'sini bulmak

  • Tozo uygulaması kulaklığa bağlandığında mevcut firmware sürümünü ve güncel olup olmadığını gösterir
  • Uygulamanın en güncel firmware bilgisini kontrol etmek için sunucuyla iletişim kurduğu varsayıldı ve güncelleme kontrolü sırasında gerçek firmware dosyası URL'si bulunmaya çalışıldı
  • Decompile edilmiş kodu sonuna kadar okumaya dayalı statik analiz yerine, ağ isteklerini doğrudan görmeye dayalı dinamik analiz seçildi
  • Kablosuz NIC, hostapd ve mitmproxy ile araya giren bir proxy yapılandırıldı
  • Tozo APK'sı, kullanıcı CA deposundaki mitmproxy TLS sertifikasına güvenecek şekilde apktool ve uber apk signer ile yamalandı
    • Android uygulamaları çoğu durumda varsayılan olarak yalnızca sistem CA deposuna bakar
    • APK yamasıyla kullanıcı CA deposunu da kullanması sağlandı ve Android'de çalışabilmesi için yeniden imzalandı
  • Proxy yapılandırması AP ayarlarını, 80/443 trafiğini iptables ile mitmproxy portuna yönlendirmeyi ve NAT ayarlarını içeriyordu
  • Uygulama firmware sürümünün yanında “current” gösterdiğinde /api/v1/getOtaVersionV3 endpoint'ine istek gönderdi ve yanıtta gerekli firmware bin bağlantıları yer alıyordu

Firmware dosya yapısı ve analizi

  • Elde edilen firmware toplam 4 dosyadan oluşuyordu
    • Sol ve sağ kulaklıkların her biri için birer FotaPackage
    • Sol ve sağ kulaklıkların her biri için birer FileSystemImage
  • İki dosya sistemi imajı aynıydı; bu nedenle benzersiz dosyalar sol ve sağ için 2 FotaPackage ile 1 dosya sistemi imajı olmak üzere toplam 3 dosyaydı
  • Formatı ve gömülü dosyaları kontrol etmek için file, strings, hexdump ve binwalk kullanılmaya çalışıldı
  • Dosya sistemi imajında bazı dosya adı dizeleri görünüyordu, ancak binwalk beklenen mp3 dosyalarını bulamadı
  • mp3'lerde belirgin bir magic number veya footer olmadığı için rastgele bir binary içinde offset ve uzunluğu kesinleştirmek zordu
    • Başlangıç 0xFFFF veya 0xFFFE olabilir
    • İkisi de dosya tanımlayıcı olarak yeterince ayırt edici değildir
  • Dosya sistemi imajının yapısı anlaşılırsa her dosyanın başlangıç ve bitişinin bulunabileceği düşünüldü ve imaj formatını anlama yönünde ilerlenmeye karar verildi

Entropi analizi ve ROFS

  • Entropi analizi, dosyanın hangi bölümlerinin sabit değerlere, rastgele gürültüye veya ASCII metne yakın olduğunu ve geçiş noktalarını görselleştirmek için kullanışlıdır
  • Dosya sistemi imajı yapısı görülebilen bir formdaydı, ancak FotaPackage dosyaları sıkıştırılmış veya şifrelenmiş gibi görünüyordu
  • Sol ve sağ FotaPackage dosyalarında yalnızca header'ın bazı bölümleri seyrek şekilde farklıydı; gövde neredeyse aynıydı ve son yaklaşık 7KB'lık bölümde tamamen ayrışıyordu
  • Bu farkın tam olarak ne anlama geldiği doğrulanamadı, ancak opak bir dönüşüm uygulandığı ve büyük çaba harcamadan anlamlı bilgi elde etmenin zor olduğu sonucuna varıldı
  • Dosya sistemi imajı ASCII ROFS dizesiyle başlıyordu
  • ROFS hakkında herkese açık belge veya eşleşen format bilgisi bulunamadı; daha sonra bulunan Airoha SDK'da bu imajı okuyan arayüz uygulaması yer alıyordu
  • Bir ara FotaPackage'i çözme yolu denendi, ancak SDK'nın firmware'i aktarımdan önce dönüştürmediğini doğrulamak dışında sonuç vermedi

mp3'ü yeniden kodlamadan düşürmek

  • Dosyanın mp3 olması başlangıçta bir risk unsuruydu
    • mp3 encoder'larında birçok seçenek vardır ve bilinmeyen bir decoder belirli geçerli dosyaları işleyemeyebilir
    • Bağlandıktan hemen sonra çalan ses sorun çıkarırsa cihaz tekrar bağlanmadan önce çökebilir ve kurtarılamaz bir duruma gelebilir
  • mp3 yeniden kodlanırsa dosya uzunluğu değişebilir; bu durumda dosya sistemi imajındaki uzunluk bilgisinin de doğru şekilde güncellenmesi gerekebilirdi
  • Neyse ki mp3'te yeniden kodlama, uzunluk değişikliği veya metadata değişikliği olmadan gain ayarlanabiliyordu
  • Bu, JPEG'i yeniden kodlamadan döndürmeye benzer şekilde, iç veri yapısının yalnızca bir kısmını değiştirmeye yakın bir yöntemdi

SDK'dan gelen belirleyici ipucu

  • Yonga seti adıyla arama yapılarak Airoha SDK'nın bir kopyası bulundu; içinde cihazdan duyulanlarla aynı .mp3 dosyaları yer alıyordu
  • Hangi dosyanın başka bir binary içinde aynen bulunduğunu kontrol etmek için basit bir Python programı olan bincontains.py yazıldı
  • SDK'daki mp3 dosyalarının dosya sistemi imajında özgün halleriyle yer aldığı doğrulandı
    • Sıkıştırılmamışlardı
    • Bloklara bölünmemişlerdi
    • Dolayısıyla imaj içindeki offset ve uzunlukları hesaplanabiliyordu
  • ROFS ile ilgili SDK kodu kısaca incelendi ve checksum varlığını güçlü biçimde ima eden semboller görünmedi
  • Bu noktada, ek tersine mühendislik yapmadan değişiklik için gereken koşullar sağlanmıştı
    • Firmware dosyası ve flashlama yöntemi vardı
    • mp3 dosyasının imaj içindeki konumu ve uzunluğu biliniyordu
    • mp3 gain'i uzunluk değişmeden ayarlanabiliyordu
    • Yalnızca dosya içindeki bayt aralığını değiştirmenin dosya sistemi metadatasını bozmayacağı varsayıldı

Dosya sistemi imajını değiştirme ve flashlama

  • Bash betiği, SDK'daki mp3 dosyaları üzerinde dolaşarak dosya sistemi imajının içinde bulunan dosyayı aradı
  • İçerilen mp3 geçici bir dosyaya kopyalandıktan sonra mp3gain ile gain değeri düşürüldü
  • Kullanılan ayar değeri -19.5dB idi
  • Değiştirilmiş mp3'ün boyutunun özgün dosyayla aynı olduğu doğrulandıktan sonra, dd ile dosya sistemi imajındaki ilgili offset'e baytların üzerine yazıldı
  • Nihai firmware imajında binary diff, beklendiği gibi yalnızca birkaç baytın değiştiğini gösterdi
  • Değiştirilmiş firmware cihaza flashlandı; cihaz normal çalıştı ve sistem sesleri başlangıca göre çok daha sessiz hale geldi

Sonuç ve sınırlamalar

  • Firmware şifrelemesini çözmeye veya ROFS dosya sistemi formatının tamamını anlamaya gerek kalmadı
  • Aslında tersine mühendislik için harcanan zamanın büyük kısmı, nihai çözüm için doğrudan gerekli olmayan dolambaçlı yollara gitti
  • Sistem sesi seviyesini ayarlamak cihazın temel bir özelliği olsaydı böyle bir değişikliğe gerek kalmazdı
  • Ses çalan bir cihazda, cihazdan çıkan tüm seslere uygulanan ses seviyesi kontrolünün arayüz düzeyinde sunulması daha uygun olurdu
  • Bu durumda, firmware imajının içindeki mp3'lerin gain değerini düşürmek yeterli bir geçici çözüm oluşturdu

1 yorum

 
GN⁺ 2023-10-30
Hacker News yorumları
  • Benim Bluetooth uyku maskemi de biri böyle düzeltse keşke
    Genel olarak gayet iyi, ama pili azaldığında ya da kapanma zamanı geldiğinde bunu maksimum sesle bildiriyor
    Üstelik bir uyku maskesinde

    • Bu aslında epey komik. İlk öğrendiğinde nasıl deliye döndüğünü hayal edebiliyorum
      Benzer şekilde kusurlu bir çalar saat kullanmıştım; içinde MSF kablosuz zaman senkronizasyonu özelliği vardı
      Ama MSF zaman sinyaliyle yeniden senkronize olduğu her seferde alarm sesiyle aynı sesi 2-3 saniye boyunca çıkarıyordu ve kapatılamıyordu
      Hep sabaha karşı 3 gibi berbat bir saatte çaldığı için sonunda açıp MSF antenini kestim; saatin her zaman biraz yanlış olduğunu bilerek daha iyi uyudum
    • Benim Bluetooth kulak klipsim pil az uyarısını şöyle yapıyor: O anda çalan sesi kapatıyor, dramatik bir sessizlikten sonra “BATTERY LOW. PLEASE CHARGE NOW.” diyor, ardından bir dramatik sessizlik daha yaşatıp normal çalışmaya dönüyor
      O sırada telefondaki kişinin birkaç saniye boyunca ne dediğini yakalamaya çalışıyorum ama pek mümkün olmuyor
      Bu bildirim, hiçbir şey yapmamaktan çok daha kötü. Uyarı olmadığında en kötü ihtimal ses kesilir ve karşı tarafın söylediklerini kaçırırım; kulak klipsi de tam olarak bu etkiyi daha erken bir takvimle bilerek yaratıyor
      Bunu mevcut ses akışına göze batmayan bir bip deseni gibi karıştıramaması için hiçbir neden yok. Bir saniyeden kısa sürer ve önlemeye çalıştığı sorunu kendi yaratmaz
      Hayal etmesi zor kötü Bluetooth davranışlarından biri de sesli sohbet kullanınca normal bilgisayar seslerinin tamamının kaybolması. Sesli sohbet mikrofon girişini kullandığında Bluetooth cihazı “headset” moduna geçiyor; bu mod stereoyu monoya çeviriyor ve ses girişi sağlanırken ya da sağlanma ihtimali varken izin verilen tek çıkış hâline geliyor
      Ses girişini kullanmayan uygulamalar artık var olmayan Bluetooth kulaklık cihazına çalmaya çalışmaya devam ediyor, bu yüzden hepsi sessiz kalıyor
      Cihaz modlarının neden birden fazla olması gerektiğini anlamıyorum. Ailemle konuşmanın yan etkisi olarak özellik kaybetmek istemem için bir neden yok. Mikrofonun açılma ihtimali var diye iki kulağa aynı anda farklı ses sinyalleri çalmak ne kadar zor olabilir, anlamıyorum. Bluetooth olmayan cihazlar bunu hallediyor, üstelik dikkat çeken bir özellik olarak bile görülmüyor. “Mikrofonu kullanırken kulaklığın kapanmaması” neden özel bir şey olsun ki?
    • Sonunda 3,5 mm jak kablolu yastık hoparlörü kullanmaya başladım. Bluetooth’ta yaşadığım bu tür sorunlardan kaçabiliyorum
    • Bu ne işe yarayan bir cihaz? Uyumaya çalışırken neden Bluetooth bağlantısına ihtiyaç duyulduğunu merak ediyorum
    • Futurama’daki NNY şehir saati aklıma geldi. Ara sahnede son sesle “THE TIME IS FOUR AM” diye bağırıyordu
  • Harika! Sonuna kadar götüren asıl yazarı tebrik etmek lazım
    Yüksek sesli kulak içi kulaklıklardan söz açılmışken, bende de tam tersi sorun olabilir. Koşu bandında Bose spor kulak içi kulaklıklarımı rahat ve ölçülü olduğunu düşündüğüm bir ses seviyesinde kullanıyorum, ama iPhone sesin çok yüksek olduğunu ve işitme duyuma zarar verdiğimi söylüyor
    Telefon haklı mı? Öyleyse kulak sağlığım için keyiften biraz fedakârlık etmeye razıyım. Ama makul görünen başka bir hipotez de var: Bu kulaklıklar aynı ses ayarında kullandığım diğer ürünlere göre gerçek fiziksel ses seviyesi olarak belirgin biçimde daha düşük; Apple’ın tembel modellemesi de benim aldığım türden hatalı bildirimlere yol açıyor olabilir
    Apple, ürün modeli ve ses ayarını gerçek fiziksel ses seviyesine eşleyen bir veritabanı oluşturduysa takdir ederim. Ama bildirimde ve özellik açıklamasında hiçbir ayrıntı yok, bu yüzden güven vermiyor; Apple üniversite ödevi seviyesinde bir modeli gerçek ürüne koydu diye antrenmanımı daha kötü hâle getirmek istemiyorum
    Bu bildirimin arkasındaki veri biliminin sağlam olup olmadığını bilen var mı?

    • iOS’te Android’den özlediğim yalnızca iki şey var; ikisi de Bluetooth’un daha az berbat çalışmasıyla ilgili
      Birincisi, iOS’te Bluetooth kulak içi kulaklıklarımın minimum sesi çok yüksek. Denediğim tüm üçüncü taraf kulaklıklarda böyleydi ve internette 10 yıldır şikâyet ediliyor. AB bunu düzeltmeleri için yasa bile çıkardı ama spoiler: işe yaramadı
      Lütfen arayüzdeki minimum ses, donanım ses tamsayısı 1’e eşlensin
      İkincisi, üçüncü taraf uygulamalar otomobilin Bluetooth medya gezinme menüsünde müzik veya podcast gösteremiyor. Android’de bu mümkün
      Bu yüzden Android’de arabanın jog wheel’iyle podcast dinleyip Tidal’dan yayın yapabiliyorum, iOS’te yapamıyorum
      Başka Bluetooth şikâyetlerim de var. Apple Watch’um neden otomobil stereosunu kara listeye alıyor? iOS sürüm N ve N-1’in Bluetooth’u gerçekten çok hatalı
    • Benim telefonum da, Android 5 yüklü ve dürüst olmak gerekirse neredeyse hiç kullanmadığım için bozulana kadar yenisine ihtiyacım yok, yeniden başlatmadan sonra arabaya Bluetooth’la ilk kez bağlandığında aynı şeyi yapıyor
      Düpedüz aptalca bir özellik. Root edebilsem bir yerlerdeki ayar dosyasında o anahtarı kapatabilirdim, ama Samsung Galaxy J1 (2016) üzerinde bunu hiç başaramadım
    • İşletim sisteminin karşı taraftan kaç dB çıktığını bilebileceğini sanmıyorum
      Benim Bose da Bluetooth yonga setine göre farklı davranıyor. Linux’ta bir şeyi doğru düzgün duyabilmek için sesi %150’ye almam gerekiyor
    • Apple böyle bir eşleme oluşturmuş olsa bile piyasaya çıktığı andan itibaren eski veri olurdu
      Ama böyle bir şey yaptıklarına inanmak için bir neden yok. Kulaklık üreticileri Bluetooth bağlantısı sırasında dB aralığını raporlayıp böyle bir özelliği mümkün kılsa ilginç olurdu, ama böyle bir şey duymadım. 3,5 mm jakın aksine Bluetooth, böyle bir özelliği mümkün kılabilecek bir alan aslında
    • Gürültü engelleyen kulaklıklar/kulak içi kulaklıklar bu sorunu çözüyor
      Gürültü engellemeyi kullanınca sesi %20’nin altında tutarak, kulakları yormayan rahat bir dinleme mümkün oluyor
      Benim durumumda birkaç yıl önce uzun antrenmanlardan sonra kulak ağrısı başlamıştı; Apple bildirimleri muhtemelen haklıydı. Gürültü engellemeye geçtikten sonra tamamen kayboldu
  • Bu tür işleri gerçekten seviyorum. Bir anda bu kulaklık modeli epey ilginç gelmeye başladı
    Ek olarak, Bluetooth cihazların çıkardığı sistem sesleri, ürünler arasındaki farkı en güçlü hissettiren unsurlardan biri. Bazıları tamamen berbat: https://youtu.be/J2wPsH64JEM
    Ama incelemelerde ya da ürün sayfalarında o ürünün nasıl sesler çıkardığını gösteren bir şeye hiç rastlamadım. Günde birkaç kez duymak zorundasınız ve kapatmanın bir yolu da yok
    Sadece bu sesleri değiştirmeye izin vermek bile oldukça kolay bir farklılaşma yolu olabilir

    • AfterShokz kulaklığımın oynat/duraklat bip sesini kısabilsem keşke
      Kulak tıkacı takıp gürültülü bir atölyedeyken mükemmel, ama sessiz bir ofiste odaklanmak için müziği kısık açtığımda rahatsız edici oluyor ve insanı irkiltiyor
      Sistem seslerinin neden ses seviyesi ayarını takip etmediğini anlamıyorum
  • Telefonun bağlı kulaklığın bir hoparlör seti, in-ear monitör, kemik iletimli vb. olup olmadığını anlayabilmesi güzel olurdu
    Sıradan bir hoparlör seti kullanıp evin her yerinden duyulsun diye özellikle yüksek sesle açmak istediğimde “ses çok yüksek” uyarısı sinir bozucu oluyor
    Kemik iletimli kulaklıklarda iyi duymak için epey yüksek ses gerekiyor; bu yüzden iki kat sinir bozucu

  • Bunun firmware şifrelemesi olmayan Airoha hedefi olması iyi olmuş
    Merak edenler için firmware formatına yönelik bir 010 Editor şablonu da var
    https://github.com/ramikg/airoha-firmware-parser

  • Beceriyi takdir ediyorum, ama bir dosyanın oynatma sesini biraz değiştirmek kadar temel bir şey için bu kadar çaba gerekmesi üzücü
    Araçlarımızı istediğimiz gibi çalıştırmak için bu düzeyde uğraş gerekmemeli bence

  • Bu “anlaşılabilir” bir şey değil. Ürünün parasını ödedik ve bu düzeltilmesi gereken bir ürün sorunu

  • Bu yazıyı okuduktan sonra ikinci el bir Tozo T6 aldım; dışarıdan bakınca oldukça yakın zamanda üretilmiş gibi görünüyordu ama aynı şeyi yeniden üretemedim
    Resmî Tozo uygulaması kulaklığı tanımadı bile; AAC desteğiyle anlaşılabilecek Airoha yonga setini kullanıp kullanmadığını da doğrulayamadım. Benimki yalnızca SBC destekliyor
    Ya sahte bir ürün aldım ya da yazar satın aldıktan sonra iç donanımda değişiklik yapılmış gibi
    Bazı ses dosyaları internette bulunan kısmi Airoha SDK’sındakilerle aynı duyuluyor, ama başka yeni ses dosyaları da çalıyor
    Bu sonucu bağımsız olarak doğrulamak veya kurcalamak istiyorsanız sahte AirPods daha iyi bir yol olabilir

  • Yüksek ve kötü sistem seslerinden daha fazla kişinin şikâyet etmesini isterdim

  • Benim Sony WH-1000XM4 kulaklığımda da tamamen aynı sorun var; Sony firmware payload’unu şifreleyip cihazda çözüyor gibi görünüyor
    Neredeyse cihazı söküp her şeyi dump ederek inceleyecektim, ama ellerim titrediği için bozma ihtimalim çok yüksek
    Hack’lenebilir bir gürültü engelleme kulaklığı için epey para ödemeye razıyım