Probleme mit dem Verbinden zu einen SOCKS Proxy [gelöst]
Verfasst: 16.07.2007 11:17
Als kleines Ferien Projekt habe ich mir mal vorgenommen ein paar Proceduren zum verbinden mit einen SOCKS-Proxy zu schreiben. Das ist mir auch recht gut gelungen.
Nun habe ich aber 2 Probleme:
1. Nachdem ich mein Username und Passwort gesendet habe. Gibt mir der SOCKS-Proxy zurück das er das SOCKS-Protokoll 1 verwendet zurück, obwohl er eigentlich die Version 5 verwendet.
2. Nachdem ich nun dies einfach übergehe, kreig ich nach der Anfrage die Daten zur Verbindung mit dem Server im Internet enthält einen Timeout..
Nun frage ich euch woran kann das liegen?
Die Informationen über das SOCKS-Protokoll habe ich aus der Wikipedia.
Und nun mein Code:
Nun habe ich aber 2 Probleme:
1. Nachdem ich mein Username und Passwort gesendet habe. Gibt mir der SOCKS-Proxy zurück das er das SOCKS-Protokoll 1 verwendet zurück, obwohl er eigentlich die Version 5 verwendet.
2. Nachdem ich nun dies einfach übergehe, kreig ich nach der Anfrage die Daten zur Verbindung mit dem Server im Internet enthält einen Timeout..
Nun frage ich euch woran kann das liegen?
Die Informationen über das SOCKS-Protokoll habe ich aus der Wikipedia.
Und nun mein Code:
Code: Alles auswählen
#SOCKS_IPv4 = 1
#SOCKS_IPv6 = 4
#SOCKS_Domain = 3
Structure user
Status.b
Username.s
Password.s
EndStructure
Global SOCKS_auth_user.user
Global SOCKS_Timeout = 5
; SOCKS_SetTimeOut(Time)
; Setzt den TimeOut für die SOCKS-Warteschleifen in Sekunden
Procedure SOCKS_SetTimeOut(Time)
SOCKS_Timeout = Time
EndProcedure
; SOCKS_SetUser(Status.b, Username$, Password$)
; Schaltet die authentifizierung durch die Username/Passwort Methode ein oder aus
;
; Status:
; Gibt an ob die Methode verwendet werden kann oder nicht.
; Kann #True oder #Flase sein
;
; Username$:
; Ist der Benutzername.
;
; Password$
; Ist das Passwort.
Procedure SOCKS_SetUser(Status.b, Username$, Password$)
If Status
Status = #True
Else
Status = #False
EndIf
SOCKS_auth_user\Status = Status
SOCKS_auth_user\Username = Username$
SOCKS_auth_user\Password = Password$
EndProcedure
; SOCKS_OpenNetworkCennection(Server$, Port, Typ, SOCKSserver$[, SOCKSport])
; Verbindet zu einen angegebenen Server über einen SOCKS-Proxy Server.
; Server$:
; Server zu dem verbunden werden soll (Zieladdresse)
;
; Port:
; Port auf dem der Server läuft
;
; Typ:
; Gibt an von welchem Typ die Zieladdresse ist
; Kann folgende Werte annehmen:
; #SOCKS_IPv4
; #SOCKS_IPv6
; #SOCKS_Domain
;
; SOCKSserver$:
; IP oder voller Name des SOCKS Proxy's
;
; SOCKSport:
; Port auf dem der SOCKS Proxy läuft (Standardmäßig 1080)
;
; Rückgabewert:
; 0 wenn keine Verbindung aufgebaut werden konnte
; ansonsten die VerbindungsID
Procedure SOCKS_OpenNetworkConnection(Server$, Port, Typ.b, SOCKSserver$, SOCKSport = 1080)
ConID = OpenNetworkConnection(SOCKSserver$, SOCKSport)
If Not ConID
Debug "Verbindungs fehler"
ProcedureReturn 0
EndIf
Blen = 3+SOCKS_auth_user\Status
Buffer = AllocateMemory(Blen)
BufferS = Buffer
PokeB(Buffer, 5) ;VER - immer 5
Buffer+1
PokeB(Buffer, 1+SOCKS_auth_user\Status) ;NMETHODS - Anzahl der Methoden
Buffer+1
PokeB(Buffer, 0) ;METHODS - Methoden hintereinander aufgeführt
Buffer+1
If SOCKS_auth_user\Status
PokeB(Buffer, 2)
Buffer+1
EndIf
SendNetworkData(ConID, BufferS, Blen) ;Anfrage senden
FreeMemory(BufferS)
Time = Date()
Repeat ;auf Antwort warten
CE = NetworkClientEvent(ConID)
If CE = #PB_NetworkEvent_File ;Datei wurde empfangen - wiso das denn ?? - Naja schnell empfangen und wieder löschen
Debug "Datei empfangen"
ReceiveNetworkFile(ConID, "xyxyxyx.xyx")
DeleteFile("xyxyxyx.xyx")
ElseIf CE = #PB_NetworkEvent_Data ;Rohdaten wurden empfangen - Auswertung folgt
BufferS = AllocateMemory(20)
Buffer = BufferS
Blen = ReceiveNetworkData(ConID, BufferS, 20)
Ver = PeekB(Buffer) ;ermitteln der Version des Servers
Method = PeekB(Buffer+1) ;auslesen der vom Server ausgewählten authentifizierungsmethode
FreeMemory(BufferS)
Debug "VER: "+Str(Ver)
Debug "Methode: "+Str(Method)
If Ver <> 5 ;Version überprüfen
CloseNetworkConnection(ConID)
Debug "falsche Version"
ProcedureReturn 0
EndIf
If Method = 255 ;Methode überprüfen
CloseNetworkConnection(ConID)
Debug "falsche Methode"
ProcedureReturn 0
EndIf
Break
EndIf
If Date()-Time >= SOCKS_Timeout
CloseNetworkConnection(ConID)
Debug "TimeOut"
Debug Time
Debug Date()
Debug SOCKS_Timeout
ProcedureReturn 0
EndIf
ForEver
If Method = 2 ;Username/Passwort Methode wurde ausgewählt
Blen = 3+Len(SOCKS_auth_user\Username)+Len(SOCKS_auth_user\Password)
BufferS = AllocateMemory(Blen)
Buffer = BufferS
PokeB(Buffer, 5) ;VER
Buffer + 1
PokeB(Buffer, Len(SOCKS_auth_user\Username)) ;Usernamelänge
Buffer + 1
Buffer + PokeS(Buffer, SOCKS_auth_user\Username) ;Username
PokeB(Buffer, Len(SOCKS_auth_user\Password)) ;Passwortlänge
Buffer + 1
Buffer + PokeS(Buffer, SOCKS_auth_user\Password) ;Passwort
SendNetworkData(ConID, BufferS, Blen)
FreeMemory(BufferS)
Time = Date()
Repeat ;auf Antwort warten
CE = NetworkClientEvent(ConID)
If CE = #PB_NetworkEvent_File ;Datei wurde empfangen - wiso das denn ?? - Naja schnell empfangen und wieder löschen
ReceiveNetworkFile(ConID, "xyxyxyx.xyx")
DeleteFile("xyxyxyx.xyx")
ElseIf CE = #PB_NetworkEvent_Data ;Rohdaten wurden empfangen - Auswertung folgt
BufferS = AllocateMemory(20)
Buffer = BufferS
Blen = ReceiveNetworkData(ConID, BufferS, 20)
Ver = PeekB(Buffer) ;ermitteln der Version des Servers
STATUS = PeekB(Buffer+1) ;auslesen der vom Server ausgewählten authentifizierungsmethode
FreeMemory(BufferS)
If Ver <> 5 ;Version überprüfen
;CloseNetworkConnection(ConID)
Debug "falsche Version"
;ProcedureReturn 0
EndIf
If STATUS <> 0 ;überprüfen ob Username/Passwort OK
CloseNetworkConnection(ConID)
Debug "falsche Login-Daten: "+Str(STATUS)
ProcedureReturn 0
EndIf
Break
Else
If CE
Debug CE
EndIf
EndIf
If Date()-Time >= SOCKS_Timeout
CloseNetworkConnection(ConID)
Debug "TimeOut"
ProcedureReturn 0
EndIf
ForEver
EndIf
Blen = 6+Len(Server$)
BufferS = AllocateMemory(Blen)
Buffer = BufferS
PokeB(Buffer, 5) ;VER
Buffer + 1
PokeB(Buffer, 1) ;CMD - was soll der SOCKS-Porxy machen? TC/IP Client, Server oder doch UDP?
Buffer + 1
PokeB(Buffer, 0) ;RSV - reserviert
Buffer + 1
PokeB(Buffer, Typ) ;Was für'n Typ is'n das da hinten an der anderen Leitun??
Buffer + 1
Buffer + PokeS(Buffer, Server$) ;Addresse des Zielservers
PokeW(Buffer, Port) ;Port des Zielservers
Buffer + 2
SendNetworkData(ConID, BufferS, Blen) ;senden der Anfrage
FreeMemory(BufferS) ;Freigeben des Speicherbereichs
Time = Date()
Repeat ;auf Antwort warten
CE = NetworkClientEvent(ConID)
If CE = #PB_NetworkEvent_File ;Datei wurde empfangen - wiso das denn ?? - Naja schnell empfangen und wieder löschen
Debug "Datei empfangen"
ReceiveNetworkFile(ConID, "xyxyxyx.xyx")
DeleteFile("xyxyxyx.xyx")
ElseIf CE = #PB_NetworkEvent_Data ;Rohdaten wurden empfangen - Auswertung folgt
BufferS = AllocateMemory(20)
Buffer = BufferS
Blen = ReceiveNetworkData(ConID, BufferS, 6+Len(Server$))
Ver = PeekB(Buffer) ;ermitteln der Version des Servers
REP = PeekB(Buffer) ;Anwort ob Verbindung erfolgreich aufgebaut wurde
Buffer+1
PeekB(Buffer) ;reserviert
Buffer+1
ATYP = PeekB(Buffer) ;Art der Verbindung
FreeMemory(BufferS)
If Ver <> 5 ;Version überprüfen
CloseNetworkConnection(ConID)
Debug "falsche Version"
ProcedureReturn 0
EndIf
If REP <> 0 ;überprüfen ob Verbindung steht
CloseNetworkConnection(ConID)
Debug "keine Verbindung"
ProcedureReturn 0
EndIf
If ATYP <> Typ ;überprüfen ob der Verbindungstyp richtig ist
CloseNetworkConnection(ConID)
Debug "falscher Verbindungstyp"
ProcedureReturn 0
EndIf
Break
ElseIf CE <> 0
Debug CE
EndIf
If Date()-Time >= SOCKS_Timeout
CloseNetworkConnection(ConID)
Debug "TimeOut"
Debug Time
Debug Date()
ProcedureReturn 0
EndIf
ForEver
ProcedureReturn ConID
EndProcedure
;--Beispiel
If Not InitNetwork()
End
EndIf
SOCKS_SetTimeOut(10)
SOCKS_SetUser(#True, "User", "Pass")
Con = SOCKS_OpenNetworkConnection("www.google.de", 80, #SOCKS_Domain, "192.168.115.1")
If Con
Debug "geht!!!!"
CloseNetworkConnection(Con)
EndIf
End