スキップしてメイン コンテンツへ

 none
<windows device driver> HKEY_CURRENT_USERに対してresigisry filter driver でfiltering RRS feed

  • 質問

  • HKEY_CURRENT_USERに対してresigisry filter driver でfilteringする方法が知りたいです。
    registry filter driverのチュートリアル的なサンプルがこのサイトにあります。
    サイトの一番最後にあるRegFlt Source Part 3 をダウンロードして、ソースコードを見てください。
    このサンプルコードにある通り、
    bool _RfIsKeyMySecretKey(__in PUNICODE_STRING pParentKeyName, __in PUNICODE_STRING pRelativeKeyName)
    {
        UNICODE_STRING TestKeyName;
        RtlInitUnicodeString(&TestKeyName, L"\\REGISTRY\\MACHINE\\SOFTWARE");
        if (RtlCompareUnicodeString(pParentKeyName, &TestKeyName, TRUE))
        {
            return false;
        }

        RtlInitUnicodeString(&TestKeyName, L"MySecretTestKey");
        return !RtlCompareUnicodeString(pRelativeKeyName, &TestKeyName, TRUE);
    }
    \\REGISTRY\\MACHINE\\SOFTWARE\\MySecretTestKeyに対して制限をかけています。
    つまり、マイクロソフトのサイトでwindows kernel driverにおける root のレジストリーパスについて言及されている通り
    HKEY_LOCAL_MACHINE\\REGISTRY\\MACHINE\\SOFTWARE\\MySecretTestKey
    のレジストリの編集を禁止するregistry filter driver です。

    実際にドライバーをloadしてみると、
    レジストリエディタで先ほどのレジストリのキーを編集しようとしてもアクセスできないとエラーが発生します。
    ここから本題なのですが、HKEY_CURRENT_USERのレジストリに対してフィルタリングをかけたいです。
    しかし、先ほどのrootのレジストリのパスについて言及されているサイトでは
    HKEY_CURRENT_USER
    No simple kernel-mode equivalent, but see Registry Run-Time Library Routines

    と書かれていました。直接的な表現方法がないと理解しているのですが、実際にリンク先を見ても、よくわかりません。

    RtlXxxRegistryXxx関数の引数のRelativetoの引数にHKEY_CURRENT_USERを表すreistryのpathを指定して、

    HKEY_CURRENT_USERのレジストリに対して働きかけるといった、RtlXxxRegistryXxx関数のことしか言及しておらず、

    もっと一般的なことには言及されていませんでした。

    上のサンプルコードに実装することとは何の関係もなく、意味がわからない状態に陥っています。

    たとえば、上のサンプルコードにHKEY_CURRENT_USERにたいして処理をするように改良したいのですが方法がわかりません。
    回答お願いします。

    <目的>
    とりあえず、githubにあるregistry filter driverのサンプルregfltrを勉強しているところなんですが、このサンプルが実験するレジストリーのパスも先ほどのコードと同様にHKEY_CURRENT_USERに変更したいです。最終的にHKEY_CURRENT_USERにあるレジストリに制限をかけるreigisry filter driverを開発したいと思っています。

    <windows  device driver の学習状況>
    仮想環境でvirtualboxの環境を整えて、visualstudioでコーディングしています。
    registry filter driverの勉強をしています。デバイスドライバをこの動画で学んだ後、
    windows device driverのチュートリアルの動画の
    windows driver device  tutorial
    windows driver development tutorial for begginers
    で勉強しました。そのあと、windows device driverのregistry filter についても
    チュートリアルのサイトRegistry Filter Driversで勉強しました。


    2019年2月8日 7:34

