UImage से फाइल कैसे निकाले?


21

बिल्डरोट एक एम्बेडेड डिवाइस के लिए छवियां उत्पन्न कर रहा है जहां उन्हें चलना चाहिए। यह बहुत अच्छा काम कर रहा है। उन छवियों में, रूटफ़्स शामिल हैं।

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

जहाँ तक मुझे पता है, एक uImage और zImage के बीच का अंतर सिर्फ एक छोटे हेडर का है, इसलिए यू-बूट उस बाइनरी फ़ाइल को पढ़ने में सक्षम है। लेकिन मैं न तो uImage और न ही zImage खोल सकता हूं।

क्या कोई मुझे इस बात का संकेत दे सकता है कि मेजबान पर उन (यू / जेड) छवियों को कैसे हटाएं?

जवाबों:


33
mkimage -l uImage

हेडर में जानकारी डंप करेगा।

tail -c+65 < uImage > out

सामग्री मिल जाएगी।

tail -c+65  < uImage | gunzip > out

अगर यह gipip- संकुचित था तो यह असम्पीडित हो जाएगा।

यदि वह एक initramfs था, तो आप सामग्री को सूचीबद्ध cpio -t < outया कर सकते हैं pax < out

यदि यह एक रामदिस्क छवि है, तो आप इसे आज़मा सकते हैं और इसके साथ माउंट कर सकते हैं:

mount -ro loop out /mnt

file out आपको इसके बारे में और बता सकता है कि यह क्या है।


1
हैडर मुझसे कहता है कि यह एक: एआरएम लिनक्स कर्नेल इमेज (असम्पीडित) है। मैं इसे न तो गुनजिप के साथ खोल सकता हूं और न ही सीपीओ को उस तरीके से बताता हूं जिस तरह से आपने इसे समझाया था। छवि को
बढ़ाना

@ user3085931, तो वह कर्नेल इमेज है न कि फाइलसिस्टम। आप इसे बूट करने के अलावा इसके साथ कुछ नहीं कर सकते। आपकी इसके साथ क्या करने की इच्छा है?
स्टीफन चेजेलस

लेकिन rootfs शामिल है। मैं 3 अलग-अलग संपीड़न मोड का उपयोग करता हूं और उनमें से एक के लिए यह काम नहीं कर रहा है, इसलिए मेरी योजना छवि को खोलने और यह जांचने की थी कि बिन संपीड़ित क्या है
user3085931

@ user3085931, यदि रूटफोंस को कर्नेल इमेज में जोड़ा गया है, तो किसी तरह ऑफसेट को कहीं न कहीं निर्दिष्ट किया जाना चाहिए क्योंकि कर्नेल को पास किया गया है या कर्नेल में ही एम्बेड किया गया है। क्या आपके पास कहीं ऐसी छवि का उदाहरण है?
स्टीफन चेजालस

मैं एक के साथ खेल रहा हूं और इसे lzma के साथ संकुचित किया गया ( mkimage -lरिपोर्ट किया गया Image Type: MIPS Linux Kernel Image (lzma compressed)) इसलिए इसका विस्तार करने के लिए अनलजमा का उपयोग किया गया
उत्तरी-

8

यू-बूट अपना खुद का dumpimageटूल लाता है (इसे अपने यू-बूट ट्री की टूल डायरेक्टरी में खोजें)

बेशक यह साधारण छवियों के साथ काम करता है, लेकिन यह पुरानी शैली की बहु छवियों का भी समर्थन करता है

$ ~2/tools/dumpimage -l uMulti 
Image Name:   
Created:      Thu Aug 31 19:54:29 2017
Image Type:   ARM Linux Multi-File Image (uncompressed)
Data Size:    5678650 Bytes = 5545.56 kB = 5.42 MB
Load Address: 10008000
Entry Point:  10008000
Contents:
   Image 0: 5028760 Bytes = 4910.90 kB = 4.80 MB
   Image 1: 602111 Bytes = 588.00 kB = 0.57 MB
   Image 2: 47762 Bytes = 46.64 kB = 0.05 MB
$ ~2/tools/dumpimage -i uMulti kernel.extracted
$ ~2/tools/dumpimage -i uMulti -p 1 initramfs.extracted
$ ~2/tools/dumpimage -i uMulti -p 2 device-tree.extracted

अभी तक नई शैली FIT छवियों के साथ इसे करने की कोशिश नहीं की है, लेकिन मुझे लगता है कि यह सिर्फ काम करना चाहिए।


1
यह FIT छवियों के साथ काम करता है।
सॉकेटपेयर

4

मामले में वहाँ कई छवियों के अंदर यहाँ एक त्वरित है bashस्क्रिप्ट उन सब फाइलों में निकालने के लिए image_0, image_1...:

#!/bin/bash

src_file=uImage

declare -ia sizes=( $(mkimage -l "$src_file" |
  awk '/^ +Image [0-9]+/ { print $3 }') )
declare -i offset="68+4*${#sizes[@]}"
declare -i size

for i in "${!sizes[@]}"; do

  size=${sizes[$i]}

  echo "Unpacking image_$i"
  dd if="$src_file" of="image_$i" bs=1 skip="$offset" count="$size"

  # going to offset of next file while rounding to 4 byte multiple
  offset+=$(( size + (4 - size % 4) % 4 ))

done

फिर आपको जांचने की आवश्यकता है कि क्या है (एक पैक लिनक्स कर्नेल हो सकता है, फ़ाइलों के साथ संग्रह, डिवाइस ट्री, ...)। fileऔर binwalk( http://binwalk.org/ ) मददगार हो सकता है।


बहुत अच्छा इसके अलावा
user3085931
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.