จะแตกไฟล์จาก uImage ได้อย่างไร?


21

Buildroot กำลังสร้างภาพสำหรับอุปกรณ์ฝังตัวที่ควรจะทำงาน มันใช้งานได้ดีมาก ในภาพเหล่านั้นรูทส์รวมอยู่ด้วย

เนื่องจากการวิจัยบางอย่างฉันต้องการตรวจสอบไฟล์ที่สร้างขึ้น (เช่นโหมดการบีบอัดที่กำหนดโดย Buildroot ถูกนำไปใช้และตอนนี้จะถูกตรวจสอบหากพวกเขาทำอย่างถูกต้อง) แต่ฉันไม่พบสิ่งที่มีประโยชน์ในเน็ต

เท่าที่ฉันทราบความแตกต่างระหว่าง uImage และ zImage เป็นเพียงส่วนหัวเล็กดังนั้น u-boot จึงสามารถอ่านไฟล์ไบนารีนั้นได้ แต่ฉันไม่สามารถเปิดทั้ง uImage และ zImage ได้

ทุกคนสามารถให้คำแนะนำเกี่ยวกับวิธีการแตกภาพเหล่านั้น (u / z) ภาพบนโฮสต์ได้หรือไม่?

คำตอบ:


33
mkimage -l uImage

จะถ่ายโอนข้อมูลในส่วนหัว

tail -c+65 < uImage > out

จะได้รับเนื้อหา

tail -c+65  < uImage | gunzip > out

จะได้รับมันไม่บีบอัดถ้ามันถูกบีบอัด gzip

หากนั่นคือ initramfs คุณสามารถทำcpio -t < outหรือpax < outเพื่อแสดงรายการเนื้อหา

หากเป็นภาพ ramdisk คุณสามารถลองและติดตั้งด้วย:

mount -ro loop out /mnt

file out สามารถบอกคุณเพิ่มเติมเกี่ยวกับสิ่งที่มันเป็น


1
ส่วนหัวบอกฉันว่ามันเป็น: ARM Linux Kernel Image (ไม่บีบอัด) ฉันไม่สามารถเปิดได้ด้วย gunzip หรือ cpio ในแบบที่คุณอธิบาย การติดตั้งรูปภาพไม่สามารถทำได้เช่นกัน
user3085931

@ user3085931 นั่นคือเคอร์เนลอิมเมจไม่ใช่ระบบไฟล์ คุณไม่สามารถทำอะไรกับมันได้ยกเว้นที่จะบูตมัน คุณต้องการทำอะไรกับมัน
Stéphane Chazelas

แต่รูทรวมอยู่ด้วย ฉันใช้โหมดการบีบอัด 3 แบบและหนึ่งในนั้นไม่ทำงานดังนั้นแผนของฉันคือการเปิดภาพและตรวจสอบสิ่งที่มีการบีบอัด Bin
3085931

@ user3085931 หาก rootfs ได้ถูกผนวกเข้ากับเคอร์เนลอิมเมจดังนั้นอย่างใดออฟเซ็ตจะต้องระบุที่ใดที่หนึ่งเป็นพารามิเตอร์ที่ส่งผ่านไปยังเคอร์เนลหรือฝังในเคอร์เนลตัวเอง คุณมีตัวอย่างของภาพนั้นบ้างไหม?
Stéphane Chazelas

ฉันเล่นกับมันมาแล้วและมันถูกบีบอัดด้วย lzma ( mkimage -lรายงานImage Type: MIPS Linux Kernel Image (lzma compressed)) ดังนั้นใช้ unlzma เพื่อขยาย
Northern-bradley

8

U-Boot นำเสนอdumpimageเครื่องมือของตัวเอง(ค้นหาในไดเรกทอรีเครื่องมือของแผนผัง U-Boot ของคุณ)

แน่นอนมันใช้งานได้กับภาพที่เรียบง่าย แต่ก็รองรับหลายรูปแบบเก่า

$ ~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
socketpair

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

จากนั้นคุณต้องตรวจสอบว่าอะไรคือสิ่งที่ (อาจเป็นเคอร์เนล Linux ที่เต็มไปด้วย, เก็บถาวรด้วยไฟล์, โครงสร้างอุปกรณ์, ... ) fileและbinwalk( http://binwalk.org/ ) อาจมีประโยชน์


นอกจากนี้ดีมาก
3085931
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.