システムコール-KiFastCallEntry逆解析

   

SYSENTER

古いCPUアーキテクチャでは、オペレーティングシステムの割り込み(Windowsの使用:INT 0x2E)は、システムコールを実装し、CPUは現在、急速なシステムコール(高速システムコール)をサポートします。

   

リングに命令0 SYSENTERを使用してクイック呼び出しは、ここでは「インテルのホワイトペーパーは、」SYSENTERの実行のプロセスを説明します:

1.ロードCSレジスタにIA32_SYSENTER_CSからセグメント・セレクタ。

2.ロードEIPレジスタにIA32_SYSENTER_EIPからの命令ポインタ。

IA32_SYSENTER_CSの値とSSレジスタにロードし3.追加8。

4.ロードESPレジスタにIA32_SYSENTER_ESPからスタックポインタ。

5.特権レベル0に切り替えます。

フラグが設定されている場合、EFLAGS 6.クリアVMフラグは、登録します。

7.選択されたシステム・プロシージャの実行を開始します。

簡単の集計である:計算CS + 8:SSである式により、複数のレジスタから値CS、EIP、SS、ESP MSRを取得し、充填されました。

   

:WinDbgのコマンド(リードMSR)を使用することができますとRDMSRアドレスを表示MSRの内容を。

KD> RDMSR 174

MSR [174] = 00000000`00000008

   

KD> RDMSR 175

MSR [175] = 00000000`f8ac2000

   

KD> RDMSR 176

MSR [176] = 00000000`8053e540

   

SYSENTERと割り込みは、データがメモリを読み出すのではなく、登録SYSENTER MSRによって読み取らので、相対的効率の速度が高いほど、環のエントリ0の対象にしています。

スタックの異なる内容:しかし、結果はいくつかの違いがあるでしょう。割り込み入力として 0 SSリング3つのリングを、ESP、EFLAGS、CSは、EIPは、CPUがスタックにプッシュされますが、これらのレジスタのSYSENTER値に押し込まれていません。Windowsは準備ができて0リングの入り口に、中断してすばやくアクセスすることだった理由です。

   

   

KiFastCallEntryを探します

MSR [上記で得られたIA32_SYSENTER_EIP ] 0リングそのWindowsアドレスへの迅速なアクセスのための缶関数エントリ:0x8053e540が。

   

KD> U 8053e540

NT KiFastCallEntry !:

8053e540 b923000000 MOV ECX、23H

8053e545 6a30プッシュ30H

8053e547 0fa1ポップFS

8053e549 8ed9 MOV DS、CX

8053e54b 8ec1、CX

8053e54d 8b0d40f0dfff ECX、DWORD PTR DS:[0FFDFF040h]

8053e553 8b6104 MOV ESP、DWORD PTR [ECX + 4]

8053e556 6a23プッシュ23H

   

   

   

切り替えレジスタ

入力されたKiFastCallEntryはすぐにFS / DS / ES / ESPこれらのレジスタを変更します。

 

もっと面白いです

  1. すぐに0x30をを使用して、FS、
  2. DS / ESすぐ0x23の数です。
  3. ESP直接TSS.Esp0になった切り替え。

 

    

保存サイト

int2e自動的SS / ESP / EFLAGS / CS /手動でスタックにこれらの5つのレジスタをプッシュするように、これらの5件のスタックに登録するが、迅速ではないコールをEIP。

それは注目に値する:KTRAP_FRAME.EipがSystemCallReturnアドレスに設定されて。

   

   

   

   

   

遂に

最終的なコードとKiSystemService非常に類似している。このコードが実行された後、SharedCodeに直接ジャンプします。

   

おすすめ

転載: www.cnblogs.com/joneyyana/p/12585503.html