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