UART

Support HackTricks

Basic Information

UART एक सीरियल प्रोटोकॉल है, जिसका अर्थ है कि यह डेटा को एक समय में एक बिट के रूप में घटकों के बीच स्थानांतरित करता है। इसके विपरीत, समानांतर संचार प्रोटोकॉल डेटा को एक साथ कई चैनलों के माध्यम से प्रसारित करते हैं। सामान्य सीरियल प्रोटोकॉल में RS-232, I2C, SPI, CAN, Ethernet, HDMI, PCI Express, और USB शामिल हैं।

आमतौर पर, लाइन को उच्च (एक तार्किक 1 मान पर) रखा जाता है जबकि UART निष्क्रिय स्थिति में होता है। फिर, डेटा ट्रांसफर की शुरुआत को संकेत देने के लिए, ट्रांसमीटर रिसीवर को एक स्टार्ट बिट भेजता है, जिसके दौरान सिग्नल को निम्न (एक तार्किक 0 मान पर) रखा जाता है। इसके बाद, ट्रांसमीटर वास्तविक संदेश को शामिल करते हुए पांच से आठ डेटा बिट्स भेजता है, इसके बाद एक वैकल्पिक पैरीटी बिट और एक या दो स्टॉप बिट्स (एक तार्किक 1 मान के साथ) होते हैं, जो कॉन्फ़िगरेशन के आधार पर होते हैं। पैरीटी बिट, जिसका उपयोग त्रुटि जांच के लिए किया जाता है, व्यावहारिक रूप से कभी-कभी देखा जाता है। स्टॉप बिट (या बिट्स) ट्रांसमिशन के अंत का संकेत देते हैं।

हम सबसे सामान्य कॉन्फ़िगरेशन को 8N1 कहते हैं: आठ डेटा बिट्स, कोई पैरीटी नहीं, और एक स्टॉप बिट। उदाहरण के लिए, यदि हम अक्षर C, या ASCII में 0x43 भेजना चाहते हैं, तो 8N1 UART कॉन्फ़िगरेशन में, हम निम्नलिखित बिट्स भेजेंगे: 0 (स्टार्ट बिट); 0, 1, 0, 0, 0, 0, 1, 1 (बाइनरी में 0x43 का मान), और 0 (स्टॉप बिट)।

UART के साथ संवाद करने के लिए हार्डवेयर उपकरण:

  • USB-टू-सीरियल एडाप्टर

  • CP2102 या PL2303 चिप्स के साथ एडाप्टर

  • बहुउद्देशीय उपकरण जैसे: बस पायरेट, एडाफ्रूट FT232H, शिक्र, या अटिफाई बैज

Identifying UART Ports

UART के 4 पोर्ट होते हैं: TX(Transmit), RX(Receive), Vcc(Voltage), और GND(Ground)। आप PCB में TX और RX अक्षरों के साथ 4 पोर्ट पा सकते हैं। लेकिन यदि कोई संकेत नहीं है, तो आपको मल्टीमीटर या लॉजिक एनालाइज़र का उपयोग करके उन्हें स्वयं खोजने की आवश्यकता हो सकती है।

एक मल्टीमीटर के साथ और डिवाइस बंद होने पर:

  • GND पिन की पहचान करने के लिए Continuity Test मोड का उपयोग करें, पीछे के लीड को ग्राउंड में रखें और लाल लीड के साथ परीक्षण करें जब तक कि आप मल्टीमीटर से ध्वनि न सुनें। PCB में कई GND पिन मिल सकते हैं, इसलिए आप UART से संबंधित पिन पा सकते हैं या नहीं।

  • VCC पोर्ट की पहचान करने के लिए, DC वोल्टेज मोड सेट करें और इसे 20 V वोल्टेज पर सेट करें। काले प्रॉब को ग्राउंड पर और लाल प्रॉब को पिन पर रखें। डिवाइस को चालू करें। यदि मल्टीमीटर 3.3 V या 5 V का स्थिर वोल्टेज मापता है, तो आपने Vcc पिन पा लिया है। यदि आपको अन्य वोल्टेज मिलते हैं, तो अन्य पोर्ट के साथ पुनः प्रयास करें।

  • TX पोर्ट की पहचान करने के लिए, DC वोल्टेज मोड को 20 V वोल्टेज तक सेट करें, काले प्रॉब को ग्राउंड पर और लाल प्रॉब को पिन पर रखें, और डिवाइस को चालू करें। यदि आप पाते हैं कि वोल्टेज कुछ सेकंड के लिए उतार-चढ़ाव करता है और फिर Vcc मान पर स्थिर हो जाता है, तो आपने सबसे अधिक संभावना TX पोर्ट पा लिया है। इसका कारण यह है कि जब पावर ऑन होता है, तो यह कुछ डिबग डेटा भेजता है।

  • RX पोर्ट अन्य 3 के सबसे करीब होगा, इसमें सबसे कम वोल्टेज उतार-चढ़ाव और सभी UART पिनों का सबसे कम कुल मान होगा।

