mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
174 lines
22 KiB
Markdown
174 lines
22 KiB
Markdown
# UART
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## 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 (स्टॉप बिट)।
|
|
|
|
.png>)
|
|
|
|
UART के साथ संवाद करने के लिए हार्डवेयर उपकरण:
|
|
|
|
- USB-to-serial adapter
|
|
- CP2102 या PL2303 चिप्स वाले एडाप्टर
|
|
- बहुउद्देशीय उपकरण जैसे: Bus Pirate, Adafruit FT232H, Shikra, या Attify Badge
|
|
|
|
### Identifying UART Ports
|
|
|
|
UART के 4 पोर्ट होते हैं: **TX**(Transmit), **RX**(Receive), **Vcc**(Voltage), और **GND**(Ground)। आप PCB में **`TX`** और **`RX`** अक्षरों के साथ 4 पोर्ट पा सकते हैं। लेकिन यदि कोई संकेत नहीं है, तो आपको **multimeter** या **logic analyzer** का उपयोग करके उन्हें स्वयं खोजने की आवश्यकता हो सकती है।
|
|
|
|
एक **multimeter** के साथ और डिवाइस बंद होने पर:
|
|
|
|
- **GND** पिन की पहचान करने के लिए **Continuity Test** मोड का उपयोग करें, पीछे के लीड को ग्राउंड में रखें और लाल लीड के साथ परीक्षण करें जब तक कि आप मल्टीमीटर से ध्वनि न सुनें। PCB में कई GND पिन मिल सकते हैं, इसलिए आप UART से संबंधित पिन पा सकते हैं या नहीं।
|
|
- **VCC पोर्ट** की पहचान करने के लिए, **DC voltage mode** सेट करें और इसे 20 V वोल्टेज पर सेट करें। काले प्रॉब को ग्राउंड पर और लाल प्रॉब को पिन पर रखें। डिवाइस को चालू करें। यदि मल्टीमीटर 3.3 V या 5 V का स्थिर वोल्टेज मापता है, तो आपने Vcc पिन पा लिया है। यदि आपको अन्य वोल्टेज मिलते हैं, तो अन्य पोर्ट के साथ पुनः प्रयास करें।
|
|
- **TX** **पोर्ट** की पहचान करने के लिए, **DC voltage mode** को 20 V वोल्टेज तक सेट करें, काले प्रॉब को ग्राउंड पर और लाल प्रॉब को पिन पर रखें, और डिवाइस को चालू करें। यदि आप पाते हैं कि वोल्टेज कुछ सेकंड के लिए उतार-चढ़ाव करता है और फिर Vcc मान पर स्थिर हो जाता है, तो आपने संभवतः TX पोर्ट पा लिया है। इसका कारण यह है कि जब पावर ऑन होता है, तो यह कुछ डिबग डेटा भेजता है।
|
|
- **RX पोर्ट** अन्य 3 के सबसे करीब होगा, इसमें सबसे कम वोल्टेज उतार-चढ़ाव और सभी UART पिनों का सबसे कम कुल मान होगा।
|
|
|
|
आप TX और RX पोर्ट को भ्रमित कर सकते हैं और कुछ नहीं होगा, लेकिन यदि आप GND और VCC पोर्ट को भ्रमित करते हैं तो आप सर्किट को जला सकते हैं।
|
|
|
|
कुछ लक्षित उपकरणों में, UART पोर्ट को निर्माता द्वारा RX या TX या यहां तक कि दोनों को बंद करके अक्षम किया गया है। उस स्थिति में, सर्किट बोर्ड में कनेक्शनों को ट्रेस करना और कुछ ब्रेकआउट पॉइंट ढूंढना सहायक हो सकता है। UART की कोई पहचान न होने और सर्किट के टूटने के बारे में एक मजबूत संकेत यह है कि डिवाइस की वारंटी की जांच करें। यदि डिवाइस कुछ वारंटी के साथ भेजा गया है, तो निर्माता कुछ डिबग इंटरफेस (इस मामले में, UART) छोड़ता है और इसलिए, UART को डिस्कनेक्ट किया होगा और डिबगिंग के दौरान इसे फिर से जोड़ देगा। इन ब्रेकआउट पिनों को सोल्डरिंग या जम्पर वायर के माध्यम से जोड़ा जा सकता है।
|
|
|
|
### Identifying the UART Baud Rate
|
|
|
|
सही बौड दर की पहचान करने का सबसे आसान तरीका **TX पिन के आउटपुट को देखना और डेटा पढ़ने की कोशिश करना** है। यदि आपको प्राप्त डेटा पढ़ने योग्य नहीं है, तो अगले संभावित बौड दर पर स्विच करें जब तक डेटा पढ़ने योग्य न हो जाए। आप USB-to-serial adapter या Bus Pirate जैसे बहुउद्देशीय उपकरण का उपयोग कर सकते हैं, जो एक सहायक स्क्रिप्ट, जैसे [baudrate.py](https://github.com/devttys0/baudrate/) के साथ जोड़ा गया हो। सबसे सामान्य बौड दरें 9600, 38400, 19200, 57600, और 115200 हैं।
|
|
|
|
> [!CAUTION]
|
|
> यह ध्यान रखना महत्वपूर्ण है कि इस प्रोटोकॉल में आपको एक डिवाइस के 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
|
|
```
|
|
`Serial port setup` विकल्प में baudrate और डिवाइस नाम जैसी सेटिंग्स कॉन्फ़िगर करें।
|
|
|
|
कॉन्फ़िगरेशन के बाद, UART कंसोल प्राप्त करने के लिए `minicom` कमांड का उपयोग करें।
|
|
|
|
## UART Via Arduino UNO R3 (Removable Atmel 328p Chip Boards)
|
|
|
|
यदि UART Serial to USB एडाप्टर उपलब्ध नहीं हैं, तो Arduino UNO R3 का उपयोग एक त्वरित हैक के साथ किया जा सकता है। चूंकि Arduino UNO R3 आमतौर पर कहीं भी उपलब्ध है, यह बहुत सारा समय बचा सकता है।
|
|
|
|
Arduino UNO R3 में बोर्ड पर ही एक USB to Serial एडाप्टर निर्मित है। 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 पर भेज रहा है।
|
|
```bash
|
|
# 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 से फर्मवेयर को डंप करने के लिए पहले बूटलोडर्स तक पहुंच प्राप्त करना आवश्यक है। कई लोकप्रिय विक्रेता Linux को लोड करने के लिए अपने बूटलोडर के रूप में uboot (Universal Bootloader) का उपयोग करते हैं। इसलिए, uboot तक पहुंच प्राप्त करना आवश्यक है।
|
|
|
|
बूट बूटलोडर तक पहुंच प्राप्त करने के लिए, UART पोर्ट को कंप्यूटर से कनेक्ट करें और किसी भी Serial Console उपकरण का उपयोग करें और उपकरण की पावर सप्लाई को डिस्कनेक्ट रखें। एक बार सेटअप तैयार हो जाने पर, Enter Key दबाएं और उसे दबाए रखें। अंततः, उपकरण को पावर सप्लाई कनेक्ट करें और इसे बूट होने दें।
|
|
|
|
यह करने से uboot को लोड करने से रोका जाएगा और एक मेनू प्रदान करेगा। uboot कमांड को समझना और उन्हें सूचीबद्ध करने के लिए मदद मेनू का उपयोग करना अनुशंसित है। यह `help` कमांड हो सकता है। चूंकि विभिन्न विक्रेता विभिन्न कॉन्फ़िगरेशन का उपयोग करते हैं, इसलिए प्रत्येक को अलग से समझना आवश्यक है।
|
|
|
|
आमतौर पर, फर्मवेयर को डंप करने के लिए कमांड है:
|
|
```
|
|
md
|
|
```
|
|
जो "memory dump" के लिए खड़ा है। यह स्क्रीन पर मेमोरी (EEPROM सामग्री) को डंप करेगा। मेमोरी डंप कैप्चर करने के लिए प्रक्रिया शुरू करने से पहले Serial Console आउटपुट को लॉग करना अनुशंसित है।
|
|
|
|
अंत में, लॉग फ़ाइल से सभी अनावश्यक डेटा को हटा दें और फ़ाइल को `filename.rom` के रूप में स्टोर करें और सामग्री निकालने के लिए binwalk का उपयोग करें:
|
|
```
|
|
binwalk -e <filename.rom>
|
|
```
|
|
यह EEPROM से संभावित सामग्री को सूचीबद्ध करेगा जैसा कि हेक्स फ़ाइल में पाए गए हस्ताक्षरों के अनुसार है।
|
|
|
|
हालांकि, यह ध्यान रखना आवश्यक है कि यह हमेशा मामला नहीं है कि uboot अनलॉक है भले ही इसका उपयोग किया जा रहा हो। यदि Enter Key कुछ नहीं करती है, तो Space Key जैसे विभिन्न कुंजियों की जांच करें। यदि बूटलोडर लॉक है और बाधित नहीं होता है, तो यह विधि काम नहीं करेगी। यह जांचने के लिए कि क्या uboot डिवाइस के लिए बूटलोडर है, डिवाइस के बूट करते समय UART कंसोल पर आउटपुट की जांच करें। यह बूट करते समय uboot का उल्लेख कर सकता है।
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|