組み込みinitramfs抽出

組み込みinitramfs抽出

initramfsが組み込まれたカーネルがあります。抽出したいです。

x86 boot sectorこれを行うと、出力が表示されます。file bzImage

このカーネルイメージのSystem.mapファイルがあります。

このカーネルから組み込まれたinitramfsイメージを抽出する方法はありますか?システム図文書?

興味深い文字列を探すシステム図ファイルは次のようになります。 (助けになる場合に備えて)

57312:c17fd8cc T __initramfs_start
57316:c19d7b90 T __initramfs_size

答え1

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

私は3つのファイルで終わりました47B447B4.xz951C38.xz

> file 47B4
47B4: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=aa47c6853b19e9242401db60d6ce12fe84814020, stripped

それでは、binwalkをもう一度実行してみましょう47B4

> 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を使っています。

答え2

私が知る限り、initramfs cpioアーカイブはカーネルにリンクされています。

だからこれはうまくいきます:

  1. ddとの間の範囲を抽出するために使用されます。c17fd8ccc19d7b90
  2. CPIOアンパッカーを使用して結果データをアンパックします。

答え3

「dd を使用して c17fd8cc と c19d7b90 の範囲を抽出する」とは機能しません。これはカーネル仮想アドレスであり、イメージが物理空間にあるためです。これが機能するには、画像オフセットに変換する必要があります。通常、仮想オフセット(この場合は0xC0000000に似ています)を減算してPHYS_OFFSET(通常0x8000)を追加することもできますが、これはカーネルによって異なります。

関連情報