आप TX और RX पोर्ट को भ्रमित कर सकते हैं और कुछ नहीं होगा, लेकिन यदि आप GND और VCC पोर्ट को भ्रमित करते हैं तो आप सर्किट को जला सकते हैं।

कुछ लक्षित उपकरणों में, UART पोर्ट को निर्माता द्वारा RX या TX या यहां तक कि दोनों को बंद करके अक्षम किया गया है। इस मामले में, सर्किट बोर्ड में कनेक्शनों को ट्रेस करना और कुछ ब्रेकआउट पॉइंट ढूंढना सहायक हो सकता है। UART की कोई पहचान न होने और सर्किट के टूटने के बारे में एक मजबूत संकेत यह है कि डिवाइस की वारंटी की जांच करें। यदि डिवाइस कुछ वारंटी के साथ भेजा गया है, तो निर्माता कुछ डिबग इंटरफेस (इस मामले में, UART) छोड़ता है और इसलिए, UART को डिस्कनेक्ट किया होगा और डिबगिंग के दौरान इसे फिर से जोड़ देगा। इन ब्रेकआउट पिनों को सोल्डरिंग या जम्पर वायर के माध्यम से जोड़ा जा सकता है।

Identifying the UART Baud Rate

सही बौड दर की पहचान करने का सबसे आसान तरीका TX पिन के आउटपुट को देखना और डेटा पढ़ने का प्रयास करना है। यदि आपको प्राप्त डेटा पढ़ने योग्य नहीं है, तो अगले संभावित बौड दर पर स्विच करें जब तक डेटा पढ़ने योग्य न हो जाए। आप USB-टू-सीरियल एडाप्टर या बस पायरेट जैसे बहुउद्देशीय उपकरण का उपयोग कर सकते हैं, जो एक सहायक स्क्रिप्ट, जैसे baudrate.py के साथ जोड़ा गया हो। सबसे सामान्य बौड दर 9600, 38400, 19200, 57600, और 115200 हैं।

यह ध्यान रखना महत्वपूर्ण है कि इस प्रोटोकॉल में आपको एक डिवाइस के TX को दूसरे के RX से कनेक्ट करना होगा!

CP210X UART to TTY Adapter

CP210X चिप का उपयोग कई प्रोटोटाइपिंग बोर्डों में किया जाता है जैसे NodeMCU (esp8266 के साथ) सीरियल संचार के लिए। ये एडाप्टर अपेक्षाकृत सस्ते होते हैं और लक्षित UART इंटरफेस से कनेक्ट करने के लिए उपयोग किए जा सकते हैं। डिवाइस में 5 पिन होते हैं: 5V, GND, RXD, TXD, 3.3V। सुनिश्चित करें कि लक्षित द्वारा समर्थित वोल्टेज से कनेक्ट करें ताकि कोई नुकसान न हो। अंततः एडाप्टर के RXD पिन को लक्षित के TXD से और एडाप्टर के TXD पिन को लक्षित के RXD से कनेक्ट करें।

