Windows用のドライバの一種を書いたら、ネイティブディスプレイドライバとOSとのやりとりを傍受する必要がありました。ネイティブディスプレイドライバは、ミニポートドライバとwin32k.sysによってセッション空間にロードされたDLLで構成されています。私の目標は、win32k.sysとそのDLLを干渉させることでした。さらに、システムには複数のディスプレイドライバが搭載されている可能性があります。Windowsディスプレイドライバのフック、64ビット
私は標準のWDMドライバを作成しました。これはシステム起動時に(つまりwin32kより前に)読み込まれるように設定されていました。初期化中、ZwSetSystemInformation
をSSDTにパッチを当てて接続しました。この関数は、DLLがセッション空間にロード/アンロードされるたびにOSによって呼び出されます。これはまさに私が必要とするものです。
ZwSetSystemInformation
がSystemLoadImage
パラメータで呼び出される - そのパラメータの一つは、SYSTEM_LOAD_IMAGE
構造体へのポインタであり、そのModuleBase
は、モジュールベースのマッピング・アドレスです。次に、マッピングされたイメージを分析します。パッチ私の機能を持つエントリーポイントです。残りは単純です。
このドライバを64ビットWindowsに移植する必要があります。言うまでもありませんが、それは簡単なことではありません。すべてのドライバが
- :これまでのところ私は、次の障害物を発見しました。
私が正しく理解している場合は、PatchGuardとドライバの署名検証がオフになっている可能性があります。専用のマシンにドライバをインストールする必要があります。
オンラインソースによれば、SSDTの位置を突き止める術もあります。
しかし、最近私はPsSetLoadImageNotifyRoutine
という機能が存在することを発見しました。これは、タスクを大幅に簡素化し、汚い技を避けるのに役立ちます。
私の質問は以下のとおりです。
- 私が
PsSetLoadImageNotifyRoutine
使用している場合、私はセッション・スペースにロードされたDLLに関する通知を受け取ることができますか?公式ドキュメントは「システム空間またはユーザ空間」について語っていますが、「システム空間」にはセッション空間も含まれていますか? - がマップされた後に、マップされたDLLイメージにパッチを適用する場合は、PatchGuardを無効にする必要がありますか?
- 私は考えなかった潜在的な問題はありますか?
- 私が欲しいものを達成する他の方法はありますか?
ありがとうございます。
達成しようとしていることは何ですか?根本的な問題の詳細については、問題を解決するためのより良い方法があるかもしれません。 –
@Larry Osterman:私はrdpdd(リモートデスクトップ仮想ディスプレイドライバ)を何か別のものに置き換えようとしています。これを行う正確な理由を説明するには時間がかかりますが、これは必要なものです – valdo
IIRC、リモートデスクトップのものはドライバのフックを必要とせずにすべてプラガブルです - 私はCitrixがリモートデスクトップ製品でこれを行うと信じていますロジックはWin7の時点でリダイレクト可能です)。残念ながら、私はそれがどのように行われたのか分かりません。 –