
JBL Wave Buds 2 (BES1306) फर्मवेयर के लिए रिवर्स-इंजीनियरिंग नोट्स और Python टूलिंग: OTA कंटेनर फ़ॉर्मेट, फ़्लैश लेआउट, BLE/GATT प्रोटोकॉल, और CRC-32 ट्रस्ट मॉडल।
JBL Wave Buds 2 (Bestechnic BES1306, PID 2100) के लिए रिवर्स-इंजीनियरिंग नोट्स और पुनरुत्पादनीय टूलिंग: ऑन-फ़्लैश लेआउट, बाइट-दर-बाइट OTA कंटेनर फ़ॉर्मेट, BLE/GATT कमांड प्रोटोकॉल और BES "TOTA v2" एन्क्रिप्टेड ट्रांसपोर्ट, डिवाइस- और ऐप-साइड ट्रस्ट सीमाएँ, फ़ैक्टरी कंसोल, और आपके स्वयं के यूनिट पर स्व-निर्मित इमेज लोड करने की एक पुनरुत्पादनीय विधि।
यह विश्लेषण दो बिल्ड्स पर फैला है — IDA-विश्लेषित wavebuds.elf (अप्रैल 2025) और वितरण पैकेज 2.9.0 (सितंबर 2026) — एक पूर्णतः निर्दिष्ट 8-स्ट्रीम OTA कंटेनर (बाइट-समान रीपैक द्वारा सत्यापित), ऐप और डिवाइस दोनों पक्षों पर पुष्ट CRC-32 इंटीग्रिटी मॉडल, एक 54/59-प्रविष्टि फ़ैक्टरी कमांड तालिका, 12 OTA RAM स्टेट वेरिएबल्स, एक 7,960-फ़ंक्शन गणना, और एक क्रॉस-बिल्ड डिफ़रेंशियल। OTA/फ़्लैश/CRC/फ़ैक्टरी सबसिस्टम्स के लिए सिमैंटिक रिकवरी गहन है और अन्यत्र केवल गणना-मात्र — देखें completeness audit।
[!WARNING] यह स्वामी द्वारा किया गया हार्डवेयर शोध है, कोई आधिकारिक JBL अपडेट नहीं। संशोधित इमेज फ़्लैश करना अपरिवर्तनीय है: डाउनलोड चरण चरणबद्ध और ब्रिक-सुरक्षित है, लेकिन CRC-वैध-परंतु-क्षतिग्रस्त इमेज के सक्रियण का कोई प्रदर्शित रिकवरी पथ नहीं है। कुछ भी पुनरुत्पादित करने से पहले SAFETY.md पढ़ें।
तुर्की संस्करण: README.tr.md

परीक्षित यूनिट पर हार्डवेयर परिणाम: ऐप + उपयोगकर्ता-CA MITM OTA पाइपलाइन के सत्यापित होने के बाद, दोनों ईयरबड्स कनेक्ट होते हैं, 100% रिपोर्ट करते हैं, और ऐप का प्रत्येक नियंत्रण (ANC/Ambient, जेस्चर, EQ) काम करता है। एक-बाइट-संशोधित इमेज को भी उसी तरह स्वीकार किया गया और डिवाइस पूरी तरह कार्यात्मक बना रहा।
पते विश्लेषित बिल्ड (wavebuds.elf) से हैं; देखें address ledger और provenance।
0x2C0918BC कॉन्फ़िग, प्रत्येक सेगमेंट, और पूरी इमेज को CRC-32 रूटीन 0x2C0CE944 (तालिका 0x2C0F5218) के साथ जाँचता है, साथ ही एक "BEST" मैजिक। एक संशोधित बाइट वाली CRC-वैध इमेज स्वीकार की गई और बूट हुई।com.jbl.counterfeit.Rsa2048DynamicVerifier) काउंटरफ़िट-विरोधी (डिवाइस प्रामाणिकता) है, फ़र्मवेयर हस्ताक्षर नहीं।0x28120000 पर कॉपी की जाती है जबकि चल रहा एप्लिकेशन अछूता रहता है, इसलिए डाउनलोड चरण ब्रिक-सुरक्षित है।0x2C0905E4: MEMORY[0x20026BA0] ∈ {2,4})।UNRESOLVED है।संशोधन जानबूझकर न्यूनतम है — डीकंप्रेस्ड इमेज का एक बाइट। यह डीकंप्रेस्ड ऑफ़सेट 64096 पर RTX कर्नेल स्ट्रिंग RTX V5.5.1 → V5.5.2 बदलता है, और कंटेनर CRC-32 की पुनर्गणना की जाती है। यह डिज़ाइन से कॉस्मेटिक है: उद्देश्य यह सिद्ध करना है कि डिवाइस संशोधित-परंतु-CRC-वैध इमेज स्वीकार करता है, व्यवहार बदलना नहीं।
Base (owner-supplied; not redistributed)
official 2.9.0 package 549,558 bytes SHA-256 836cb251f9fb2261dde14f39ba18d358c48018817f3c3d1b527e1ac5f3ab7ba2
decompressed image 955,596 bytes SHA-256 489663e80b76f20f4c94671064908569fac5f4e3df10ab6d7369baffe094f67d
container CRC-32 A0C7CCEC (valid), input range [0x0, 0x862AD)
रिपॉज़िटरी में जानबूझकर कोई JBL फ़र्मवेयर नहीं है। अपना स्वयं का वैध रूप से प्राप्त पैकेज प्रदान करें और पुनः उत्पन्न करें:
python3 tools/ota_unpack.py <official_2.9.0_package.bin> --extract image.bin
python3 tools/ota_repack.py make-test <official_2.9.0_package.bin> test.bin
python3 tools/ota_unpack.py test.bin # exactly one decompressed byte differs; CRC valid
रिपैक किए गए कंटेनर के सटीक बाइट्स LZMA एनकोडर पर निर्भर करते हैं; डिवाइस CRC-32 सत्यापित करता है, पैकेज हैश नहीं (देखें docs/04), और एक-बाइट डीकंप्रेस्ड अंतर नियतात्मक (deterministic) है। ऐप के माध्यम से डिलीवरी docs/08 में है।
| फ्लैश मैप | 2 MB NOR विभाजन |
| OTA कमांड प्रवाह | अनुक्रम और उसके CRC-32 चेकपॉइंट |
| ट्रस्ट सीमाएँ | प्रत्येक चरण क्या सत्यापित करता है, और इमेज ट्रस्ट कहाँ निहित है |