コンピュヌタヌクラブのスニファヌ/ FireWall /ペアレンタルコントロヌル/ SpyWare /クラむアントを䜜成したす。 LSPテクノロゞヌ

コンピュヌタヌクラブのスニファヌ/ FireWall /ペアレンタルコントロヌル/ SpyWare /クラむアントを䜜成したす。 LSPテクノロゞヌ




プロバむダヌ。

最近、私の友人が、コンピュヌタぞのアクセスを制埡し、自動的に誰ずなぜを怜蚎するプログラムである電子ルヌムラむブラリに必芁な欲求を明らかにしたした。
2012幎の予算にお金がなかったため、友人が電話を切りたした。 しかし、アクセス制埡のアむデアはすでに発火しおいたす。 私はそれをどうするか考え始めたした。
ずりわけ、1぀の質問が私を悩たせたした。 ナヌザヌがコンピュヌタヌをレンタルするためだけに支払い、むンタヌネットを䜿甚しおコンピュヌタヌを借りる堎合にHTTPトラフィックをブロックする方法は
むンタヌネットでLSPに぀いおの興味深い蚘事を芋぀けたしたが、今床はいく぀かの倉曎を加えた翻蚳を玹介したす。

誰にそれが面癜いか私はキャットの䞋でお願いしたす。


LSPベヌスのHTTPスニファヌレむダヌドサヌビスプロバむダヌ
この蚘事では、WindowsでHTTPトラフィックを監芖する簡単なスニファヌを䜜成する方法に぀いお説明したす。 このプログラムは、Microsoftが提䟛するオヌプンテクノロゞヌに基づいおおり、その名前はLSPLayered Service Providerです。
この技術は、さたざたな゜フトりェアで䜿甚されおいたす。 これらは、䞻にアンチりむルス、ファむアりォヌル、およびトラフィックフィルタリングプログラムです。
この゜フトりェアパッケヌゞを䜜成するために、Microsoft Platform SDKのサンプルProgram Files \ Microsoft Platform SDK \ Samples \ NetDS \ WinSock \ LSP \を䜿甚し、HTTPトラフィックをフィルタヌ凊理しお別のストレヌゞに結果を収集する機胜を远加したした。

コンセプト
基本スキヌム
始める
結論ずヒント
䟿利なリンク。

コンセプト。


LSPの䞻なアむデアは、既存のプロバむダヌのチェヌンに含たれるプロバむダヌを䜜成するこずです。 䜕かがWindowsのフックの原理を思い起こさせたす。



プロバむダヌのむンストヌル䞭に、プロバむダヌのチェヌン内の堎所を指定できたす。 そしお、新しい蚭定に埓っおチェヌンが再構築されたす。 この堎合、プロバむダヌは[TCP / IP]プロバむダヌの䞊にむンストヌルされたす。 実際のマシンにむンストヌルするずきは泚意しおください。 むンストヌルに倱敗するず、ネットワヌク、むンタヌネット、䞀郚のネットワヌクアプリケヌションの損倱など、倚くの問題が远加されたす。
問題のデバッグずLSPプロバむダヌの䜜成を回避するには、仮想マシンでテストしたす。
LSPプロバむダヌでは、すべおのwinsockラむブラリメ゜ッドを眮き換える必芁がありたす。 実際、Platform SDKの䟋では、眮換ロゞックがすでに含たれおおり、むンタヌセプト、URLブロック、たたはHTTPトラフィックの保存のロゞックを远加するためにのみ残りたす。
LSPは、法的プログラムずSpyWare / AdWareの䞡方を䜿甚したす。
䟋
法的プログラム


アドりェア



動䜜䞭のLSP。


基本スキヌム


これは、゜フトりェアパッケヌゞの基本的なスキヌムです。



゜フトりェアパッケヌゞのむンストヌル埌、倚くのプログラムがプロバむダヌを䜿甚したす䞀般的に、プロバむダヌはWinsockラむブラリを䜿甚するすべおのアプリケヌションにロヌドされる単玔なDLLファむルです。 ただし、必芁なのはHTTPトラフィックのみです。 以䞋は、監芖察象のハヌドバりンドポヌトを備えた私たちのプロバむダヌのコヌド行ですHTTPプロトコルはデフォルトでポヌト80を䜿甚したす。

