1つのinitramfsが埋め込まれたカーネルがあります。抽出したいです。
出力を得たx86 boot sector
私がする時 file bzImage
このカーネルイメージ用のSystem.mapファイルがあります。
System.mapファイルを使用して、または使用せずに、このカーネルから埋め込まれたinitramfsイメージを抽出する方法はありますか?
システムマップファイルにある興味深い文字列は、次のとおりです(役立つ場合に備えて)。
57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size
Gentoo wikiにこれに関するいくつかの情報があります: https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging
非常にうまく機能するbinwalk
の使用をお勧めします。
簡単なウォークスルーを例とともに示します。
まず、binwalkを使用してbzImageファイルを抽出します。
> binwalk --extract bzImage
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Microsoft executable, portable (PE)
18356 0x47B4 xz compressed data
9772088 0x951C38 xz compressed data
最終的に、47B4
、47B4.xz
、951C38.xz
の3つのファイルができました。
> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped
47B4
で再度binwalkを実行してみましょう:
> binwalk --extract 47B4
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ELF, 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
9818304 0x95D0C0 Linux kernel version "4.4.6-gentoo (root@Host) (gcc version 4.9.3 (Gentoo Hardened 4.9.3 p1.5, pie-0.6.4) ) #1 SMP Tue Apr 12 14:55:10 CEST 2016"
9977288 0x983DC8 gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
<snip>
これは、見つかったパスといくつかの潜在的に興味深いファイルの長いリストで戻ってきました。みてみましょう。
> file _47B4.extracted/*
<snip>
_47B4.extracted/E9B348: ASCII cpio archive (SVR4 with no CRC)
ファイルE9B348
は、(すでに解凍された)cpioアーカイブであり、まさに私たちが探しているものです!ビンゴ!
圧縮されていないcpioアーカイブ(あなたのinitramfs!)を現在のディレクトリに解凍するには、次のコマンドを実行します。
> cpio -i < E9B348
それはほとんど簡単過ぎました。 binwalk
は、まさにあなたが探しているツールです。参考までに、ここではv2.1.1を使用していました。
私の知る限り、initramfs cpioアーカイブはカーネルにリンクされているだけです。
したがって、これはうまくいくはずです:
dd
を使用して、c17fd8cc
およびc19d7b90