私が協力しているチームは、最近、私たちのソフトウェアをサードパーティの仮想化ソフトウェアと互換性を持たせるという課題に直面しています。ZwCreateKey
このソフトウェアは、カーネルドライバーを使用して、WindowsネイティブレジストリAPI(など)のフックを実行します。Ntdllで呼び出しをフックすることで機能します。私たちのソフトウェアもかなり低レベルであり、状況によっては、フックされることなく実際のレジストリにアクセスする必要があります。
私たちは、独自のカーネルドライバーを使用してZwCreateKey
、フックを回避するために、などを呼び出す可能性を模索しています。これは基本的に、NTレガシードライバーと、独自のネイティブレジストリ機能を提供するユーザーモードライブラリを作成することを意味します。ライブラリとドライバーは非常に単純です。IOCTLを使用してZwCreateKey
、などのすべてのパラメーターをドライバーに渡し、カーネルバージョンの呼び出しを呼び出して結果を返します。
このアプローチはうまく機能しており、仮想化すると実際のレジストリに対して読み取り/書き込みのシステムができたように見えます。唯一の問題は、新しいシステムがレジストリオブジェクトのWindowsセキュリティを循環させているように見えることです。
ZwCreateKey
次のようなアクセスマスクを取ります。
NTSTATUS ZwCreateKey(
__out PHANDLE KeyHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__reserved ULONG TitleIndex,
__in_opt PUNICODE_STRING Class,
__in ULONG CreateOptions,
__out_opt PULONG Disposition
);
私の理解では、現在カーネルモードで実行していますが、ユーザーのトークンのコンテキストはまだあります。これは、アクセスマスクテストが失敗した場合のユーザーと同じように、のカーネルバージョンZwCreateKey
が失敗することを意味するはずです。実際に起こっていることは、制限されたトークンを使用しても、ドライバーが呼び出されたときに、制限されたユーザーによって呼び出されたときに、制限された部分HKLMにキーを作成できることです。何が得られますか?ACLチェックを自分で実行する必要がありますか?カーネルモードで自分の特権を制限するために何かをする必要がありますか?どんな助けでも大歓迎です。