Duda CSocketMaster, error al transferir un archivo

Iniciado por The_Shakah, 26 Junio 2009, 05:15 AM

0 Miembros y 2 Visitantes están viendo este tema.

The_Shakah

Hola amigos, les queria preguntar una duda, estoy haciendo un troyano y lo tenía hecho con la libreria winsock pero como quiero prescindir de esta libreria, me puse a buscar un clon de ella, y encontre CSocketMaster, todo el troyano funciona muy bien con CSocketMaster menos la de transferir un archivo, y es que con Winsock el servidor transfería todo el archivo entero, y el cliente lo iba recibiendo de a poco, de este modo:

Código (vb) [Seleccionar]
Public Sub Enviar_Componente(Index As Integer)
Dim tamaño As Long
'abrimos el archivo en modo binario de lectura
Open App.Path & "\DIjpg.dll" For Binary Access Read As #1

tamaño = LOF(1) 'Tamaño en bytes de la imagen
'Redimensionamos el Array
ReDim imagen(tamaño - 1)
'Leemos todo el archivo y lo almacenamos en el array imagen
Get #1, , imagen
Close
'Enviamos el array al cliente
frmMain.Winsock2(Index).SendData imagen
frmMain.ProgressBar1.Max = tamaño + 1
frmMain.ProgressBar1.Visible = True
End Sub


Después la progressBar va aumentando en el evento SendProgress.

Código (vb) [Seleccionar]
Private Sub Winsock2_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long)

If progreso = True Then

ProgressBar1 = ProgressBar1 + bytesSent ' bytesSent son los bytes enviados
End If
End Sub


Y el cliente lo recibe de este modo:

Código (vb) [Seleccionar]
       Dim Archivo() As Byte
       'Aumentamos sizeFileRecibido con los datos que van llegando
       sizeFileRecibido = sizeFileRecibido + bytesTotal
       'Recibimos los datos y lo almacenamos en el array de bytes
       Winsock1.GetData Archivo
       'Escribimos en disco el array de bytes, es decir lo que va llegando
       Put #1, , Archivo
 
       ' Si lo recibido es mayor o igual al tamaño entonces se terminó y cerramos
       'el archivo abierto
       If sizeFileRecibido >= sizeFile Then 'SizeFile contiene el tamaño en bytes del archivo que se esta recibiendo
       'Cerramos el archivo
       Close #1
       sizeFileRecibido = 0
       End If



Esto funciona perfectamente con Winsock, pero no así con CSocketMaster. En las normas dice que uno se limite a decir que lo que pasa, sin dar opiniones de cual cree uno que es el problema, pero si me lo permiten, creo que el problema pasa porque CSocketMaster intenta enviar todo el archivo de una, y el resultado es que envía solo 8kb aprox del total del archivo, el Winsock, en cambio, lo va enviando de a partes, de esto me doy cuenta porque el evento Data_Arrival es llamado una y otra vez con la Winsock.ocx, y en el CSocketMaster solo es llamado una vez, escribe 8kbs aprox. y nunca más sucede nada más.

Estoy casi seguro que ese es el problema, pero no tengo idea de como tengo que hacer para solucionarlo ¿Alguna ayuda?

Quizás puedan recomendarme alguna otra class para imitar al Winsock que no sea CSocket...

BlackZeroX

prueba con esto:

El codigo que te pongo esta un poco mejor (No esta optimisado ojo, ya que el el archivo final posiblemente incremente unos bytes mas xP, pero el archivo en si funcionara perfectamente.¡!)

Este tramo es para No cargar por Completo el Archivo a enviar por completo de esta forma NO USAMOS TODA LA RAM si es que fuese un archivo de un GIGA o MAS xS, por ello se puede enviar cualquier archivo.¡!
Código (vb) [Seleccionar]

Dim Buffer As String * 1024             'Declaramos la variable de 1 Kb
Open Archivo For Binary As #1   'Abrimos en modo binario
    Do While Not EOF(1)                 'Mientras no lleguemos al final
        Get #1, , Buffer
        tcpCliente.SendData Buffer      'va mandando los dato
    Loop                                'hasta q terminemos
Close #1                                'cerramos el archivo


'No tengo que decir nada de este.
Código (vb) [Seleccionar]

