web-dev-qa-db-ja.com

vmlinuzをvmlinuxに解凍するにはどうすればよいですか?

私はすでに圧縮解除、gzip、およびグーグルの結果として現れる他のすべてのソリューションを試しましたが、これらは私にとってはうまくいきませんでした。

GZ署名の画像検索のみを取得するには-1f 8b 08 00

> od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45

したがって、画像は24576+8 => 24584で始まります。次に、ポイントから画像をコピーして解凍します-

> dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
1450414+0 records in
1450414+0 records out
1450414 bytes (1.5 MB) copied, 6.78127 s, 214 kB/s

オンラインフォーラムから次の説明を逐語的に入手します。 http://www.codeguru.com/forum/showthread.php?t=415186

このプロセスは私にとっては機能せず、ファイルが見つからなかったことを示すエラー0024576およびそれ以降のすべての番号を示すエラーが発生します。

Vmlinuzからvmlinuxを抽出するにはどうすればよいですか?

ありがとうございました。

編集:これはリバースエンジニアリングの質問です。 RPMをインストールしたり再コンパイルしたりするためのディストリビューションにアクセスできません。私はvmlinuzから始めます。

20
Lord Loh.

たぶん、あなたはその投稿の作者が何を意味していたのかを誤解しました。

  1. vmlinuzファイルには、gzip圧縮されたコンテンツ以外のものが含まれているため、gzip圧縮されたコンテンツの開始場所を見つける必要があります。これを行うには、以下を使用します。

    od -A d -t x1 vmlinuz | grep '1f 8b 08 00'
    

    これにより、そのファイルのどこにgzipヘッダーがあるかがわかります。出力は次のようになります。

    0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45
    

    つまり、vmlinuzファイルの0024576(少なくとも投稿の作成者にとっては、あなたの投稿とはまったく異なる可能性があります)では、バイナリ値 "24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45"が見つかります。あなたは1f 8b 08 00を探しています。これは9文字目以降、または0024576 + 8(0から数え始める)= 24584で見つかります。

  2. Gzip圧縮されたコンテンツの開始位置(24584の位置)がわかったので、ddを使用してgzip圧縮されたコンテンツを抽出し、解凍します。これを行うには、以下を使用します。

    dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux
    

    最初のコマンドはその位置にシークし、すべてを標準出力にコピーします。 zcatは、標準入力から取得したすべてを解凍し、解凍した文字列を標準出力に出力します。次に、>zcatの出力をvmlinuxという名前の新しいファイルにリダイレクトします。

31
rid

カーネルソースには、このためのスクリプトが含まれていますextract-vmlinux 。自分でロールする必要はありません。

this SO answer を参照してください。

28
Craig Ringer

実際、vmlinuzファイルを生成する前に、ほとんどのシンボルが削除されます。したがって、真のvmlinuxvmlinuzから再構築することはできません。ファイルはデバッグに役立ちません。

7
ninjalj

私は単純な問題に遭遇しました-クラッシュするvmlinuxの正しいバージョンを探していました。 vmlinuzをvmlinuxに解凍しようとする代わりに。

より良い解決策は、RPMをインストールすることです:_kernel-debuginfo_、そのRPMには適切なvmlinuxファイルが含まれています。

Rpm名に注意してください。複数の類似した(混乱する)名前があります。お奨め:kernel-debuginfo-$(version).rpm

2
Henry

最新のカーネルは常に(実際には、一般的には)gzip圧縮されていません。彼らはbzip2またはLZMAを使用するかもしれません。簡単なWeb検索では、これらの圧縮方法の魔法の文字列を見つけることができませんでした。いくつかのカーネルイメージをチェックして、解凍コードを含む不変のヘッダーを見つける方がよい場合があります。

1
CarlF

上記の解凍ラインは私にとってはうまくいきました、そしてもちろん、カーネルは取り除かれました。したがって、そこには良い情報はありません。

デバッグに入れるなど、古いカーネルに変更を加える必要がある場合は、uname -rを使用してカーネルのリビジョンを取得し、そのソースを取得します。

Sudo apt-get source linux-image-\`uname -r\`

ソースは、ソースツリーの/usr/src/linux...cdにあり、次のようになります。

make oldconfig
make

これは、現在実行中のカーネルの構成を含むファイルを見つけようとします-通常は

/boot/config-\`uname -r\` 

このビルドに使用して、実行中のカーネルを再作成します。

それを思い通りに構築してください。必要に応じて、ストリップされていないカーネルにアクセスできます。

上記のシェルでは、スペースが原因でgzipマジック番号が見つからない可能性があります。はい、元のディスカッションから1年後に書いていますが、同じように圧縮されています。出力をlessに送信し、1f 8bまたは1fを検索します。残りのバイトを手動で確認して一致を判別し、最初のインスタンスがあることを確認します。 10進数であることを思い出して見つかったオフセットを使用します。

1
kdm