
ملاحظات هندسة عكسية وأدوات Python لبرنامج ثابت (firmware) لسماعات JBL Wave Buds 2 (BES1306): تنسيق حاوية OTA، وتخطيط الذاكرة الوميضية (flash layout)، وبروتوكول BLE/GATT، ونموذج الثقة CRC-32.
ملاحظات هندسة عكسية وأدوات قابلة لإعادة الإنتاج لسماعات JBL Wave Buds 2
(شريحة Bestechnic BES1306، معرّف المنتج 2100): تخطيط الذاكرة الوميضية (flash)،
وصيغة حاوية OTA حتى مستوى البايت، وبروتوكول أوامر BLE/GATT، والنقل المشفّر
"TOTA v2" من BES، وحدود الثقة على جانب الجهاز والتطبيق، ووحدة التحكم الخاصة
بالمصنع، وطريقة قابلة لإعادة الإنتاج لتحميل صورة مبنية ذاتيًا على وحدة تملكها.
يغطي التحليل نسختين — wavebuds.elf المُحلَّل بـ IDA (أبريل 2025) وحزمة
التوزيع 2.9.0 (سبتمبر 2026) — حاوية OTA محددة بالكامل من 8 تدفقات (تم التحقق
منها عبر إعادة تجميع مطابقة بايتًا ببايت)، ونموذج سلامة CRC-32 المؤكَّد على
جانبي التطبيق والجهاز، وجدول أوامر مصنع من 54/59 مدخلًا، و12 متغير حالة OTA في
RAM، وتعدادًا لـ 7,960 دالة، ومقارنة تفاضلية بين النسختين. الاسترداد الدلالي
عميق بالنسبة للأنظمة الفرعية الخاصة بـ OTA/الفلاش/CRC/المصنع، ومقتصر على
التعداد في ما عدا ذلك — راجع تدقيق الاكتمال.
[!WARNING] هذا بحث عتاد يُجريه المالك، وليس تحديثًا رسميًا من JBL. كتابة صورة معدّلة عملية لا رجعة فيها: مرحلة التنزيل مجزّأة وآمنة من الإفساد (brick-safe)، لكن تفعيل صورة صالحة وفق CRC لكنها معطوبة لا يملك مسار استرداد مكشوفًا. اقرأ SAFETY.md قبل إعادة إنتاج أي شيء.
النسخة التركية: README.tr.md

النتيجة على العتاد في الوحدة المُختبرة: بعد التحقق من خط أنابيب OTA عبر التطبيق + شهادة CA للمستخدم بنمط MITM، تتصل كلتا السماعتين وتُبلغا بنسبة 100%، ويعمل كل عنصر تحكم في التطبيق (ANC/Ambient، الإيماءات، EQ). قُبلت الصورة المعدّلة ببايت واحد بالطريقة نفسها وبقي الجهاز يعمل بكامل وظائفه.
العناوين مأخوذة من النسخة المُحلَّلة (wavebuds.elf)؛ راجع
سجل العناوين والمصدر.
0x2C0918BC من الإعدادات، ومن كل مقطع، ومن الصورة بأكملها
باستخدام روتين CRC-32 0x2C0CE944 (الجدول 0x2C0F5218) إضافة إلى سحر
"BEST". قُبلت صورة صالحة وفق CRC مع بايت واحد معدّل وتم إقلاعها.com.jbl.counterfeit.Rsa2048DynamicVerifier)
مخصّص لمكافحة التقليد (أصالة الجهاز)، وليس لتوقيع البرنامج الثابت.0x28120000 بينما يبقى
التطبيق قيد التشغيل دون مساس، لذا فإن مرحلة التنزيل آمنة من الإفساد.0x2C0905E4: MEMORY[0x20026BA0] ∈ {2,4}).UNRESOLVED.التعديل أدنى ما يمكن عمدًا — بايت واحد من الصورة بعد فك الضغط. يغيّر سلسلة
نواة RTX من RTX V5.5.1 إلى V5.5.2 عند الإزاحة بعد فك الضغط 64096،
ويُعاد حساب 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)، والفرق المُفكَّك الضغط ذو البايت الواحد حتمي. أما التسليم عبر التطبيق فهو في docs/08.
| خريطة الفلاش | تقسيم NOR بسعة 2 ميغابايت |
| تدفق أوامر OTA | التسلسل ونقاط تحقق CRC-32 الخاصة به |
| حدود الثقة | ما تتحقق منه كل مرحلة، وأين تكمن ثقة الصورة |