中間ドライバーを作成します。 パート1

こんにちは親愛なるhabrayuzery!

スニファーがどのように機能し、それが何であるか疑問に思ったことはありますか? または、お気に入りのファイアウォールは、ネットワークレベルでトロイの木馬やその他の厄介さからどのように保護しますか? とにかく、それはどのように機能しますか? あなたはこの種の質問を自問したと思いますが、そうでない場合でも、このことについて一部からお話しします。 この記事から始めて、スニファーのようなドライバーの記述を徐々にマスターします。 今日は、以降の記事で発生するすべてを理解する必要があるいくつかの一般的なポイントを検討します。 この記事を読む前に、多かれ少なかれ明確な画像を作成できるように、過去のトピック「NDIS仕様のドライバーの概要 」を読むことをお勧めします。



猫に興味のある人は誰でも聞いてください。



この記事は、このトピックにあまり精通していないユーザーを対象としているため、すぐに言わなければならないので、いくつかのことを詳細に述べようとします。 さあ、始めましょう。



何が必要で、どこから始めればいいですか?



多くのフォーラムで、このようなコンテンツの質問をよく見ることができます。「私は初心者プログラマーです。ドライバーを書きたいのですが、方法がわかりません。 どこから始めればいいのでしょうか?」そのため、すべてを順番に説明しようとすると、必要なものを伝える必要がありました。



通常のドライバーまたはネットワークドライバーのいずれかのドライバーを作成する場合、WDK-Windowsドライバーキット(別名NT DDK)をダウンロードする必要があります 。 この良さを主力製品にインストールすることで、ドライバーを作成する準備が整います。 WDKには、独自のドキュメント、見出し、または例があります(これらが必要になり、将来のドライバーの骨組みになります)。 Visual Studioで作業する場合、Visual DDKと呼ばれるVS用プラグインもダウンロードできます 。 この統合ツールは、Visual Studioから直接ドライバーを作成(およびビルド)するのに役立ちます。 ここでは、このツールの使用に関する簡単なヘルプを見つけることができます。 Studioのドライバーで動作するようにVisual DDKをインストールする必要はまったくありません。このツールなしでVSでドライバーを作成および構築できます。 これは単なるプラグインです。



WDKの中間ドライバーの例を検討し、修正します。 なぜ中間的なのですか? 前の記事を読んだか、単にNDIS仕様に要約した人は、中間ネットワークドライバーがプロトコルドライバーとミニポートドライバーの両方の動作を組み合わせ、それらの間のレイヤーであることを知っています。 したがって、この例では、少なくとも部分的にすべてのタイプのNDISドライバーをカバーできます。



したがって、ドライバーのスケルトンは、WDKのPassthruドライバーになります。 WDKをインストールすると、\ src \ network \ ndis \ passthruディレクトリでソースを見つけることができます。 このソースの詳細については、 こちらをご覧ください。 これまでのところ、彼はそれを持っているだけです。 ドライバーは何をしますか? スニファーとして機能し、パケットを送受信し、それらに関する情報を受信し、場合によってはそれをブロックまたは変更します。 まず、いくつかの機能を追加し、ドライバーと通信するためのクライアントプログラムを作成しますが、これについては次の記事でのみ説明しますが、ここでは少し理論を学習します。



理論のビット



おそらくご存知のように、DriverEntry関数はドライバーのメイン関数に類似しています;中間ドライバーは、機能を開始する前に行うべきことがいくつかあります。 また、DriverEntryでは、次のことを行う必要があります。



以上です。 ミニポートおよびプロトコルドライバーのコールバックシステムについて前回書いた記事で覚えていますか? したがって、これら4つのアクションを実行すると、コールバック関数を登録する中間ドライバーがここにあります。 ミニポートおよび/またはプロトコルドライバーを扱っていた場合、NdisIMRegisterLayeredMiniport関数はNdisMRegisterMiniport関数(非仮想アダプターの登録時に呼び出される)と非常によく似ており、仮想および非仮想プロトコルの両方を作成するときに、まったく同じものが呼び出されることに気付くでしょう同じ関数NdisRegisterProtocol。 最初に、NDIS_PROTOCOL_CHARACTERISTICSおよびNDIS_MINIPORT_CHARACTERISTICS構造体のフィールドに入力し(使用されたコールバックの名前がここに書き込まれます)、それらをパラメーターとして対応する関数に渡します。



