Bagaimana cara mengekstrak file dari uImage?

21

Buildroot menghasilkan gambar untuk perangkat tertanam di mana mereka harus dijalankan. Ini bekerja dengan sangat baik. Dalam gambar-gambar itu, rootfs disertakan.

Karena beberapa penelitian, saya ingin melihat ke dalam file yang dihasilkan (misalnya mode kompresi berbeda yang ditetapkan oleh Buildroot telah diterapkan dan sekarang akan diperiksa jika dilakukan dengan benar), tetapi saya tidak dapat menemukan sesuatu yang berguna di Internet.

Sejauh yang saya tahu, perbedaan antara uImage dan zImage hanya header kecil, jadi u-boot dapat membaca file biner itu. Tapi saya tidak bisa membuka uImage atau zImage.

Adakah yang bisa memberi saya petunjuk tentang cara mendekompres (u / z) Gambar pada host?

pengguna3085931
sumber

Jawaban:

33
mkimage -l uImage

Akan membuang informasi di header.

tail -c+65 < uImage > out

Akan mendapatkan kontennya.

tail -c+65  < uImage | gunzip > out

akan mendapatkannya tanpa kompresi jika dikompresi dengan gzip.

Jika itu adalah initramfs, Anda dapat melakukan cpio -t < outatau pax < outmembuat daftar konten.

Jika ini adalah gambar ramdisk, Anda dapat mencoba dan memasangnya dengan:

mount -ro loop out /mnt

file out bisa bercerita lebih banyak tentang apa itu.

Stéphane Chazelas
sumber
1
Header memberi tahu saya bahwa ini adalah: ARM Linux Kernel Image (tidak terkompresi). saya tidak bisa membukanya baik dengan gunzip atau cpio seperti yang Anda jelaskan.
Memasang
@ user3085931, maka itu adalah kernel image bukan sistem file. Anda tidak dapat melakukan apa pun kecuali mem-bootnya. Apa yang ingin kamu lakukan dengannya?
Stéphane Chazelas
tetapi rootfs disertakan. Saya menggunakan 3 mode kompresi yang berbeda dan untuk salah satunya tidak berfungsi, oleh karena itu rencana saya adalah untuk membuka gambar dan memeriksa apa yang telah dikompresi bin
user3085931
@ user3085931, jika rootfs telah ditambahkan ke image kernel, maka entah bagaimana offset harus ditentukan di suatu tempat baik sebagai parameter yang dikirimkan ke kernel atau ditanamkan di kernel itu sendiri. Apakah Anda memiliki contoh gambar semacam itu di suatu tempat?
Stéphane Chazelas
Saya sudah bermain dengan satu dan itu dikompresi dengan lzma ( mkimage -ldilaporkan Image Type: MIPS Linux Kernel Image (lzma compressed)) jadi digunakan unlzma untuk mengembangkannya
-bradley
8

U-Boot membawa dumpimagealatnya sendiri (temukan di direktori alat pohon U-Boot Anda)

Tentu saja ini berfungsi dengan gambar sederhana, tetapi juga mendukung gambar multi gaya lama

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

Belum mencobanya dengan gambar FIT gaya baru, tapi saya kira itu hanya akan berfungsi.

Uwe Geuder
sumber
1
Ini bekerja dengan gambar FIT.
soketpair
4

Dalam hal ada beberapa gambar di dalam sini adalah cepat bashscript untuk mengekstrak mereka semua ke dalam file 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

Anda kemudian perlu memeriksa lalu apa itu (bisa berupa kernel Linux yang dikemas, arsip dengan file, bagan perangkat, ...). filedan binwalk( http://binwalk.org/ ) mungkin membantu.

phk
sumber
tambahan yang sangat bagus
user3085931