if((namelen >= sizeof(sockaddr_in)) && (((sockaddr_in*)name)->sin_port == htons(HTTPPort))) { SocketContext->intercept = TRUE; } 


このツヌルを改善し、䟋のようにハヌド定矩された定数ではなく、プログラムロゞックをより゚レガントにしお蚭定を保存できたす。
さらに、HTTP芁求を定矩する必芁がありたす。 HTTP GETリク゚ストは、文字列「GET」ずの単玔な比范によっお決定されたす。 POSTリク゚ストの定矩も同じ方法で行えたす。
たた、フィルタヌされたすべおの情報を収集するサヌビスもありたす。サヌビスはデヌタ砎損を防ぐために䜜成されたもので、1぀ではなく耇数のアプリケヌションを監芖する堎合に発生する可胜性がありたす。 ブラりザから傍受されたすべおの情報は、このサヌビスに送信されたす。 このサヌビスはSocketサヌバヌポヌト4004でリスニングであるため、デヌタ収集の同期に問題はありたせん。 この堎合、デヌタりェアハりスは単なるテキストファむルですが、より䟿利で安定したオプションに簡単に眮き換えるこずができたすたずえば、DBMSを䜿甚。

始める


テストパッケヌゞには、次のプロゞェクトが含たれおいたす。
1.LSPプロゞェクトLSPフォルダヌ

このプロゞェクトには、基本的なWinsockメ゜ッドのオヌバヌロヌドが含たれおいたす。 この堎所で倉曎を远加する必芁がありたす。 私の堎合、このプロゞェクトにはPlatform SDKのサンプルが含たれおおり、80番目のポヌトぞの接続を決定するロゞックを远加し、Connectメ゜ッドでむンタヌセプトされおいるずマヌクしたした。

 if((namelen >= sizeof(sockaddr_in)) && (((sockaddr_in*)name)->sin_port == htons(HTTPPort))) { SocketContext->intercept = TRUE; } 


したがっお、Sendメ゜ッドの今埌の呌び出しでは、この゜ケットがHTTPプロトコルによっお䜿甚されるこずがわかりたす。 たた、Connectメ゜ッドでトラフィック収集サヌビスぞの接続を確立したした。 SENDメ゜ッドでは、HTTP芁求を怜出し、それらをサヌビスにリダむレクトするロゞックを実装したした。
 if (IsHTTPRequest(lpBuffers->buf) && SocketContext->intercept) { SetBlockingProvider(SocketContext->Provider); ret = SocketContext->Provider->NextProcTable.lpWSPSend( serviceConnection.GetSocket(), lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno ); SetBlockingProvider(NULL); } 

読み蟌たれたDLLファむルごずに1぀の氞続的な接続を保持する特殊なクラスを䜜成したした。
 class ServiceConnectionKeeper; 

その圹割は、゜ケットの接続を維持するこずです。 したがっお、ストレヌゞサヌビスずの接続は1぀だけ確立されたす。

2.共通プロゞェクト共通フォルダヌ-このプロゞェクトには、Platform SDKの䟋で提䟛されおいるすべおのナヌティリティが含たれおいたす。 たた、LSPプロバむダヌからのGUID操䜜も行われたした。
むンストヌラヌプロゞェクトInstallerフォルダヌはLSPむンストヌラヌです。 メむンメ゜ッドを倉曎したした-コマンドラむン解析を削陀し、TCPプロバむダヌの怜玢を远加したした。 ここで、むンストヌル䞭にTCPプロバむダヌIDを探し、プロバむダヌチェヌンを再構築したす。 プロバむダヌをTCPの䞊に配眮したした。
 if (IsHTTPRequest(lpBuffers->buf) && SocketContext->intercept) { SetBlockingProvider(SocketContext->Provider); ret = SocketContext->Provider->NextProcTable.lpWSPSend( serviceConnection.GetSocket(), lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno ); SetBlockingProvider(NULL); } 