それでは、スニファーについて少し話しましょう。



スニファーについて少し、かなり



スニッファーは、ローカルコンピューターまたは現在のネットワークセグメント内のすべてのコンピューターのネットワークトラフィックを傍受し、場合によっては変更するドライバーです。 あなたが知っているのはそれが何であるかだけであり、少なくともあなたの人生の中で一度はあなたがそれを使ったことがあるか、少なくともそれを見たことがあると確信しています。 考えられるスニファー構築スキームを見てみましょう。

  1. スニファーは、アダプターに対するプロトコルの利用可能なすべてのバインディングに固執する中間ドライバーです。 これは実際、最も簡単な方法です。 利点に加えて、各方法には欠点があります。

    • 新しいバインディングを機能させるには、システムで使用可能なすべてのネットワークアダプターを再起動する必要があります。
    • システムに複数のネットワークアダプターがある場合、スニファーはインターセプトを1つのサブネットのみに制限するか、ルーティングを禁止するか、1つの仮想アダプターではなく多数の仮想アダプターを作成する必要があります。
    • システムに新しいアダプター、プロトコル、または中間ドライバーが表示されるたびに、アダプターへのプロトコルバインディングを再構成する必要があります。 これが行われない場合、スニファーはせいぜいトラフィックの一部の傍受を停止し、最悪の場合、システムを完全にクラッシュさせます。
    • プロセッサが遅い場合、メモリが小さく、ネットワークチャネルが非常に高速であるため、中間ドライバーによってシステムの速度が低下することが重要になる場合があります。


  2. Snifferはドライバーフィルターです。 これはどういう意味ですか? そして、次のことを意味します。たとえば、\ Device \ Tcp(これはtcpip.sysドライバープロトコルデバイス)で、興味のあるデバイスに参加するかのように(各ドライバーには独自のデバイスがあります)、その後、各IRPはこのデバイスに向けられます、最初にドライバーに送信されました。 再び欠点:

    • ドライバーフィルターは、IRPを介して実装される情報フローのみをインターセプトできます。 プロトコルドライバーとそのクライアント間では情報のみが流れます。
    • 対象のデバイスのすべてのカーネルモードクライアントの前にドライバーフィルターを読み込む必要があります。そうしないと、トラフィックの一部が通過します。
    • ドライバーフィルターはシステムの速度を大幅に低下させます。
    • ドライバフィルタを適切にデバッグすることは非常に困難です(デバッグについては、後続の記事で説明します)。 多くのさまざまなグリッチが発生する可能性があります。


  3. Snifferは、システム内のすべてのアダプターにバインドするプロトコルドライバーです。 そのため、WinPCAPやMicrosoft Network Monitorなど、ほとんどすべてのスニファーが着信トラフィックをインターセプトします( 発信トラフィックはスキーム5に従ってインターセプトされます)。 この方法はほぼ完璧です。
  4. Snifferは通常のドライバーであり、その機能は必要に応じてNDISから呼び出されます。 これが、Windows XPでの組み込みパケットフィルターの機能です。 このようなドライバーのサポートは、Microsoftプログラマーによって元々NDISに組み込まれているはずなので、他の誰もそのように働くことはできません。
  5. Snifferは、NDISドライバーのコールバックアドレスが書き込まれているNDIS構造に単純にパッチを適用する通常のドライバーです。 その結果、NDISドライバーのインターセプトされたコールバックを呼び出すと、スニファーが制御を取得します。 これは、ほとんどすべてのサードパーティ製パケットフィルターの機能です(たとえば、OutPost)。 唯一の欠点があります-それはあまり信頼性がありません。


ミニ結論


中間ドライバーを作成するために必要なすべての基本情報についてです。 次の記事では、直接コードを書き始め、IRPについて説明します。 次に、ドライバーのインストールとデバッグも検討します。 このトピックがあなたにとって興味深いものであることを本当に願っています。もしそうであれば、喜んでそれをお伝えします。

ご清聴ありがとうございました。



All Articles