Bluetooth Kulak İçi Kulaklıklarımın Ses Seviyesini Ayarlamak
(blog.ornx.net)- 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/getOtaVersionV3yanı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
mp3gainile 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/airrepstopluluğ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.1tanı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,
hostapdvemitmproxyile araya giren bir proxy yapılandırıldı - Tozo APK'sı, kullanıcı CA deposundaki mitmproxy TLS sertifikasına güvenecek şekilde
apktoolveuber apk signerile 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
iptablesile 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/getOtaVersionV3endpoint'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
- Sol ve sağ kulaklıkların her biri için birer
- İ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,hexdumpvebinwalkkullanılmaya çalışıldı - Dosya sistemi imajında bazı dosya adı dizeleri görünüyordu, ancak
binwalkbeklenen 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ıç
0xFFFFveya0xFFFEolabilir - İkisi de dosya tanımlayıcı olarak yeterince ayırt edici değildir
- Başlangıç
- 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
ROFSdizesiyle başlıyordu ROFShakkı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ı
.mp3dosyaları 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.pyyazı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
mp3gainile 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,
ddile 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
ROFSdosya 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
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
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
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?
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ı?
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ı
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
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
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ü 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
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