2

メモリ内で実行されているバイナリを完全に復元できるかどうかを知りたいです。

これは私が試したものです、

最初に readを読ん/proc/PID/mapsでから、関連するすべてのセクションを gdb でダンプします (すべてのライブラリを無視します)。

grep sleep /proc/1524/maps | awk -F '[- ]' \
     '{print "dump memory sleep." $1 " 0x" $1 " 0x" $2 }'  \
   | gdb -p 1524

次に、すべてのダンプを順番に連結します。

cat sleep.* > sleep-bin

しかし、ファイルは非常に異なっています/bin/sleep

再配置テーブルなどの初期化されていないデータのようですが、メモリダンプを修正することはできませんか? (実行可能にする)

4

1 に答える 1

0

免責事項: 私は Windows の人間であり、Linux プロセスの内部構造と ELF 形式についてはあまり知りませんが、お役に立てれば幸いです。

それは間違いなく可能だと思いますが、すべてのプログラムではそうではありません。OS ローダーは、実行可能ファイルのすべての部分を、ファイル内の適切に定義された場所にあるメモリに読み込みます。たとえば、一部のアンインストーラーは実行可能ファイルに追加されるデータを保存します。これはメモリにロードされないため、メモリをダンプするだけでは復元できない情報になります。

もう 1 つの問題は、OS によって書き込まれた情報が、その権限を持つシステム上のあらゆるものによって自由に変更されることです。ただし、通常のプログラムでそのようなことを行うことはありません。

開始点は、実行可能モジュールの ELF ヘッダーをメモリ内で見つけてダンプすることです。タスクに必要なほとんどすべてのデータが含まれます。例えば:

  • セクションの数と、メモリ内およびファイル内の場所
  • ファイル内のセクションが仮想メモリ内のセクションにどのようにマップされるか (通常、それらは異なるベース アドレスとサイズを持ちます!)
  • 移転データの場所

再配置については、再配置データがどのように格納され、ELF 形式で処理されるかを確認する必要があります。ダンプの変更を元に戻すのは非常に簡単であることがわかったら。

于 2013-10-16T23:54:32.690 に答える