0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
DS:
意味?
命令は、ds:[40207A]
のメモリから新しいEIP値をロードしています。つまり、アドレス40207A
に関数ポインタがあります。 (これは単なるcall
ではなくjmp
であるため、リターンアドレスをプッシュします。)
ds:
は、命令がデータセグメント内のメモリを参照していることを意味します。フラットなアドレス空間モデルで実行されるため、最近のOSではほとんど無視できます(コード、データ、スタックセグメントはすべて同じメモリ範囲を参照します) 、およびメモリ保護はページングで処理されます)。
ds:
は、それが間違いなくメモリオペランドであることを示し、使用するセグメントを通知するためにあります/セグメントオーバーライドプレフィックスがないことを示します(これはすでにデフォルトであるため、おそらくds
プレフィックスを除く) )。
少し詳しく説明します。簡単にするために、これはWindowsを実行している32ビットプロテクトモードのコンテキストであることに注意してください。
セグメントレジスタ(CS、DS、SS、ES、FS、GS)は、selector
を指すdescriptor
を保持します。グローバル( [〜#〜] gdt [〜#〜] )とローカル( [〜#〜] ldt [〜#〜] )の2つの記述子テーブルがあります。セレクターには、どちらを使用するかを示すビットがあります。 Windows(ほぼ?)はグローバルテーブルのみを使用します。
記述子は基本的にa{beginning-address、size}ペア-それだけではありませんが、それはこの投稿の範囲外です。
Windowsは フラットメモリモデル を使用します。各プロセスにはメモリアドレス0から始まる4GBのアドレス空間があり、 ページング を使用してプロセスを相互に分離します。
プロセスはこの世界のフラットビューを持っているため、{0、4GB}記述子を使用してすべてのセグメントで実行されます。したがって、Windowsは、プロセスごとの記述子を割り当てる代わりに、少数のグローバル記述子のみを使用し、すべてのプロセスにそれらを使用させることができます。
Portable Executable 形式はsections
を定義します。これは、概念が重複している場合でも、x86 segments
とは無関係です。 PE EXEは、ほぼすべてのセクションレイアウトを使用できますが、通常は、(少なくとも)コード(読み取り/実行)、データ(読み取り/書き込み)、リソース(読み取り専用?)に分割されます。実行可能ファイルをセクションに分割すると、x86ページレベルのメモリ保護をメモリ範囲に適用できます。
通常のセグメントはプロセスごとに変更されませんが、WindowsはFS
レジスタを使用して、スレッドごとを指します[〜#〜] tib [〜#〜] 構造。
概要については、 this を参照してください。これは80386の古いドキュメントからのものですが、情報は引き続き適用されます。
メモリアドレスは、セグメントとオフセットで構成されます。 DSは「データセグメント」レジスタです。