यदि एडाप्टर का पता नहीं चलता है, तो सुनिश्चित करें कि CP210X ड्राइवर होस्ट सिस्टम में स्थापित हैं। एक बार जब एडाप्टर का पता लगाया जाता है और कनेक्ट किया जाता है, तो picocom, minicom या screen जैसे उपकरणों का उपयोग किया जा सकता है।

Linux/MacOS सिस्टम से जुड़े उपकरणों की सूची बनाने के लिए:

ls /dev/

UART इंटरफेस के साथ बुनियादी इंटरैक्शन के लिए, निम्नलिखित कमांड का उपयोग करें:

picocom /dev/<adapter> --baud <baudrate>

minicom के लिए, इसे कॉन्फ़िगर करने के लिए निम्नलिखित कमांड का उपयोग करें:

minicom -s

Configure the settings such as baudrate and device name in the Serial port setup option.

After configuration, use the command minicom to start get the UART Console.

UART Via Arduino UNO R3 (Removable Atmel 328p Chip Boards)

यदि UART Serial to USB adapters उपलब्ध नहीं हैं, तो Arduino UNO R3 का उपयोग एक त्वरित हैक के साथ किया जा सकता है। चूंकि Arduino UNO R3 आमतौर पर कहीं भी उपलब्ध है, यह बहुत सारा समय बचा सकता है।

Arduino UNO R3 में बोर्ड पर ही एक USB to Serial adapter बना होता है। UART कनेक्शन प्राप्त करने के लिए, बस Atmel 328p माइक्रोकंट्रोलर चिप को बोर्ड से निकालें। यह हैक Arduino UNO R3 वेरिएंट पर काम करता है जिनमें Atmel 328p बोर्ड पर सोल्डर नहीं किया गया है (इसमें SMD संस्करण का उपयोग किया गया है)। Arduino के RX पिन (Digital Pin 0) को UART इंटरफेस के TX पिन से और Arduino के TX पिन (Digital Pin 1) को UART इंटरफेस के RX पिन से कनेक्ट करें।

अंत में, Serial Console प्राप्त करने के लिए Arduino IDE का उपयोग करने की सिफारिश की जाती है। मेनू में tools अनुभाग में, Serial Console विकल्प चुनें और UART इंटरफेस के अनुसार baud rate सेट करें।

Bus Pirate

इस परिदृश्य में हम Arduino के UART संचार को स्निफ़ करने जा रहे हैं जो प्रोग्राम के सभी प्रिंट को Serial Monitor पर भेज रहा है।

# Check the modes
UART>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. KEYB
9. LCD
10. PIC
11. DIO
x. exit(without change)

# Select UART
(1)>3
Set serial port speed: (bps)
1. 300
2. 1200
3. 2400
4. 4800
5. 9600
6. 19200
7. 38400
8. 57600
9. 115200
10. BRG raw value

# Select the speed the communication is occurring on (you BF all this until you find readable things)
# Or you could later use the macro (4) to try to find the speed
(1)>5
Data bits and parity:
1. 8, NONE *default
2. 8, EVEN
3. 8, ODD
4. 9, NONE

# From now on pulse enter for default
(1)>
Stop bits:
1. 1 *default
2. 2
(1)>
Receive polarity:
1. Idle 1 *default
2. Idle 0
(1)>
Select output type:
1. Open drain (H=Hi-Z, L=GND)
2. Normal (H=3.3V, L=GND)

(1)>
Clutch disengaged!!!
To finish setup, start up the power supplies with command 'W'
Ready

# Start
UART>W
POWER SUPPLIES ON
Clutch engaged!!!

# Use macro (2) to read the data of the bus (live monitor)
UART>(2)
Raw UART input
Any key to exit
Escritura inicial completada:
AAA Hi Dreg! AAA
waiting a few secs to repeat....

Dumping Firmware with UART Console

