備忘録

備忘録

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 出来ません。