Seite 1 von 2

Probleme mit dem Verbinden zu einen SOCKS Proxy [gelöst]

Verfasst: 16.07.2007 11:17
von coder
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:

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

Verfasst: 16.07.2007 12:51
von real
Wenn der Proxy meint, er möchte die Daten nach SOCKS Protokoll 1 haben solltest Du das nicht ignorieren, sondern ihm die Daten auch so schicken.

Ich hab leider grad keinen Proxy da, um das auszuprobieren.

Verfasst: 16.07.2007 18:39
von coder
Meines Wissens gibt es nur die Versionen 4 und 5. Und der Proxy hat ja vorher auch schon die Version 5 bestätigt...

Verfasst: 16.07.2007 22:30
von HeX0R
http://asg.web.cmu.edu/rfc/rfc1929.html
The VER field contains the current version of the subnegotiation, which is X'01'

Verfasst: 17.07.2007 08:08
von coder
HeX0R hat geschrieben:http://asg.web.cmu.edu/rfc/rfc1929.html
The VER field contains the current version of the subnegotiation, which is X'01'
Und was heißt nun auf Deutsch? Ich steig bei diesen Satz überhaupt nicht durch..!... :oops:
So wird ich ihn übersetzen
Das VER Feld zeigt die aktuelle Version der Subnegation an, welche X'01' ist.
Aber welche Subnegation..?

//Edit:

Ahh... damit ist wohl die Version des Username/Password Requests gemeint oder??

Verfasst: 19.07.2007 09:30
von coder
Ich weiß jetzt warum ich einen time out bekommen habe!!
Ich habe einen Server benutzt welcher nur die Version 4a versteht :oops: :oops: .
Ich habe mit nun einen anderen Server besorgt aber da kriege ich auch keine Verbindung zu stande!!
Im Log vom Proxy steht dann das hier:
07/19/2007 09:09:37.906: 4090356 - SOCKS Client connection accepted from 192.168.115.3
07/19/2007 09:09:40.203: 4090356 - SOCKS Unable to resolve URL 'ww.google.dePÿ'
07/19/2007 09:09:40.203: 4090356 - SOCKS Unable to contact site 0.0..0:0 'No Error'
07/19/2007 09:09:40.203: 4090356 - SOCKS Closing socket (1)
Nun meine neuen Frage:
Warum lässt er dass erste Zeichen weg und fügt hinten zwei dran??

Verfasst: 19.07.2007 15:37
von a14xerus
Sry ich habe mir den Thread nicht durchgelesen. MIr ist nur dieses "ÿ" ins auge gesprungen.
Sieht mir nach einem Unicode-Ansi fehler aus, oder jedenfalls einer falschen Auslesung eines Speicherbereiches...
(hast du "Unicode Exe" eingeschaltet?)
Tschuldigung wenn ich daneben liege ;)

Verfasst: 19.07.2007 15:57
von coder
Nein Unicode habe ich nicht eingeschaltet...

Verfasst: 20.07.2007 23:31
von HeX0R
Was ist das denn ?

Code: Alles auswählen

Buffer + PokeS(Buffer, Server$)
Seit wann gibt Poke denn irgendwas vernünftiges zurück ?

Ausserdem hast du vergessen die Länge des Serverstrings zu übermitteln.

Und zu guter letzt dürfte dein Port falsch ankommen, da du die beiden Bytes umdrehen musst.

Verfasst: 21.07.2007 20:12
von coder
OK das mit PokeS() ist mir jetzt klar...

Aber wie soll ich die Bytes umdrehen? :?