0

Windows のメモリ セグメンテーションに関するいくつかの質問。

  1. Windowsのすべてのプロセスは、独自の仮想メモリを持っていました。各プロセスには独自のタスクがあるということですか(つまり、独自のタスク記述子またはタスクゲートを意味します)?

  2. ollydbg で単純な exe を開いたところ、dll 関数への CALL 命令ごとに、ジャンプ テーブルに移動していることがわかりました。ジャンプ テーブルには、次のような DLL へのジャンプ命令がありました。

    JMP DWORD PTR DS:[402058]

    私の質問は、ベース アドレスに CS セレクターではなくデータ セグメントを使用する理由です。メモリ マップを開いて 402058 に保存されているものを見つけると、リソースが含まれていることがわかります。DS に格納されている DLL 関数のアドレスを正しく理解している場合は?

  3. メモリ マップが所有者ごとに整理されていることに気付きました。すべてのコードがDSのCSデータなどにあるように、セグメントで編成する必要はありませんか?

    ありがとうございました

4

1 に答える 1

0

1. AProcessには独自の仮想アドレス空間があります。Process Control Blockあなたが「タスク記述子またはタスクゲート」と呼んでいるものを理解していませんが、Windowsオペレーティングシステムは、プロセスに関する情報(識別、アクセストークン、実行状態など)を含む、と呼ばれるプロセスごとの記述子を保持しています、仮想メモリ マッピングなど)。

ATaskは、単一のプロセスまたは複数のプロセスを管理するために使用できる論理ユニットです。

ジョブ -> タスク

タスク -> プロセス

プロセス -> スレッド

2. あなたが言及したケースでは、これはコンパイラでは一般的ですが、プログラムは関数アドレスをロードした後、.DATA セクションを使用してジャンプ テーブルを格納します。

そもそもこれが発生する理由は、コンパイラがコンパイル時に DLL のベース アドレスを認識できないためです。そのため、関数を指すようにロード時にアドレスを修正する必要があります。これは移転として知られています。

ジャンプ テーブルをコードとは別に維持するために、コンパイラはジャンプ テーブルを .DATA セクションに格納します。このようにして、安定性とセキュリティを犠牲にすることなく、書き込み権限 (通常は .DATA セグメントに書き込み権限があります) を与え、必要に応じて変更することもできます。

3. プロセスの仮想アドレス空間にロードされた各モジュールには、独自のセクションが含まれています。そのため、モジュールごとに異なる .text、.data、.reloc などのセットが表示されます。「所有者」列はモジュール名です。

PS 投稿ごとに 1 つの質問をしてください。そうすれば、回答を得た後に他のユーザーが簡単にアクセスでき、各質問により正確な回答が得られる可能性があります。

于 2013-05-18T14:56:29.700 に答える