UART Console एक शानदार तरीका है जो रनटाइम वातावरण में अंतर्निहित फर्मवेयर के साथ काम करने के लिए प्रदान करता है। लेकिन जब UART Console का एक्सेस केवल पढ़ने के लिए होता है, तो यह कई सीमाएँ पेश कर सकता है। कई एम्बेडेड उपकरणों में, फर्मवेयर EEPROMs में संग्रहीत होता है और उन प्रोसेसर्स में निष्पादित होता है जिनकी वोलाटाइल मेमोरी होती है। इसलिए, फर्मवेयर को पढ़ने के लिए केवल रखा जाता है क्योंकि निर्माण के दौरान मूल फर्मवेयर EEPROM के अंदर होता है और कोई भी नए फ़ाइलें वोलाटाइल मेमोरी के कारण खो जाती हैं। इसलिए, एम्बेडेड फर्मवेयर के साथ काम करते समय फर्मवेयर को डंप करना एक मूल्यवान प्रयास है।

यह करने के कई तरीके हैं और SPI अनुभाग विभिन्न उपकरणों के साथ EEPROM से सीधे फर्मवेयर निकालने के तरीकों को कवर करता है। हालांकि, यह अनुशंसा की जाती है कि पहले UART के साथ फर्मवेयर को डंप करने की कोशिश करें क्योंकि भौतिक उपकरणों और बाहरी इंटरैक्शन के साथ फर्मवेयर को डंप करना जोखिम भरा हो सकता है।

UART Console से फर्मवेयर को डंप करने के लिए पहले बूटलोडर्स तक पहुंच प्राप्त करना आवश्यक है। कई लोकप्रिय विक्रेता लिनक्स को लोड करने के लिए अपने बूटलोडर के रूप में uboot (यूनिवर्सल बूटलोडर) का उपयोग करते हैं। इसलिए, uboot तक पहुंच प्राप्त करना आवश्यक है।

बूट बूटलोडर तक पहुंच प्राप्त करने के लिए, UART पोर्ट को कंप्यूटर से कनेक्ट करें और किसी भी सीरियल कंसोल उपकरण का उपयोग करें और उपकरण की पावर सप्लाई को डिस्कनेक्ट रखें। एक बार सेटअप तैयार हो जाने पर, एंटर कुंजी दबाएं और उसे दबाए रखें। अंततः, उपकरण को पावर सप्लाई कनेक्ट करें और इसे बूट होने दें।

यह करने से uboot को लोड करने से रोका जाएगा और एक मेनू प्रदान करेगा। uboot कमांड को समझना और उन्हें सूचीबद्ध करने के लिए मदद मेनू का उपयोग करना अनुशंसित है। यह help कमांड हो सकता है। चूंकि विभिन्न विक्रेता विभिन्न कॉन्फ़िगरेशन का उपयोग करते हैं, इसलिए प्रत्येक को अलग से समझना आवश्यक है।

आमतौर पर, फर्मवेयर को डंप करने के लिए कमांड है:

md

जो "memory dump" के लिए खड़ा है। यह स्क्रीन पर मेमोरी (EEPROM सामग्री) को डंप करेगा। मेमोरी डंप कैप्चर करने के लिए प्रक्रिया शुरू करने से पहले Serial Console आउटपुट को लॉग करना अनुशंसित है।

अंत में, लॉग फ़ाइल से सभी अनावश्यक डेटा को हटा दें और फ़ाइल को filename.rom के रूप में स्टोर करें और सामग्री निकालने के लिए binwalk का उपयोग करें:

binwalk -e <filename.rom>

यह EEPROM से संभावित सामग्री को सूचीबद्ध करेगा जैसा कि हेक्स फ़ाइल में पाए गए हस्ताक्षरों के अनुसार है।

हालांकि, यह ध्यान रखना आवश्यक है कि यह हमेशा मामला नहीं है कि uboot अनलॉक है भले ही इसका उपयोग किया जा रहा हो। यदि एंटर कुंजी कुछ नहीं करती है, तो स्पेस कुंजी जैसी विभिन्न कुंजियों की जांच करें। यदि बूटलोडर लॉक है और इसे बाधित नहीं किया जाता है, तो यह विधि काम नहीं करेगी। यह जांचने के लिए कि क्या uboot डिवाइस के लिए बूटलोडर है, डिवाइस के बूटिंग के दौरान UART कंसोल पर आउटपुट की जांच करें। यह बूटिंग के दौरान uboot का उल्लेख कर सकता है।

Support HackTricks

Last updated