Ⅰ. はじめに
タイトルの通り「Kernel Patch Protection(KPP) / PatchGuard(PG) を回避する方法」です。
Ⅱ. やり方
1. Shark をダウンロードする
2. Shark.sys を読み込む
3. Sea.exe を実行する
実行結果
省略
タイトルの通り「Kernel Patch Protection(KPP) / PatchGuard(PG) を回避する方法」です。
省略
Windows の syscall を hook するメジャーな方法は SSDT Hook です。
しかし、Windows にはカーネル領域の改ざんを検知する仕組みとして Kernel Patch Protection(KPP) 別名 PatchGuard(PG) が存在しています。
KPP/PG の存在によりカーネル領域に存在するSSDTの書き換えは検知され、Windows は BSoD します。
この記事では everdox氏 が作成した InfinityHook を利用する事により SSDT Hook せずに syscall を hook する方法を紹介します。
NtOpenProcess を hook するサンプルです。
git clone https://github.com/kagasu/InfinityHookExample
A. InfinityHook は ETW を利用(abuse)している為、一部 syscall の hook が出来ません。
例えば GetContextThread は InfinityHook を利用して hook 出来ません。
① プロセスメモリの読み込みに成功し、「value 100」が出力された
② プロセスメモリの書き込みに成功し、0x00007FF698394038 の値が 100 から 99999999999 に変更された
自己デジタル署名されたドライバは通常「テストモードとして起動したWindowsのみ」実行できます。
テストモード無効のままドライバを実行したい場合は、有効なデジタル署名を証明機関から購入し、デジタル署名をする必要があります。
この記事では hfiref0x 氏 が作成した DSEFix を利用し、これらの制約を取り払い、テストモード無効状態でもドライバを実行する方法を紹介します。
start_driver.bat
@echo off rem 署名チェックを無効化する dsefix.exe rem ドライバを開始する sc create MyDriver binPath=c:\MyDriver.sys type=kernel sc start MyDriver timeout /t 3 rem デフォルト状態(署名が必要な状態)に戻す dsefix.exe -e pause
テストモード無効状態でドライバが実行できた
タイトルの通り「Windows Kernel Driver で HelloWorld する方法」です。
この記事では Kernel-Mode Driver Framework (KMDF) を利用した場合の例を記事内容とします。
https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
Source.cpp
#include <ntddk.h> extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(DriverObject); UNREFERENCED_PARAMETER(RegistryPath); DbgPrint("Hello, World!"); return STATUS_SUCCESS; }
sc create DriverTest binPath=c:\DriverTest.sys type=kernel sc start DriverTest
このファイルのデジタル署名を確認できませんでした。 最近のハードウェアやソフトウェアの変更により、不正確に署名されたファイルか壊れたファイルがインストールされたか、 または不明なところから悪意のあるソフトウェアがインストールされた可能性があります。
A. 以下の記事を参考に、Windowsをテストモードとして起動してください
https://kagasu.hatenablog.com/entry/2019/12/29/131215
また、以下の記事の方法でも可能です
https://kagasu.hatenablog.com/entry/2019/12/29/141220