- सस्ते Bluetooth LE LED लाइट्स को Home Assistant से जोड़ने की reverse engineering प्रक्रिया में, 10M addressable LED string के छिपे हुए effect values आज़माते समय controller ने काम करना बंद कर दिया
- Android के Bluetooth HCI snoop और Wireshark/tshark से ऐप द्वारा लाइट्स पर लिखे जाने वाले BLE packets capture किए गए, और
btatt.opcode.method==0x12write requests में control bytes trace किए गए - iDeal LED ऐप के packets साधारण on/off values जैसे नहीं दिखे, और APK decompile करने व पहले से मौजूद analysis post देखने के बाद
libAES.soमें मौजूद fixed AES key से उन्हें decrypt किया गया - Decrypt किए गए on/off packets में fixed header और 5वें byte में
1/0का फर्क मिला, और color, brightness, effect functions बार-बार चलाकर byte patterns रिकॉर्ड किए गए - RGB के लिए ऐप द्वारा इस्तेमाल किए जाने वाले 5-bit range
0x1Fसे आगे 8-bit values भेजने पर ज्यादा bright colors संभव हुए, लेकिन effect number 12 भेजते ही लाइट्स बंद हो गईं और Bluetooth advertising भी गायब हो गई
सस्ते BLE लाइट्स को home automation से जोड़ने की शुरुआत
- Bluetooth LE से communicate करने और dedicated app रखने वाले devices को home automation system में integrate किया जा सकता है—इस premise पर कई सस्ते LED strips की reverse engineering की गई
- पहले £2.38 वाली Bluetooth LE controlled 5M non-addressable LED strip को कुछ ही घंटों में Home Assistant से जोड़ा गया था, और संबंधित code bj_led पर प्रकाशित किया गया है
- LEDnetWF controller की BLE reverse engineering का काम भी lednetwf_ble में है
- इस बार target था desk पर रखा 10M addressable LED string, जिसे “iDeal LED” ऐप से control किया जाता है
- ऐप में कई features हैं और यह अपेक्षाकृत अच्छी तरह काम करता है
- LED के WS2812 या उससे मिलते-जुलते product होने की संभावना है
- Product AliExpress से खरीदी गई लाइट है
ऐप द्वारा भेजे जाने वाले BLE bytes capture करना
- अपने software से device को control करने के लिए, पहले यह देखना जरूरी है कि ऐप Bluetooth के जरिए device को कौन-सी byte sequence भेजता है
- एक typical lighting protocol में header, on/off या color change जैसे command bytes, और checksum हो सकने वाला footer शामिल हो सकता है
- Android पर capture इस क्रम में किया गया
- Developer mode चालू किया
- Lighting app install किया
- Developer settings में
Bluetooth HCI snoopenable किया - ऐप में लाइट्स on/off करने जैसे actions किए
adb pull sdcard/btsnoop_hci.log .से log को computer पर copy किया
- Wireshark में log खोलने पर लाइट्स को भेजे गए bytes देखे जा सकते हैं
- Filter example:
bluetooth.dst == ff:ff:ff:ff:ff:ff && btatt.opcode.method==0x12 - MAC address को वास्तविक लाइट के MAC से बदलना होगा
btatt.opcode.method==0x12का मतलब है कि Android device से लाइट पर write operation हुआ
- Filter example:
- tshark का इस्तेमाल करने पर packet values सीधे terminal में निकाली जा सकती हैं
tshark -r <filename> -T fields -e btatt.valueLED controller पर लिखे गए payloads output करता है
सिर्फ replay करना iDeal LED protocol के लिए पर्याप्त नहीं था
- कुछ लाइट्स on/off action में लगभग सीधे पढ़े जा सकने वाले patterns दिखाती हैं
- Example:
69 96 02 01 01और69 96 02 01 00repeat होने जैसा pattern - आखिरी byte
1और0में बदलकर on/off दिखाता है
- Example:
- इस iDeal LED लाइट में काफी लंबी byte sequences repeat हुईं, और on/off से जुड़े दो तरह के packets अलग तो दिखे, लेकिन values noise जैसी लगीं
- अगर उद्देश्य सिर्फ on/off करना हो, तो capture की गई byte sequence को जस का तस फिर भेजने वाला replay काफी हो सकता है
gatttoolसे BLE device से connect करके bytes भेजे जा सकते हैं- भेजने वाला handle Wireshark में सत्यापित करना होगा
- अधिक control चाहिए था तो packet structure समझना जरूरी था, इसलिए Android app का analysis करने वाले चरण पर जाया गया
APK decompile करना और AES key ढूंढना
- APK download करके jadx में खोला और app code देखा गया
- Source में AES references दिखे, जिससे protocol encrypted होने की संभावना बनी
- Encrypted data के बारे में निम्न assumptions किए गए
- एक ही action का ciphertext हर बार नहीं बदलता, इसलिए कोई consistent key हो सकती है
- Low-power MCU पर जल्दी decrypt करना होता है, इसलिए छोटी key फायदेमंद है
- Key हर device के लिए unique न होकर fixed key हो सकती है
- ऐप में
libAES.soनाम की compiled AES library थी, जिसे सिर्फjadxसे analyze नहीं किया जा सकता था - किसी और व्यक्ति द्वारा
ida freeसे AES library decompile करके embedded key ढूंढने वाला analysis post मिला, और उस key को test किया गया Crypto.Cipherके AES ECB mode से decrypt करने पर on/off packets अर्थपूर्ण रूप में बदल गए- Decrypted values
05 54 55 52 4E 01 ...और05 54 55 52 4E 00 ...जैसी दिखीं - Fixed header के बाद 5वां byte
1या0में बदलकर on/off दिखाता है - बाकी bytes 0 से भरे होते हैं
- Decrypted values
- इस चरण से ऐप द्वारा भेजे गए packets decrypt करना और अपने code में वही control reproduce करना संभव हो गया
Feature-wise byte patterns रिकॉर्ड करना
- ऐप के सभी features एक-एक करके चलाते हुए transmitted bytes रिकॉर्ड करने के तरीके से protocol coverage बढ़ाई गई
- हर action को कई बार repeat किया गया, और sections अलग करने के लिए लाइट्स को off/on करने वाला pattern बीच में डाला गया
- Color को red, green, blue क्रम में कई बार बदला गया
- Brightness को 100%, 50%, 10%, 50%, 100% में बदला गया
- हर group के बीच off/on डालकर capture log में boundaries ढूंढना आसान किया गया
- इस तरीके से यह सत्यापित किया गया कि action के हिसाब से कौन-से bytes बदलते हैं, और recorded actions को captured packets से match किया जा सकता है
Controller को brick करने वाला effect number 12
- Color change की जांच करते समय पता चला कि ऐप red, green, blue values में
0x1Fसे बड़े values नहीं भेजता0x1F5-bit range है- सीधे 8-bit values भेजने पर ज्यादा bright colors काम करने लगे
- ऐप द्वारा इस्तेमाल किए जाने वाले 10 effects के अलावा extra effects हैं या नहीं, यह देखने के लिए
range(20)loop चलाकर effect numbers क्रम से भेजे गए- 1 से 10 तक सब सामान्य चला
- 11 पर hidden mode जैसा दिखने वाला behavior मिला
- 12 पर जाते ही लाइट्स बंद हो गईं
- इसके बाद लाइट्स फिर नहीं जलीं
- अब Bluetooth advertising नहीं करतीं
- Connection भी नहीं होता
- Power on करते समय button दबाए रखने पर भी recover नहीं होतीं
- रातभर power unplug रखकर भी वापस नहीं आईं
- अनुमान लगाया गया कि buffer overflow से firmware damage हुआ होगा, लेकिन cause confirm नहीं हुआ
- LED खुद standard addressable LED हैं, इसलिए इन्हें किसी दूसरे microcontroller से जोड़कर string को reuse किया जा सकता है
बाकी outputs और सावधानी
- Failure के बावजूद protocol का अधिकांश हिस्सा document किया गया, और Home Assistant custom component वाला GitHub project बनाया गया
- Component काम करता है, लेकिन इसी तरह के experiments lighting controller को खराब कर सकते हैं, इसलिए अपने risk पर ही आगे बढ़ें
1 टिप्पणियां
Hacker News की राय
FTA का “fixed header” कहने के बजाय यह ज़्यादा length byte जैसा लगता है (“command 5 bytes है”), इसमें command
TURN, argument 0/1, और बाकी को 16 bytes तक 0 से भरा गया है54 55 52 4Eबड़े अक्षरों मेंTURNहोने की वजह से तुरंत दिख जाता हैअगर आपको पता हो कि अंक
0x30, uppercase0x41, और lowercase0x61से शुरू होते हैं, तो hex dump में alphanumeric patterns ढूँढना आसान हो जाता हैछोटी strings के लिए यह ज्ञान काम आता है, लेकिन packets या memory dumps देखते समय standard hexdump format सबसे अच्छा रहता है
0x54 55 52 4Eसच मेंT U R Nहैuintहोने की संभावना ज़्यादा हैयह power supply problem हो सकती है। WS281x परिवार बहुत तेज़ brightness तक जा सकता है, और कई LEDs को साथ जोड़ने पर current बहुत ज़्यादा खिंचता है
100 LEDs वाली strip के लिए 12V 3A power supply पूरी strip को maximum brightness पर white में बस मुश्किल से चला पाती है, और वह बहुत चकाचौंध होती है
इसलिए मैं पहले उड़ा हुआ fuse देखूँगा। यह भी एक संकेत है कि firmware maximum brightness 255 में से सिर्फ 31 तक ही इस्तेमाल करता है
0x1fतक सीमित देख कर मैंने भी पहले यही सोचा था। किस्मत अच्छी हो तो power supply में fuse होगा, और शायद सिर्फ वही उड़ा होअगर उसे बचाया न भी जा सके, तो standard WS281x LED strings को Raspberry Pi से जोड़ा जा सकता है, और मेरा open source addressable LED controller भी इस्तेमाल किया जा सकता है :) https://github.com/mbevand/ledthemfight
इसमें built-in effects हैं, और इसे DIY के लिए बहुत modular बनाया गया है, इसलिए Python की सिर्फ दो lines में simple custom LED effect module बनाया जा सकता है। डेमो यहाँ है: https://youtu.be/qpd2rILsnM4
12V, लाल, हरा, नीला — कुल चार तार हैंयह individual addressable नहीं, बल्कि analog RGB strip लगती है जिसमें पूरी strip एक ही रंग में जलती है
https://www.aliexpress.com/item/1005005485885067.html
जो भी LED lighting के साथ छेड़छाड़ करना चाहता है, उसे WLED ज़रूर देखना चाहिए। इसमें बहुत सारे built-in effects हैं, web GUI है, controller के रूप में बहुत सस्ते ESP32 या ESP8266 का इस्तेमाल होता है, और sound reactive mode भी संभव है। मैं अभी indoor Christmas lights पर WLED चला रहा हूँ और यह बहुत अच्छा दिखता है
power usage सीमित करने का यह एक साफ-सुथरा तरीका है
बढ़िया लेख। मुझे याद है कि मैंने अपनी lights का reverse engineering करने की कोशिश की थी और पता चला कि वे encrypted हैं
एक amaran 60d थी और बाकी कुछ SmallRig RM75 battery LED lights थीं; मैं दोनों apps को अलग-अलग चलाने के बजाय एक ही script से सबको on/off करना चाहता था
apps और protocol का reverse engineering करने में मैंने काफ़ी समय लगाया, और दोनों lights एक ही negotiation procedure इस्तेमाल करती दिखीं, लेकिन शायद अलग libraries से implement की गई थीं
connection के समय होने वाले Diffie-Hellman key exchange की नकल करने की कोशिश की, लेकिन आखिर में छोड़ दिया। याद है कि उसके बाद एक-दो और steps थे, और पहला key भेजने के बाद वह फिर कुछ random दिखने वाले numbers (एक और key?) भेजती थी, लेकिन मैं समझ नहीं पाया कि वह क्या चाहती थी
यह लेख देखकर लग रहा है कि शायद मुझे बस hardcoded key डालकर देखना चाहिए कि काम करता है या नहीं
Elgato Stream Deck या Home Assistant के लिए open source integration बन जाए तो यह बड़ी सफलता होगी। डेस्क पर talking-head वीडियो शूट करने वाले YouTube creators के लिए यह phone app से lights control करने से कहीं बेहतर होगा
BLE-connected Christmas lights को automate करने की कोशिश करते-करते e-waste बना दिया। अब आप भी कर सकते हैं
iPhone के बारे में नहीं जानता, लेकिन Android पर इसे background में छोड़ दें तो phone के साफ-सुथरे GUI से BLE activity पकड़ सकते हैं। मैं इसे रोज़ इस्तेमाल करता हूँ
इससे मुझे वे keyboard MCU याद आ गए जो कुछ खास lighting commands मिलने पर brick हो जाते थे
OpenRGB को आखिरकार उस hardware पर उस module के auto-run को disable करना पड़ा था। कभी-कभी manufacturer software भी वही bug trigger कर देता था
दुर्भाग्य से, आम तौर पर system programming mode में जाने के लिए USB HID report भेजनी पड़ती थी, लेकिन affected devices तो enumerate होना भी बंद कर देते थे
वास्तव में firmware corrupt हुआ था या किसी और undefined behavior की वजह से hardware खराब हो गया था, यह अलग सवाल है
“wireless पर plaintext भेजना तो सुरक्षित नहीं है”
“चिंता मत करो, मैंने AES encryption डाल दी है”
pairing method ही ऐसी है। App
255.255.255.255पर packets blind broadcast करती है, और target device (bulb, plug वगैरह) promiscuous mode में इंतज़ार करता रहता हैpacket contents WPA2 वगैरह से सुरक्षित रहते हैं, लेकिन packet length सुरक्षित नहीं होती, इसलिए setup handshake के अगले character के ASCII byte value को हर packet की length बनाकर बहुत सारे छोटे packets भेजे जाते हैं। शायद इसे कई बार दोहराया भी जाता है
इसी वजह से pairing में 2 मिनट लगते हैं और timer 0 पर पहुँचने से ठीक पहले यह अचानक रुक जाती है
पिछले साल जब मैं अपने fireplace BLE controller का reverse engineering कर रहा था, तब मुझे सच में इसी बात की चिंता थी
खासकर
Set passwordcommand raw byte input लेता था, लेकिन OEM app सिर्फ length-limited numeric data भेजता थाअच्छी बात यह थी कि थोड़ी देर के लिए power कट जाए तो लगता था कि वह पहले जो कुछ हुआ था, सब भूल जाता है
इसलिए लगता है कि इसी brand के ज़्यादातर BLE controller default password
0000पर ही रह जाते हैं। एक बार power outage हो जाए तो आख़िरकार वही स्थिति वापस आ जाती है। अगर आप बहुत ही बोर हो रहे हों, तो यह BLE wardriving के लिए काफ़ी अच्छा material हो सकता हैमैंने भी अपने reverse engineering के नतीजों को Home Assistant integration के रूप में बनाया है(https://github.com/kaechele/napoleon-efire), और system व protocol documentation भी लिखी है(https://bonaparte.readthedocs.io/en/latest/index.html)
मैं car roof rack पर लगाने के लिए लचीली और मज़बूत lighting ढूँढ़ रहा हूँ
वह battery-powered होनी चाहिए, outdoor/all-weather के हिसाब से ठीक होनी चाहिए, और अच्छा होगा अगर battery box को cable tie से किसी surface पर आसानी से लगाया जा सके
संभव हो तो वह “mini” form factor
T5हो, और RGB में programmable भी हो ताकि Christmas पर लाल/हरा, Halloween पर बैंगनी/नारंगी जैसी seasonal themes चला सकूँजानना चाहता हूँ कि क्या किसी को ऐसा product पता है जो इन शर्तों पर खरा उतरता हो। पहली तीन शर्तें Walmart या Home Depot में मिल जाती हैं, लेकिन आख़िरी शर्त पूरी करने वाला ढूँढ़ना मुश्किल रहा
search करने पर बस बहुत noise मिलता है
[1] https://cdn.christmaslightsetc.com/images/CategoryDetail/788...
उदाहरण के लिए, 12V LED strips में IP67 waterproof वाले (जो silicone tube के अंदर आते हैं) आसानी से मिल जाते हैं [0], और Christmas lights जैसी string की तुलना में इनमें LEDs की संख्या बहुत ज़्यादा होती है, इसलिए effect भी कहीं ज़्यादा मजबूत होगा
लेकिन फिर आपको Arduino, ESP32, ESP8266 जैसे microcontroller खरीदकर उन्हें program करना होगा, और car battery से power कैसे लानी है यह भी खुद ही सुलझाना होगा [1]
electronics को car के अंदर रखकर सिर्फ wires को trunk के बाहर निकाला जा सकता है, और शायद मौजूदा trunk seal से waterproofing भी मिल जाए
[0] https://www.aliexpress.com/item/1005004289391906.html
[1] https://www.aliexpress.com/item/1005005977505151.html
extension के लिए दोबारा solder करना या chain में जोड़ना भी आसान है
https://www.aliexpress.com/item/4000105913323.html
मैंने जो पढ़ा है, उसके अनुसार ऐसे products या इसी तरह की 5V lights outdoor Christmas light shows में standard की तरह इस्तेमाल होते हैं
#projectsऔर#showcasechannels देखिए। वहाँ vehicles पर RGB LED lighting लगाने वाले कई projects मिलेंगेलेकिन सावधान रहें, यह एक ऐसा शौक है जिसमें बहुत आसानी से डूबा जा सकता है
invite link: https://discord.gg/eVhhh2Wh
क्या खराब हुई Christmas lights को खोलकर दिखा सकते हैं?
अंदर कौन-सा chip है यह पता चल जाए, तो इससे यह अंदाज़ा लगाने में मदद मिल सकती है कि उसमें flash memory है या नहीं, और dump करना कितना आसान होगा