回答

  • 提示されている "Registry Key Object Routines" リファレンスに書いてある通りだと思います。
    [HKEY_CURRENT_USER] キーは基本的に [HKEY_USERS] のサブキーです。
    つまり独立した Root Key ではなく、[HKEY_USERS] の中から Current User の SID に紐づけられたサブキーを抽出し、それを [HKEY_CURRENT_USER] キーとして User Mode 側に提供している。。。ということだっと思います
    たから Kernel Mode 側としては、[HKEY_USERS] の一部である [HKEY_CURRENT_USER] を独立したオブジェクトとしては扱っていない。。。ということではなかと。
    この点については、下記 KB に説明があります。
    (かなり古い情報ですが。。。)
    ----------------------------------------------
    上級ユーザー向けの Windows レジストリ情報
    https://support.microsoft.com/ja-jp/help/256986/windows-registry-information-for-advanced-users

    HKEY_USERS
    コンピューター上に読み込まれた有効なユーザー プロファイルがすべて格納されます。
    HKEY_CURRENT_USER は、HKEY_USERS のサブキーです。
    HKEY_USERS は "HKU" と省略されることがあります。
    ----------------------------------------------

    なので、[HKEY_CURRENT_USER] キーに対してフィルタリングをしたいのであれば、その Root Key である [HKEY_USERS] からアクセスする必要があると思います。
    ここら辺の仕様に関しては確かにドキュメントが少ないのですが、まぁそれは仕方のないことかと。
    CmRegisterCallback() / CmRegisterCallbackEx() は、XP のころから既に公開されているカーネル サービス関数ですが、私が 10 年ぐらい前に初めてこの関数の存在に気付いたときは「マジか?」と思いました。
    公開されているドキュメントはそのころからほとんど増えていないので、マイクロソフト側もできれば公開したくないのでは。。。と思っています。
    ただセキュリティ関連ソフトは、ほぼ例外なくレジストリ監視用のドライバを組み込んでいます。
    (こんなことを書くとまた怒られそうですが、) それでも [HKEY_CURRENT_USER] キーの詳細なフィルタリングを知りたいのであれば、セキュリティ関連ソフトウェアが組み込んでいるドライバを自力でハックするか、マイクロソフトとプレミア サポート契約を結ぶかの、どっちかしかないと思います。
    (もっとも、高額なプレミア サポート契約結んでも、全部教えてもらえるわけではありませんが。。。。)

    2019年2月8日 9:08

すべての返信

  • 提示されている "Registry Key Object Routines" リファレンスに書いてある通りだと思います。
    [HKEY_CURRENT_USER] キーは基本的に [HKEY_USERS] のサブキーです。
    つまり独立した Root Key ではなく、[HKEY_USERS] の中から Current User の SID に紐づけられたサブキーを抽出し、それを [HKEY_CURRENT_USER] キーとして User Mode 側に提供している。。。ということだっと思います
    たから Kernel Mode 側としては、[HKEY_USERS] の一部である [HKEY_CURRENT_USER] を独立したオブジェクトとしては扱っていない。。。ということではなかと。
    この点については、下記 KB に説明があります。
    (かなり古い情報ですが。。。)
    ----------------------------------------------
    上級ユーザー向けの Windows レジストリ情報
    https://support.microsoft.com/ja-jp/help/256986/windows-registry-information-for-advanced-users

    HKEY_USERS
    コンピューター上に読み込まれた有効なユーザー プロファイルがすべて格納されます。
    HKEY_CURRENT_USER は、HKEY_USERS のサブキーです。
    HKEY_USERS は "HKU" と省略されることがあります。
    ----------------------------------------------

    なので、[HKEY_CURRENT_USER] キーに対してフィルタリングをしたいのであれば、その Root Key である [HKEY_USERS] からアクセスする必要があると思います。
    ここら辺の仕様に関しては確かにドキュメントが少ないのですが、まぁそれは仕方のないことかと。
    CmRegisterCallback() / CmRegisterCallbackEx() は、XP のころから既に公開されているカーネル サービス関数ですが、私が 10 年ぐらい前に初めてこの関数の存在に気付いたときは「マジか?」と思いました。
    公開されているドキュメントはそのころからほとんど増えていないので、マイクロソフト側もできれば公開したくないのでは。。。と思っています。
    ただセキュリティ関連ソフトは、ほぼ例外なくレジストリ監視用のドライバを組み込んでいます。
    (こんなことを書くとまた怒られそうですが、) それでも [HKEY_CURRENT_USER] キーの詳細なフィルタリングを知りたいのであれば、セキュリティ関連ソフトウェアが組み込んでいるドライバを自力でハックするか、マイクロソフトとプレミア サポート契約を結ぶかの、どっちかしかないと思います。
    (もっとも、高額なプレミア サポート契約結んでも、全部教えてもらえるわけではありませんが。。。。)

    2019年2月8日 9:08
  • 回答ありがとうございます。

    HKEY_USERSに全ユーザーのレジストリのサブキーが格納されていて、それらがSIDで名前がつけられているので

    今ログインしているユーザーがどのSIDに当てはまるかを具体的に調べて

    現在ログオンしているuserのSIDがつけられたサブキーで実装すればいいことがわかりました。

    つまり、具体的には

    \\REGISTRY\\USERS\\(デバイスドライバでフィルタリングをかけたいユーザーのSID)\\SOFTWARE

    例 \\REGISTRY\\USERS\\S-xxxxx-xxxx-xxxxx\\SOFTWARE\\MySecretKey

    ということがわかりました。

    とりあえず1人のユーザーファイルにだけ適用できるようにwindows registry filter driverに実装します。

    ログインユーザーが変わったらその都度、対応する(HKCUの特性そのもの)といった実装は別の機会にします。

    現在ログインしているユーザーのSIDを取得できる関数とかを使えばたぶんできそうなのですが、またの機会にします。

    回答ありがとうございました。

    2019年2月8日 10:19