
लॉजिक एनालाइज़र कैप्चर के माध्यम से SPI फ्लैश इमेज पुनर्निर्मित करने के लिए टूल
spidump बूट के समय SPI/QSPI NOR फ्लैश पढ़ने वाले डिवाइस के लॉजिक-एनालाइज़र कैप्चर को पार्स करता है और रीड ट्रैफ़िक से फ्लैश इमेज का पुनर्निर्माण करता है — सीधे चिप रीड की आवश्यकता नहीं। फ्लैश कमांड सेट को Scapy के साथ मॉडल किया गया है, इसलिए एक रीड ट्रांज़ैक्शन वही लॉजिकल ऑब्जेक्ट है चाहे वह एक वायर पर आया हो या चार पर।
| फ़ॉर्मेट | हेडर | नोट्स |
|---|---|---|
| Saleae Logic 2 "SPI" एनालाइज़र टेबल | name,type,start_time,...,mosi,miso | enable/result/disable पंक्तियाँ, प्रति बाइट एक result |
| Saleae रॉ प्रति-बाइट टेबल | Time [s],Packet ID,MOSI,MISO | प्रति बाइट एक पंक्ति, Packet ID द्वारा समूहीकृत |
| QSPI-Analyzer एक्सपोर्ट | Time [s],Packet ID, Transaction State, DATA, Lines Used | स्टेट मशीन: 1=cmd, 2=addr, 3=dummy, 4=data |
Saleae Logic / KingstVIS के लिए QSPI-Analyzer प्लगइन क्वाड-मोड फ़्रेमिंग डिकोड करता है
(जैसे 0x6B Fast Read Quad Output, 1-1-4) जो एक साधारण SPI एनालाइज़र नहीं कर सकता।
# Standard single-lane SPI capture (Logic 2 SPI analyzer export)
python main.py examples/bigger-boot.csv -o recovered_flash.bin -v
# Quad SPI capture (QSPI-Analyzer export) — same command, format auto-detected
python main.py big-quad-spi-analyzed-dump.txt -o quad.bin -v
# Merge a single-lane leg (U-Boot) with a quad leg (rootfs) into one image.
# Devices that boot single-lane then switch to QSPI leave each region in a
# different capture; --merge splices them. Reads whose data lane width doesn't
# match the opcode (e.g. quad reads a single-lane analyzer mis-decoded) are
# dropped automatically, so a mixed capture can't poison the result.
python main.py single_lane_boot.csv --merge quad_boot.txt -o full.bin -v
# Raw exports with no chip-select framing (Packet ID constant) are split on
# idle gaps automatically (4x median byte period); override the threshold with
# --gap SECONDS, or --gap 0 to force Packet ID grouping
python main.py raw_boot.csv --gap 2e-6 -o raw.bin -v
# Force a flash size / fill byte if the auto-sizing guesses wrong
python main.py capture.txt --flash-size 0x1000000 --fill 0xFF -o out.bin
-v पहचाने गए फ़ॉर्मेट, प्रति-ओपकोड ट्रांज़ैक्शन हिस्टोग्राम, चुने गए
फ्लैश आकार, और रीड कवरेज को प्रिंट करता है। बिना पढ़े गए क्षेत्र 0xFF (मिटाई गई-NOR स्थिति) से भरे जाते हैं, इसलिए आउटपुट को सीधे binwalk में देने के लिए सुरक्षित है।
फ्लैश रीड वायर चौड़ाई की परवाह किए बिना वही लॉजिकल ट्रांज़ैक्शन है: एक
ओपकोड, एक पता, और डेटा बाइट्स की एक श्रृंखला। नीचे दिए गए दो ट्रेस समान चार बाइट्स पढ़ते हैं (SquashFS मैजिक hsqs 0x2D0000 पर, जो
bigger-boot.csv से लिया गया है) सिंगल-लेन और क्वाड मोड में:
(python docs/diagrams/mkwave.py से पुनः उत्पन्न करें; इसके लिए wavedrom-cli, और PNGs के लिए rsvg-convert चाहिए।)
{cmd, addr, data, lines} में बदलता है।SPIFlashCmd (Scapy) ओपकोड / पता / डमी हेडर को मॉडल करता है; रीड
ओपकोड (सिंगल और क्वाड: 0x03 0x0B 0x6B 0xEB 0x6C 0x0C …) सभी बस
READ_COMMANDS में प्रविष्टियाँ हैं।reconstruct_image प्रत्येक रीड को एक bytearray में रीप्ले करता है, कवरेज को ट्रैक करता है।एक बूट केवल वही पढ़ता है जिसकी उसे आवश्यकता होती है, इसलिए कवरेज डिज़ाइन से आंशिक होती है — आप उन क्षेत्रों को पुनः प्राप्त करते हैं जिन्हें डिवाइस ने वास्तव में छुआ (बूटलोडर, कर्नेल, माउंटेड रूटफ़्स)। जो डिवाइस सिंगल-लेन बूट करता है फिर क्वाड पर स्विच करता है, उसके लिए दोनों लेग कैप्चर करें और उन्हें स्प्लाइस करें।