Private Sub tcpServidor_DataArrival(ByVal bytesTotal As Long)
    Dim Datos As String
    tcpServidor.GetData Datos, vbString
    Open Archivo For Binary As #1
        Seek (1), LOF(1) + 1 'Nos posicionamos en el ULTIMO BYTE + 1
        Put #1, , Datos 'Escribimos
    Close #1
End Sub


Dulces Lunas
The Dark Shadow is my passion.

BlackZeroX

el codigo que te puse carga y va enviando de 1kb cada vez hasta que sease el ultimo puedes modificarlo hasta 8kb tengo entendido.¡!, pero el archivo final si no llegase a ser multiplo de 8 quedaria un poco mas pesadito no mas de 78191 bytes
The Dark Shadow is my passion.

The_Shakah

#3
Muchas gracias BlackZeroX, supongo que con eso funcionará, mañana lo intento y comento, ahora me voy a dormir.

Lo que no entiendo es esto:
Código (vb) [Seleccionar]

   Do While Not EOF(1)                 'Mientras no lleguemos al final
       Get #1, , Buffer
       tcpCliente.SendData Buffer      'va mandando los dato
   Loop  


No entiendo como eso llega al final... no es un bucle infinito que almacena siempre el primer kb??

Otra cosa:

Código (vb) [Seleccionar]
Dim Buffer As String * 1024    

En primer lugar no deberia ser de tipo byte la variable, o al menos integer?
Pero además de eso, no estas creando una variable de 1kb, estas creando una variable de texto vacía (0 * 1024 es = a 0)

yovaninu

Cita de: The_Shakah en 26 Junio 2009, 05:15 AM
Esto funciona perfectamente con Winsock, pero no así con CSocketMaster. En las normas dice que uno se limite a decir que lo que pasa, sin dar opiniones de cual cree uno que es el problema, pero si me lo permiten, creo que el problema pasa porque CSocketMaster intenta enviar todo el archivo de una, y el resultado es que envía solo 8kb aprox del total del archivo, el Winsock, en cambio, lo va enviando de a partes, de esto me doy cuenta porque el evento Data_Arrival es llamado una y otra vez con la Winsock.ocx, y en el CSocketMaster solo es llamado una vez, escribe 8kbs aprox. y nunca más sucede nada más.

Estoy casi seguro que ese es el problema, pero no tengo idea de como tengo que hacer para solucionarlo ¿Alguna ayuda?

Quizás puedan recomendarme alguna otra class para imitar al Winsock que no sea CSocket...

No no, me parece que estas equivocado,  tanto el Winsock como el CSocketMaster funcionan muy igual, no he revisado al milimetro tu code pero estoy muy seguro (salvo equivocacion universal mia) que el Csocket funciona tan igual que el Winsock, asi que si con uno funciona con el otro tambien, te lo digo por experiencia y nunca he tenido problemas ni con la Clase ni con el OCX y menos con la transferencia de archivos... deja de pensar que el CSocketMaster es menos que el OCX, nada de eso es tan o mas poderoso que Winsock.

Un saludo.

BlackZeroX

Cita de: The_Shakah en 26 Junio 2009, 06:01 AM
Muchas gracias BlackZeroX, supongo que con eso funcionará, mañana lo intento y comento, ahora me voy a dormir.

Lo que no entiendo es esto:
Código (vb) [Seleccionar]

   Do While Not EOF(1)                 'Mientras no lleguemos al final
       Get #1, , Buffer
       tcpCliente.SendData Buffer      'va mandando los dato
   Loop  


No entiendo como eso llega al final... no es un bucle infinito que almacena siempre el primer kb??

Otra cosa:

Código (vb) [Seleccionar]
Dim Buffer As String * 1024    

En primer lugar no deberia ser de tipo byte la variable, o al menos integer?
Pero además de eso, no estas creando una variable de 1kb, estas creando una variable de texto vacía (0 * 1024 es = a 0)

revisa esto

una variable vacia con 1.024 espacios  es igual aun vacia a 1kb... es igual que los archivos DUMMY que se usan para relleno estan con spacios o vacios pero en si pesan lo que pesan por que eso esta declado en el Disco Duño es igual lo que hice de:

Código (vb) [Seleccionar]