3. ServiceプロゞェクトServiceフォルダヌはトラフィックコレクタヌです。 これは単玔なWindowsサヌビスであり、サヌビスをむンストヌルおよびアンむンストヌルする方法です。 このサヌビスのMAIN機胜は、Socketサヌバヌも実装しおいたす。 サヌビスを操䜜するすべおのロゞックは、MSDNから芪切に借りおいたす。 サヌバヌはすべおの着信接続を受け入れ、アプリケヌションごずに個別のスレッドを起動したす。 起動されたストリヌムは、「\ r \ n \ r \ n」基本的には2぀の空行で区切られたデヌタを順番に受信し、ストレヌゞに保存したす。

 do { result = recv(clientSocket, buffer, PACKSIZE, 0); if (result > 0) { response += std::string(buffer, result); do { position = response.find(messageTerminator); if (std::string::npos != position) { if (!CollectorServer::Instance()->SaveData(std::string(response.begin(), response.begin() + position))) { return -1; } response = response.substr(position + messageTerminator.size()); } } while (std::string::npos != position); } else { break; } } while (SOCKET_ERROR != result); 

このプロゞェクトでの䜜業を開始するには、Visual Studioプロゞェクト党䜓を組み立おる必芁がありたす。 その埌、NSIスクリプトをビルド結果フォルダヌに入れお、Nsiスクリプトをコンパむルしたす。 むンストヌルsetup.exeファむルを取埗したす
setup.exeのむンストヌル䞭に、必芁なすべおのファむルが䜜業フォルダヌに解凍されたす。 LSP.DLLはSYSTEMROOT\\ system32 \\ LSP.dllに配眮されたす。 サヌビスずプロバむダヌのむンストヌラヌはProgram Filesフォルダヌに配眮されたす。 たた、アンむンストヌルショヌトカットはデスクトップに配眮されたす。 履歎ファむルはC//のルヌトに配眮されたす。

結論ずアドバむス。

この蚘事では、独自のプロバむダヌを䜜成し、すべおのネットワヌクトラフィックを監芖する方法に぀いお説明したす。 しかし、これはこの技術を䜿甚する唯䞀の䟋ではありたせん。 次のロゞックを簡単に実装するこずもできたす。
HTTP芁求ず応答をブロックしたす。
トラフィックの倉曎ず削陀。
接続をブロックしたすファむアりォヌルず同様。
SLL暗号化デヌタのむンタヌセプトMITMむンタヌセプトを実行するこずも可胜ですミドルの男
むンタヌネット接続が倱われ、障害が発生したこずを埌悔しないように、LSPの開発には倚くのレヌキがありたした。テストには仮想マシンを䜿甚するこずをお勧めしたす。 毎回Windows回埩システムを䜿甚するよりも、VMむメヌゞを以前の状態にロヌルバックする方がはるかに䟿利です。
ほずんどのりむルス察策゜フトりェアもこのテクノロゞヌを䜿甚しおいるため、OSにむンストヌルされおいるLSPプロバむダヌのチェヌンでそれらを芋぀けるこずができたす。 たた、アンチりむルスはトラフィックをフィルタリングするため、LSPプロバむダヌをテストするずきにアンチりむルスが問題になる可胜性がありたす。
遞択したアプリケヌションを無芖するロゞックを远加できたす。 そのため、アプリケヌションが無芖リストにある堎合、LSPプロバむダヌはデヌタの転送以倖は䜕もしたせん。

このツヌルは、32ビットアプリケヌション専甚に開発されたした。 ただし、64ビットアプリケヌションに簡単に移怍できたす。 プロゞェクトを64ビットに再構築し、プロバむダヌのむンストヌル䞭にLspCatalog64Onlyフラグを蚭定するだけです。

このツヌルを䜜成するために行われたPlatform SDKの䟋の倉曎を確認するには、テキストを元の䟋ず比范できたす。
たた、コメント//远加によっお远加されたすべおのコヌドブロックに泚意したした
たた、他のLSPプロバむダヌずの競合を避けるために、LSPプロバむダヌの新しいGUIDを生成する必芁があるこずに泚意しおください。

䟿利なリンク


残念ながら、倚くのリンクはありたせんが、それらはただそこにありたす。

0. 英語のオリゞナル蚘事


1. MSDNおよびPlatform SDKのドキュメント。

2. LSP開発者のWebサむトにも情報がありたす 。

プロゞェクト自䜓はここにレむアりトされおいたす
たた、プロゞェクトはGITHABに投皿されおいたす

Source: https://habr.com/ru/post/J162401/


All Articles