Ringモデル, syscall, WindowsAPI呼び出しフローの鼎立🤝
🚨はじめに⚠️
本記事は、SEO🔎上位に出てくるような説明を省いております。
情報の海に呑まれた数少ない価値ある資料をまとめ、解釈したのが拙著となります。
本内容について、私なりに拾い集めた情報の 推敲と検証 をいたしましたが、いたらぬ点があれば教えてください。また、これらは公開時において(おそらく正しいだろう)と私が判断した迄の情報です。適宜更新するキモチはありますので、なにかあればコメントください。
「近頃のわかもんは経験が足りん。わしがいちから教えたる」くらいの方からの批判をよろこび歓迎します。
検証環境
Windows10 64bit 22H2
ユーザモードとカーネルモード
((ハードウェアへアクセスできるモード)ハードウェアへアクセスできるモード)ck などがロードされます。
無造作にロードされては管理がおぼつかないのでセグメントごとに分けています。
うち、特権レベルはCodeSegmentRegister すなわちCSレジスタによって示されます。
プログラムのバイナリコードが記述されています。
CPL
各セグメントに付与された特権レベルを示します。
DPLにはセグメントディスクリプタによって設定される
現在実行中コードの特権レベルを示します。
すなわち、CPLには00, 01, 10, 11のいずれかの2bitが含まれます。
DPL
たとえば、
現在実行中のコードセグメントを CPL(0b03(Rin3))
アクセスしたいプロセスのセグメントを DPL(0b00(Ring0))
とします。
このとき、 CPL(3) > DPL(0)
の関係式がなりたちます。
よって、DPLはより高位の権限を有すため、実行中のプログラムはターゲットのプロセスへアクセスできません。
これが保護リングモデルによるアクセス制限の考え方です。
RPL
実際にWinDbgでCSレジスタを見てみる
(画像)
実際、notepad.exeなどユーザモードで起動したプロセスはアタッチでき、「r cs」よりcs=0033つまり、0000 0000 0011 0011を表していることが確認できる
しかし、カーネルモードのプロセスたとえばMsMpEng.exe(Description:Antimalware Service Executable)をアタッチしようとすると、アクセスが拒否されましたと怒られる。これはWinDbgがユーザモードだから?
WindowsAPIの呼び出しフローについて
syscall
ユーザモードからカーネルモードへ権限を昇格するために、
ssyscallすると、USER_DSのまま、一時的にCSレジスタをKERNEL_CSに切り替える。一時的に、というのは、デバイスドライバなどは常時カーネルモードで動く。syscallは、カーネル移行後、システムコールの戻り値を受けるとユーザへ再戻るため。コレが割り込み
スタブであり、ラッパーであり、リレーです
syscallはntdll
で提供されると考えられます。内部的な関数であり、文書化されていません
syscallは、ユーザに提供されるWindowsAPIからネイティブAPIへの翻訳者のようであり、橋渡しであり、スタブであり、ラッパーであり、リレーです。
syscallは、ユーザモードからカーネルモードへ一時的に遷移(URL)し、s
Discussion