Dim Variable as string  * 1024 ' Se llena de caracteres Chr(0)=NULL por ello es igual que SPACE(1024) o similar a FillZeroMemory o algo asi era la api...¡!


Ahora el bucle que tui dices es infinito no lo es. pruebalo y me dices, usa Doevents por si acaso en el bucle ya sitado.¡!

Por cierto lo del Byte o integer mmm bueno eso no aplica en este codigo que te puse por que no estoy CARGADO TODO, me gusta tu codigo ya que manda y se rsive esactamente lo del archivo sin un byte mas ni uno menos. solo te puse este como alternativa.¡!

Un archivo vendria siendo en memoeria String si es que no lo manejo con con un array() tipo byte (intenerger no puede ser por optimización y por tipo de datos) 0 a 255 caracteres REALES existen en el codigo ascci por ello esta bien el tipo byte() y en el modo que lo empleas, pero al cargar una rchivo de texto y lo quieras mostrar en un textbox no lo aras en una rray lo arias en un string nada mas por simplisicidad es lo mismo solo que de otra forma extresiba... por asi decirlo (No creo que me ayas entendido pero aún asi pruebalo no pierdes nada xP).

Te recomiendo que lo pruebes.

P.D.: Es el mismo code que uso para un programa que tengo por hay y me va maravilloso, solo que no lo e actualisado pero con que funiones bien estoy contento xP.

Dulces Lunas
The Dark Shadow is my passion.

The_Shakah

Tu código funciona perfectamente, tube que hacer algunas modificaciones al troyano para que funcione (por ejemplo tube que aumentar el valor del progressbar.max para que pueda predecir los bytes extras que puede pesar el archivo) y cosas así, pero el código me funcionó bien.

Duda resuelta, gracias!!

BlackZeroX

#7
Un Consejo.¡!

Has una regla de TRES en tu ProgressBAr para que si el archivo llegase a pesar mas de 32675 (me parece que este era el limitede la propiedad MAx del mismo progressbar) no te de error

Código (VB) [Seleccionar]

'Tan solo evitamos un Crash Posible por desvordamiento de Memoria o Similar
Max=10000' Este puede ser cual sea el numero solo que debe estar entre mayor o igual a 1 hasta 32765(creo era el limite xP)
' Max es un valor Statico recomiendo dejarlo en 10000 por comodidad y presición¡!
VALUE=INT((MAX)*(bytes)/FILELEN(ARCHIVO))



Dulces Lunas
The Dark Shadow is my passion.

The_Shakah

Otro excelente consejo de tu parte, lo voy a hacer, (el límite es el doble de 32675, porque acordate que no usa los negativos y por lo tanto puede llegar hasta 64 mil, (la variable integer va de -32mil a 32mil, o de 0 a 64mil))

The_Shakah

#9
Cita de: yovaninu en 26 Junio 2009, 07:18 AM
No no, me parece que estas equivocado,  tanto el Winsock como el CSocketMaster funcionan muy igual, no he revisado al milimetro tu code pero estoy muy seguro (salvo equivocacion universal mia) que el Csocket funciona tan igual que el Winsock, asi que si con uno funciona con el otro tambien, te lo digo por experiencia y nunca he tenido problemas ni con la Clase ni con el OCX y menos con la transferencia de archivos... deja de pensar que el CSocketMaster es menos que el OCX, nada de eso es tan o mas poderoso que Winsock.

Un saludo.

Esto es un poco alimentar al troll pero igual te voy a contestar:

Nada mas decir que no estoy equivocado, el code funciona con winsocks y no funciona con CSocket y la razón la puse muy claro en el post, ya sé cual es la razón y de hecho le mande un mail en inglés al creador de CSocket informandole sobre el bug.

Esto no es por desprestigiar al CSocket, de hecho me parece una excelentísima herramienta, pero ese bug existe, existe.


PD: Si tu code de transferir archivos funciona es porque es diferente al mío, el mío transfería todo de una, el tuyo seguramente va transfiriendo el archivo de a pedazos, como dijo BlackZeroX, al transferirlo de a pedazos el código funciona perfectamente con CSocketMaster, pero si uno lo transfiere todo junto, pues no funciona (con Winsock sí funciona).