Win32kHooker — win32k.sys の .data ポインタ差し替えドライバ

Security

概要

Win32kHooker は、win32k.sys に格納された関数ポインタをデータ領域で差し替えることでフックを行う Windows カーネルドライバです。win32k.sys はセッション毎にロードされるため、システム全体のアドレス空間に直接存在しない点が運用上のハードルになります。本プロジェクトは GUI を持つプロセス(例えば winlogon.exe)を探索してそのプロセスのアドレス空間へカーネルからアタッチし、対象の win32k メモリ領域へ書き込みを行うことでこの制約を回避します。Windows 11 に対応しており、学術・研究目的での win32k フック実装サンプルを提供します。

GitHub

リポジトリの統計情報

  • スター数: 11
  • フォーク数: 2
  • ウォッチャー数: 11
  • コミット数: 4
  • ファイル数: 5
  • メインの言語: C++

主な特徴

  • win32k.sys のデータ領域(.data)に格納されたポインタを書き換える「.data ptr swapper」方式を実装
  • winlogon.exe 等の GUI 対応プロセスへアタッチして安全にメモリ修正を行う設計
  • Windows 11 をサポートするモダンな実装(C++、Visual Studio ソリューション付き)
  • 教育・リサーチ向けのシンプルで読みやすいコードベース

技術的なポイント

本プロジェクトの技術的な肝は「セッション空間にロードされる win32k.sys をどう扱うか」にあります。通常のカーネルモジュールはシステム全体のアドレス空間に存在しますが、win32k は各セッションのユーザースペースと密接に結びつくため、すべてのプロセスから直接参照できないことが多いです。Win32kHooker はまず稼働中のプロセス群をスキャンして GUI を扱えるプロセス(winlogon.exe 等)を特定し、そのプロセスのアドレス空間へカーネルからアタッチして処理を行います。アタッチ後は win32k.sys のエクスポートや既知のデータ構造を探索し、.data セクションに収められた関数ポインタを差し替えることでフックを成立させます。これにより、グローバルなシステムマップに頼らずに特定セッション内の win32k 動作を置換できます。実装上は C++ で書かれ、Visual Studio ソリューションが同梱されているためビルドしやすく、学習用途での読み解きやすさが重視されています。一方で、カーネルメモリ書き換えは PatchGuard やドライバ署名、OS の保護機構と衝突する可能性があり、実行環境や法的な枠組みに注意が必要です。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitattributes: file
  • .gitignore: file
  • README.md: file
  • Win32kHooker.sln: file
  • Win32kHooker: dir

まとめ

win32k フックの手法を学ぶためのシンプルで実用的なサンプル実装。

リポジトリ情報:

READMEの抜粋:

Win32kHooker

Win32kHooker is a Windows Kernel Driver that demonstrates how to locate and hook functions within win32k.sys.

Because win32k.sys is a session-space driver, it is not mapped into the system address space of every process. This driver overcomes this limitation by locating a GUI-capable process (e.g., winlogon.exe) and attaching to its address space to safely modify win32k memory.

Mechanism

  1. Process Identification: Scans active processes to find winlogon.exe, …