2012-03-18 11 views
5

Windows用のドライバの一種を書いたら、ネイティブディスプレイドライバとOSとのやりとりを傍受する必要がありました。ネイティブディスプレイドライバは、ミニポートドライバとwin32k.sysによってセッション空間にロードされたDLLで構成されています。私の目標は、win32k.sysとそのDLLを干渉させることでした。さらに、システムには複数のディスプレイドライバが搭載されている可能性があります。Windowsディスプレイドライバのフック、64ビット

私は標準のWDMドライバを作成しました。これはシステム起動時に(つまりwin32kより前に)読み込まれるように設定されていました。初期化中、ZwSetSystemInformationをSSDTにパッチを当てて接続しました。この関数は、DLLがセッション空間にロード/アンロードされるたびにOSによって呼び出されます。これはまさに私が必要とするものです。

ZwSetSystemInformationSystemLoadImageパラメータで呼び出される - そのパラメータの一つは、SYSTEM_LOAD_IMAGE構造体へのポインタであり、そのModuleBaseは、モジュールベースのマッピング・アドレスです。次に、マッピングされたイメージを分析します。パッチ私の機能を持つエントリーポイントです。残りは単純です。

このドライバを64ビットWindowsに移植する必要があります。言うまでもありませんが、それは簡単なことではありません。すべてのドライバが

  • SSDTが直接エクスポートされません
  • PatchGuardを締結しなければなりません

    • :これまでのところ私は、次の障害物を発見しました。

    私が正しく理解している場合は、PatchGuardとドライバの署名検証がオフになっている可能性があります。専用のマシンにドライバをインストールする必要があります。

    オンラインソースによれば、SSDTの位置を突き止める術もあります。

    しかし、最近私はPsSetLoadImageNotifyRoutineという機能が存在することを発見しました。これは、タスクを大幅に簡素化し、汚い技を避けるのに役立ちます。

    私の質問は以下のとおりです。

    • 私がPsSetLoadImageNotifyRoutine使用している場合、私はセッション・スペースにロードされたDLLに関する通知を受け取ることができますか?公式ドキュメントは「システム空間またはユーザ空間」について語っていますが、「システム空間」にはセッション空間も含まれていますか?
    • がマップされた後に、マップされたDLLイメージにパッチを適用する場合は、PatchGuardを無効にする必要がありますか?
    • 私は考えなかった潜在的な問題はありますか?
    • 私が欲しいものを達成する他の方法はありますか?

    ありがとうございます。

  • +0

    達成しようとしていることは何ですか?根本的な問題の詳細については、問題を解決するためのより良い方法があるかもしれません。 –

    +0

    @Larry Osterman:私はrdpdd(リモートデスクトップ仮想ディスプレイドライバ)を何か別のものに置き換えようとしています。これを行う正確な理由を説明するには時間がかかりますが、これは必要なものです – valdo

    +0

    IIRC、リモートデスクトップのものはドライバのフックを必要とせずにすべてプラガブルです - 私はCitrixがリモートデスクトップ製品でこれを行うと信じていますロジックはWin7の時点でリダイレクト可能です)。残念ながら、私はそれがどのように行われたのか分かりません。 –

    答えて

    2

    マップされたDLLイメージをマップした後にパッチを適用する場合は、PatchGuardを無効にする必要がありますか?

    x64にドライバをロードするには、署名する必要があります。管理者権限を使ってPatchGuardを無効にすることができます。私はこれを行うためのGUIアプリケーションであるDSEOの使用を個人的に推奨します。または、MBR(またはBIOS)を上書きしてPatchGuardをバイパスすることもできますが、これは通常ブートキットと見なされます。

    関連する問題