備忘録

備忘録

Kernel Patch Protection(KPP) / PatchGuard(PG) を回避する方法

Ⅰ. はじめに

タイトルの通り「Kernel Patch Protection(KPP) / PatchGuard(PG) を回避する方法」です。

Ⅱ. やり方

1. Shark をダウンロードする

https://github.com/9176324/Shark/releases

2. Shark.sys を読み込む
3. Sea.exe を実行する

実行結果

省略

InfinityHook を利用して Windows の syscall を hook する方法

Ⅰ. はじめに

Windows の syscall を hook するメジャーな方法は SSDT Hook です。
しかし、Windows にはカーネル領域の改ざんを検知する仕組みとして Kernel Patch Protection(KPP) 別名 PatchGuard(PG) が存在しています。
KPP/PG の存在によりカーネル領域に存在するSSDTの書き換えは検知され、WindowsBSoD します。

この記事では everdox氏 が作成した InfinityHook を利用する事により SSDT Hook せずに syscall を hook する方法を紹介します。

Ⅱ. やり方

NtOpenProcess を hook するサンプルです。

1. clone する
git clone https://github.com/kagasu/InfinityHookExample
2. コンパイルする
3. 実行する

実行結果

得られたアクセス権限が Full control から VM operation に変化した。

hook 前 f:id:kagasu:20191229155321p:plain:h100
hook 後 f:id:kagasu:20191229155351p:plain:h100

FAQ

Q. hook できません。

A. InfinityHook は ETW を利用(abuse)している為、一部 syscall の hook が出来ません。
例えば GetContextThread は InfinityHook を利用して hook 出来ません。

Windows カーネルドライバでプロセスメモリを読み書きする方法

Ⅰ. はじめに

タイトルの通り「Windows カーネルドライバでプロセスメモリの読み書きをする方法」です。

Ⅱ. サンプルプログラム

https://github.com/kagasu/KMMM

実行結果

① プロセスメモリの読み込みに成功し、「value 100」が出力された
② プロセスメモリの書き込みに成功し、0x00007FF698394038 の値が 100 から 99999999999 に変更された
f:id:kagasu:20191229143049p:plain

自己デジタル署名されたドライバをテストモード無効状態で実行する方法

Ⅰ. はじめに

自己デジタル署名されたドライバは通常「テストモードとして起動したWindowsのみ」実行できます。
テストモード無効のままドライバを実行したい場合は、有効なデジタル署名を証明機関から購入し、デジタル署名をする必要があります。

この記事では hfiref0x 氏 が作成した DSEFix を利用し、これらの制約を取り払い、テストモード無効状態でもドライバを実行する方法を紹介します。

Ⅱ. やり方

1. DSEfix をダウンロードする

https://github.com/hfiref0x/DSEFix/tree/master/Compiled

2. bat ファイルを作成する

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
3. bat ファイルを実行する

実行結果

テストモード無効状態でドライバが実行できた
f:id:kagasu:20191229141152p:plain:h300

Windows Kernel Driver で HelloWorld する方法

Ⅰ. はじめに

タイトルの通り「Windows Kernel Driver で HelloWorld する方法」です。
この記事では Kernel-Mode Driver Framework (KMDF) を利用した場合の例を記事内容とします。

Ⅱ. やり方

2. Kernel Mode Driver, Empty(KMDF) の新規プロジェクトを作成する

f:id:kagasu:20191229133413p:plain

3. サンプルプログラムを書く

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;
}
4. 実行する
sc create DriverTest binPath=c:\DriverTest.sys type=kernel
sc start DriverTest

実行結果

f:id:kagasu:20191229134002p:plain:h300

FAQ

Q. 以下のメッセージが表示され、ドライバの実行ができない
このファイルのデジタル署名を確認できませんでした。
最近のハードウェアやソフトウェアの変更により、不正確に署名されたファイルか壊れたファイルがインストールされたか、
または不明なところから悪意のあるソフトウェアがインストールされた可能性があります。

A. 以下の記事を参考に、Windowsをテストモードとして起動してください
https://kagasu.hatenablog.com/entry/2019/12/29/131215

また、以下の記事の方法でも可能です
https://kagasu.hatenablog.com/entry/2019/12/29/141220