この単純なアセンブラ コマンドがあります。
mov eax, fs:[30h];
私の問題は、このコマンドによって実際に読み取られる特定のアドレスを知る必要があることです。アセンブラのアドレッシング モードに関するドキュメントはたくさん見つかりましたが、register:表記に関するドキュメントはありませんでした。
アドレス計算の背後にある計算を誰か説明してもらえますか?
この単純なアセンブラ コマンドがあります。
mov eax, fs:[30h];
私の問題は、このコマンドによって実際に読み取られる特定のアドレスを知る必要があることです。アセンブラのアドレッシング モードに関するドキュメントはたくさん見つかりましたが、register:表記に関するドキュメントはありませんでした。
アドレス計算の背後にある計算を誰か説明してもらえますか?
FS
アドレスに追加されるベース アドレスを含むセグメント記述子のテーブルへのインデックスです。win32 ではFS
、スレッド情報ブロックにアクセスするために使用されます (または、より正確には、によってインデックス付けされたセグメント記述子には、TIB の開始FS
などのベース アドレスがあります) 。プロセス環境ブロックへのポインターの場所です。win64 では、TIB へのアクセスに使用されます。FS:[0]
FS:[30h]
GS
Win32 でセグメントのベース アドレスを取得するにはFS
、関数を使用できますGetThreadSelectorEntry
(x86 のみ)。
デバッガーを作成している場合は、新しいスレッドまたはプロセスごとにデバッガーに送信される/構造体lpThreadLocalBase
の値を使用できます。これはスレッドを指し、x86 プロセスと x64 プロセスの両方で機能します (x64 では、レジスタは TEB に使用されます)。CREATE_THREAD_DEBUG_INFO
CREATE_PROCESS_DEBUG_INFO
TEB
GS