martes, 7 de octubre de 2014

Subir Archivo a Ftp Mediante FtpPutFile de wininet.dll [ Visual Basic 6 ]

Interactuar con un ftp tiene muchas variantes, hoy veremos solamente 3 pasos: 
-Detectar conexion a internet 
-Conectar al Ftp 
-Subir Archivo, si existe reemplazar. 
Para seguir una logica, intentar conectar al Ftp sin internet es evidente que no se podra, esto es solo para dejar un codigo simple de aplicar a cualquier software y ademas efectivo. Para establecer una resolucion de que si hay o no internet usamos:
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent$, ByVal lAccessType&, ByVal sProxyName$, ByVal sProxyBypass$, ByVal lFlags&) As Long
Luego para realizar la conexion con el Ftp usamos:
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession&, ByVal sServerName$, ByVal nServerPort%, ByVal sUserName$, ByVal sPassword$, ByVal lService&, ByVal lFlags&, ByVal lContext&) As Long
Por ultimo para subir el archivo utilizaremos la ya mencionada:
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hConnect&, ByVal lpszLocalFile$, ByVal lpszNewRemoteFile$, ByVal dwFlags&, ByVal dwContext&) As Boolean
En un modulo que tengo llamado mdlFunciones tengo el siguiente codigo que lo dejo comentado a continuacion:
Option Explicit
Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hConnect&, ByVal lpszLocalFile$, ByVal lpszNewRemoteFile$, ByVal dwFlags&, ByVal dwContext&) As Boolean
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession&, ByVal sServerName$, ByVal nServerPort%, ByVal sUserName$, ByVal sPassword$, ByVal lService&, ByVal lFlags&, ByVal lContext&) As Long
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent$, ByVal lAccessType&, ByVal sProxyName$, ByVal sProxyBypass$, ByVal lFlags&) As Long
Type ConnData 'estructura de datos para conectar
    User As String
    Pass As String
    NameFTP As String ' ejemplo "ftp.microsoft.com"
End Type
Public Function IniConex(Usuario$, Password$, NombreServer$) As Boolean 'funcion que si da true es que hay internet y se logro
IniConex = False 'conectar al Ftp con exito
TestConexion = InternetOpen(vbNullString, 0, vbNullString, vbNullString, 0)
If TestConexion = 0 Then
   MsgBox "No hay conexion a internet", vbOKOnly + vbCritical, "Atencion: Error"
   Exit Function
Else
   IniConex = True
   reConFtp = InternetConnect(TestConexion, NombreServer, 21, Usuario, Password, 1, IIf(True, &H8000000, 0), 0)
   If reConFtp Then
   Else
   MsgBox "datos erroneos, verifique pass, user y nombre de ftp", vbOKOnly + vbCritical, "Error"
   IniConex = False
   End If
End If
End Function
Public Sub ArchivoSub(unaRutaArchivo$, ArchivoRemm$) 'sube el archivo especificado en la variable unaRutaArchivo
Dim UpFtp As Boolean
UpFtp = FtpPutFile(reConFtp, unaRutaArchivo, ArchivoRemm, 1, 0)
If UpFtp Then
   MsgBox "archivo subido correctamente", vbOKOnly + vbInformation, "Finalizado"
Else
   MsgBox "error al subir", vbOKOnly + vbCritical, "Atencion: Error"
End If
End Sub
Luego en otro modulo llamado mdlVariables tengo este codigo:
Option Explicit
Public TestConexion&
Public reConFtp&
Public DatosConexion As ConnData
En el formulario principal, que contiene los siguientes controles: -5 cajas de texto (textBox) -2 botones de comando (commandbutton) Con el siguiente codigo:
Option Explicit
Private Sub cmdConectar_Click()
With DatosConexion
     .User = txtUser.Text
     .Pass = txtPass.Text
     .NameFTP = txtNombreFTP.Text
     If IniConex(.User, .Pass, .NameFTP) = True Then
        MsgBox "conecto xD"
     Else
        MsgBox "revise los datos de conexion, no se pudo conectar", vbOKOnly + vbCritical, "Atencion: Error"
     End If
End With
End Sub
Private Sub cmdSubir_Click()
On Error GoTo errsub
ArchivoSub txtOrigen.Text, txtDestinoFTP
Exit Sub
errsub:
If Err.Number = 32755 Then Exit Sub
End Sub
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
El proyecto es sencillo, se "llama" de manera simple, y es eficaz por ejemplo cuando queremos salvar informacion sin tener que proceder a realizar acciones extras para el guardado de datos. Este ejemplo fue proporcionado y programado con exclusividad para un colega de elhacker.net en la realizacion de un keyylogger, se mostro este codigo como base y entendimiento sobre el guardado de un archivo de texto basico en un servidor Ftp. Espero sea de utilidad, con los permisos necesarios de lararich(nickname de elhacker.net) se expuso el codigo en el blog. Descarga desde media fire del codigo fuente:
Enlace compartido de el foro de el hacker.net:
Saludos a todos. 

1 comentario:

  1. Hola muy buen codigo, sencillo y facil de entender muchas gracias por compartir tu conocimiento, ahora si tendrias el ejemplo usando un PROXY seria genial, aunque todas maneras muchas gracias de nuevo.

    ResponderEliminar