実行中のシステムからカーネルを抽出する

実行中のシステムからカーネルを抽出する

システムメモリを読み込んで実行中のシステムからカーネルイメージ(bzImage、vmlinuzなど)を取得できますか?

ベストアンサー1

いいえ、できません。

基本的な問題は、カーネルイメージがメモリに直接ロードされますが、カーネルが起動するとイメージが変更されることです。カーネルは実際にはプログラムではありませんが、プログラムがメモリにコンパイル/ロードされる方法に関する多くの規則がまだ適用されます。


次のCコードを例にしてみましょう。

char x=5

int some_function() {
    x=100;
}

最初の行は、x=5後で使用できるように、数値5をメモリ内のバイトに入れるようにコンパイラに指示します。プログラムが実行されると、このバイトは他のすべてと一緒にメモリに直接ロードされます。

次の行は、x=100実行時に元の値を上書きする機械語コードを記述するようにコンパイラに指示します。したがって、実行中のプログラムをメモリから抽出してデコンパイルすると、次の内容が表示されます。

char x=100

int some_function() {
    x=100;
}

実際に実行されているプログラムは独自に書き直されました。


同様に、ユーザーモードプログラムは次の場所に保存されます。ELF形式。ユーザーレベルのプログラムを実行すると、プログラムローダーはさまざまな部分でプログラムイメージを組み合わせる必要があります。カーネルルールは今や少し異なりますが、類似点があります。modprobe実行中のカーネルのメモリ空間に別のファイルをロードします。


したがって、カーネルのメモリ全体をダンプする方法を見つけることができますが、結果は実際には元のカーネルイメージにはあまり似ていないため、確実に起動するのに十分ではありません。

私はここであなたが心配しています。最高オプションは、システム管理者に行き、コピーを要求するか、アクセスを要求することです。

おすすめ記事