Windows7のx64システムコール解析

ディレクトリ

  • 0x01で、システムコール&SYSRET
    •  区別のSYSENTER&int型2Eと32   
  • 0x02のKiSystemCall64
    •  建設TrapFrame
    •  _kthread-> header-> DebugActive.ActiveDR7 |計装
    •  ユーザーモードのスケジューリング(???この部分はまだ明らかではありません)
    •  SSDT&ShadowSSDT APIのアドレス計算
    •  KiInitiateUserApc Apc分发
    •  InstrumentationCallbackユーザレベルのコールバック

 


0x01で、システムコール&SYSRET

  • システムコール

 

システムコール

IF(CS.L≠ 1または(IA32_EFER.LMA≠ 1または(IA32_EFER.SCE≠ 1 (* ない 64 -ビットモードまたは SYSCALL / SYSRET ない有効IA32_EFER *) THEN #UD FI ; RCX←RIP ; (*は、次の命令のアドレスが含まれています*) RIP←IA32_LSTARをR11←RFLAGS RFLAGS←RFLAGS AND 、NOT(IA32_FMASK) CS.Selector←IA32_STAR [ 4732 ] AND FFFCH(*オペレーティングシステムは、CSを提供しRPLは0 *に強制) (CSの*設定休止固定値に*) CS.Base← 0 (*フラットセグメント*) CS.Limit←FFFFFH (* 4 Kバイト粒度で、4バイトの限界*意味) CS.Type← 11 (*コードを読み取り/実行、アクセス*) CS.S← 1 CS.DPL← 0 ; CS.P← 1 ; CS.L← 1 ; (*エントリは64ビットモード*である) CS.D← 0 (*必須の場合CS.L = 1 *) CS.G←1 ; (* 4キロバイトの粒度*) CPL← 0

  この保存されたRCXは、次の命令のアドレスであり、上記の擬似コード、システムコールから見ることができ、ウィンドウはR10に保存され、システムコールの前にRCXます。R11はRFLAGSに保存されています。[RIPはIA32_STARから、IA32_LSTARからCSセレクタ得られる:47 32] このように、読み出されるが、他のセグメントCS属性が選択されたサブ、固定値の代わりにセットに従ってメモリに読み込まれません対応するセグメント記述子のセグメントを選択し、固定値のセットを対応するOSの義務。上記の擬似コードを見つけることができる、無スタックスイッチは、独自のOSのシステムコールスタック切替ルーチンを行う必要があります。

 

  • SYSRET

IF(CS.L≠ 1または(IA32_EFER.LMA≠ 1または(IA32_EFER.SCE≠ 1 
(* ない  64 -ビットモードまたは SYSCALL / SYSRET  ない有効IA32_EFER *)
THEN #UD FI; 
IF(CPL≠ 0)THEN #GP(0FI; 
(オペランドサイズはIF 64 ビット)
THEN(*へ戻る64 -ビットモード*)
(RCXがあるIF ない #GP(THEN正規の)0;
RIP←RCX ELSE(互換モードに戻る* *)
RIP←ECX FI ;
RFLAGS←(R11&3C7FD7H)| 2 ; (*クリアRF、VM、予約ビット、セットは2 *ビット) 
(オペランドサイズである場合には64 ビット)
THEN CS.Selector←IA32_STAR [ 6348 ] + 16 ELSE CS.Selector←IA32_STAR [ 6348 ] FI ;
CS.Selector←CS.Selector OR  3 (* 3 *に強制RPL) 
固定値にCSの*セットの残りの部分*)
CS.Base← 0; (*フラットセグメント*) 
CS.Limit←FFFFFH (* 4 Kバイト粒度で、4バイトの限界*意味) 
CS.Type← 11 (*コードを読み取り/実行、アクセス*) 
CS.S← 1 CS.DPL← 3 CS.P← 1 ;
(オペランドサイズである場合には64 ビット)
THEN(*に戻る64 -ビットモード*)
CS.L← 1 (* 64ビットコードセグメント*) 
CS.D← 0 (*必須の場合CS.L = 1 *)
ELSE(*互換モードに戻る*)
CS.L← 0 ;(*互換モード*) 
CS.D← 1 ; (* 32ビットコードセグメント*) 
FI CS.G← 1 ; (* 4キロバイトの粒度*) 
CPL← 3 SS.Selector←(IA32_STAR [ 6348 ] + 8OR  3 (* 3 *に強制RPL)
(SSの*セット残りの固定値に*)
SS.Base← 0 (*フラットセグメント*) 
SS.Limit←FFFFFH (* 4 Kバイトの粒度で、4Gバイトの制限を意味*) 
SS.Type← 3 (*リード/ライト・データ、アクセス*)
SS.S← 1 ;
SS.DPL← 3 SS.P← 1 ;
SS.B← 1 ; (* 32ビットのスタック・セグメント*) 
SS.G← 1 (* 4キロバイト粒度*)

  IA32_STAR MSRのビット63:48から導出された値とSYSRET負荷CS及びSSセレクタ。しかし、CSおよびSSディスクリプタキャッシュは、これらのセレクタが参照する(GDTまたはLDT)の記述子からロードされていません。代わりに、記述子キャッシュは固定値がロードされています。

  • <-rcxリッピング
  • RFLAGS < - (R11&3C7FD7H)| 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/DreamoneOnly/p/11819333.html