Seite 2 von 2

Verfasst: 21.07.2007 23:15
von HeX0R
Low- und High-Byte vertauschen.

[Edit]
Ich hab sogar noch was gefunden:

Code: Alles auswählen

;+----------------------------------+
; Proxy_Connect (NEW THREADSAVE VERSION)
;
; (c)HeX0R 2006
;
; Procedure for giving your online-applications the
; possibility to connect through different proxys
; like http, socks4 and socks5.
;
;
;+----------------------------------+

;-Proxy-Error-Constants
Enumeration
	#Proxy_Error_NoError
	#Proxy_Error_Wrong_Password_Or_Username
	#Proxy_Error_Connection_TimedOUT
	#Proxy_Error_Proxy_Doesnt_Respond
	#Proxy_Error_Wrong_Answer
	#Proxy_Error_WinAPI_Error
	#Proxy_Error_General_SOCK_ERROR
	#Proxy_Error_Connection_Not_Allowed
	#Proxy_Error_Network_Unreachable
	#Proxy_Error_Host_Unreachable
	#Proxy_Error_Connection_Refused
	#Proxy_Error_TTL_Expired
	#Proxy_Error_Command_Not_Supported
	#Proxy_Error_AddressType_Not_Supported
	#Proxy_Error_Unknown_SOCK_ERROR
	#Proxy_Error_Request_Rejected_Or_Failed
	#Proxy_Error_Cant_Connect_To_Ident_Server
	#Proxy_Error_Ident_Respond_Is_Wrong
EndEnumeration

InitNetwork()

;-Internal Procedures
Procedure Name2IP(*url , *dest.BYTE)
	Protected Ret.l, Result.l, *retval, wsaData.WSADATA, K.l, R.l


	If WSAStartup_($101, @wsaData) = 0
		*retval = gethostbyname_(*url)
		Result = 0
		If *retval <> 0
			Result = PeekL(PeekL(PeekL(*retval + 12)))
		EndIf

		For i = 0 To 3
			Ret = PeekB(@Result + i) & $FF
			R   = Ret
			If Ret > 99
				K = Int(R / 100)
				*dest\b = '0' + K
				*dest + 1
				R - (K * 100)
			EndIf
			If Ret > 9
				K = Int(R / 10)
				*dest\b = '0' + K
				*dest + 1
				R - (K * 10)
			EndIf
			*dest\b = '0' + R
			*dest + 1
			If i < 3
				*dest\b = '.'
				*dest + 1
			EndIf
		Next i
		*dest\b = 0
		WSACleanup_()
	EndIf

EndProcedure

Procedure.l IsIP(*ip, *Buffer = 0)

	Protected *b.BYTE, C.l, Fa.l, F.l, Result.l
	;ReturnValues :
	;0 = no ip
	;1 = IPv4 - IP
	;2 = IPv6 - IP

	*b = *ip
	C  = 0

	While *b\b
		If *b\b = '.'
			C + 1
		ElseIf *b\b < '0' Or *b\b > '9'
			ProcedureReturn 0
		EndIf
		*b + 1
	Wend

	If *Buffer = 0
		If C = 3
			Result = 1
		ElseIf C = 5
			Result = 2
		Else
			ProcedureReturn 0
		EndIf
	Else
		Result = C + 1
	EndIf

	*b     = *ip + MemoryStringLength(*ip) - 1
	Fa     = 1
	F      = 0

	Repeat

		If *b\b <> '.'
			F + (*b\b - '0')*Fa
			Fa * 10
		EndIf
		If *b\b = '.' Or *b = *ip
			If F > 255
				ProcedureReturn 0
			EndIf
			If *Buffer
				PokeB(*Buffer + C, F)
			EndIf
			C  - 1
			F  = 0
			Fa = 1
		EndIf
		*b - 1

	Until *b < *ip

	ProcedureReturn Result
EndProcedure

;-Main-Procedure
Procedure.l Proxy_Connect(*proxy_ip, Proxy_Port, *ip_to_connect, Port_To_Connect.l, Type.l = 0, *username = 0, *userpass = 0, TimeOUT = 10)

	;-Main-Procedure

	;*proxy_ip       = Address of a String containing IP or URL of the Proxy-Server
	;Proxy_Port      = Port of the Proxy-Server
	;*Ip_To_Connect  = Address of a String containing IP or URL of where you want to connect through proxy.
	;Port_To_Connect = Port of where you want to connect through proxy
	;Type            = 0 -> http-proxy
	;                = 1 -> socks4-proxy
	;                = 2 -> socks5-proxy
	;                  If no authorization is needed set *username and *userpass = 0
	;TimeOUT         -> Time after connection-trial will time out (in SECONDS)

	;Return-Value    =  =0 = Something went wrong, please call Proxy_GetLastError()
	;                   >0 = ConnectionID, anything O.K.
	;

	Static Proxy_Last_Error.l
	Protected *Buffer, *Text, *Text2
	Protected IP_Type.l
	Protected NID.l, i.l, hi.l, lo.l, ver.l, method.l, reserved.l, L.l
	Protected Check_Timeout.l, P.l, Rv.l, CD.l, Port.l, Phase.l, status.l
	Protected atyp.l, reply.l

	If *proxy_ip = 0
		P = Proxy_Last_Error
		Proxy_Last_Error = 0
		ProcedureReturn P
	EndIf

	If *username = 0 Or MemoryStringLength(*username) = 0
		*userpass = 0
		*username = 0
	ElseIf *userpass = 0 Or MemoryStringLength(*userpass) = 0
		*userpass = 0
	EndIf

	*Buffer = AllocateMemory(128 * 1024)
	If *Buffer = 0
		ProcedureReturn 0
	EndIf

	IP_Type = IsIP(*ip_to_connect)
	*Text   = 0

	If Type = 1 And IP_Type = 0
		Dim o.l(4)
		Name2IP(*ip_to_connect, @o())
		If o(0) = '.0.0' And o(1) = '0.0'
			ProcedureReturn #False
		EndIf
		*ip_to_connect = @o()
	ElseIf Type = 0
		*Text  = *Buffer + (120 * 1024)
		*Text2 = *Text + 4096
		i = MemoryStringLength(?Proxy_HTTP_0)
		CopyMemory(?Proxy_HTTP_0, *Text + L, i)
		L + i
		i = MemoryStringLength(*ip_to_connect)
		CopyMemory(*ip_to_connect, *Text + L, i)
		L + i
		PokeB(*Text + L, ':')
		L + 1
		lo = Port_To_Connect
		If Port_To_Connect > 9999
			hi = Int(lo / 10000)
			PokeB(*Text + L, '0' + hi)
			L + 1
			lo - (hi * 10000)
		EndIf
		If Port_To_Connect > 999
			hi = Int(lo / 1000)
			PokeB(*Text + L, '0' + hi)
			L + 1
			lo - (hi * 1000)
		EndIf
		If Port_To_Connect > 99
			hi = Int(lo / 100)
			PokeB(*Text + L, '0' + hi)
			L + 1
			lo - (hi * 100)
		EndIf
		If Port_To_Connect > 9
			hi = Int(lo / 10)
			PokeB(*Text + L, '0' + hi)
			L + 1
			lo - (hi * 10)
		EndIf
		PokeB(*Text + L, '0' + lo)
		L + 1
		i = MemoryStringLength(?Proxy_HTTP_1)
		CopyMemory(?Proxy_HTTP_1, *Text + L, i)
		L + i
		If *username And *userpass
			i = MemoryStringLength(*username)
			CopyMemory(*username, *Text2, i)
			lo = i
			PokeB(*Text2 + lo, ':')
			lo + 1
			i = MemoryStringLength(*userpass)
			CopyMemory(*userpass, *Text2 + lo, i)
			lo + i
			hi = Base64Encoder(*Text2, lo, *Text2 + lo + 1, 4096 - lo - 2)
			i = MemoryStringLength(?Proxy_HTTP_2)
			CopyMemory(?Proxy_HTTP_2, *Text + L, i)
			L + i
			CopyMemory(*Text2 + lo + 1, *Text + L, hi)
			L + hi
			PokeW(*Text + L, $0A0D)
			L + 2
			i = MemoryStringLength(?Proxy_HTTP_3)
			CopyMemory(?Proxy_HTTP_3, *Text + L, i)
			L + i
			CopyMemory(*Text2 + lo + 1, *Text + L, hi)
			L + hi
			PokeW(*Text + L, $0A0D)
			L + 2
		EndIf
		PokeW(*Text + L, $0A0D)
		PokeB(*Text + L + 2, 0)
	EndIf

	NID = OpenNetworkConnection(PeekS(*proxy_ip), Proxy_Port)

	If NID

		;-init
		Select Type

			Case 0

				SendNetworkData(NID, *Text, MemoryStringLength(*Text))

			Case 1
				PokeB(*Buffer, 4)
				PokeB(*Buffer + 1, 1)
				hi = Int(Port_To_Connect / 256)
				lo = Port_To_Connect - (256 * hi)
				PokeB(*Buffer + 2, hi)
				PokeB(*Buffer + 3, lo)
				hi = 4 + IsIP(*ip_to_connect, *Buffer + 4)
				L = hi
				If *username
					L = MemoryStringLength(*username) + 1
					CopyMemory(*username, *Buffer + hi, L)
					L + hi
				EndIf
				SendNetworkData(NID, *Buffer, L)

			Case 2
				PokeB(*Buffer, 5)
				PokeB(*Buffer + 2, 0)
				If *username = 0 And *userpass = 0
					L = 3
					PokeB(*Buffer + 1, 1)
				Else
					L = 4
					PokeB(*Buffer + 1, 2)
					PokeB(*Buffer + 3, 2)
				EndIf
				SendNetworkData(NID, *Buffer, L)

		EndSelect

		Check_Timeout = ElapsedMilliseconds() + ( TimeOUT * 1000 )
		P             = 0

		Repeat

			Select NetworkClientEvent(NID)

				Case 0
					Delay(5)

				Case 2

					Rv = ReceiveNetworkData(NID, *Buffer + P, 4096)
					If Rv > 0
						P + Rv
						If Rv < 4096

							Select Type

								Case 0

									For i = 0 To P
										If PeekB(*Buffer + i) = 32
											Break
										EndIf
									Next i
									If PeekB(*Buffer + i + 1) = '2' And PeekB(*Buffer + i + 2) = '0' And PeekB(*Buffer + i + 3) = '0'
										Break
									Else
										Debug PeekS(*Buffer, P) ;<-Show HTML-Error-MSG
										Proxy_Last_Error = #Proxy_Error_Wrong_Answer
										CloseNetworkConnection(NID)
										NID = 0
									EndIf

								Case 1

									ver  = PeekB(*Buffer) & 255
									CD   = PeekB(*Buffer + 1) & 255
									port = (PeekB(*Buffer + 2) & 255) * 256
									port + (PeekB(*Buffer + 3) & 255)
									If ver = 0 And CD = 90
										Break
									Else
										Select CD
											Case 91
												Debug "Request_Rejected_Or_Failed"
												Proxy_Last_Error = #Proxy_Error_Request_Rejected_Or_Failed
											Case 92
												Debug "Cant_Connect_To_Ident_Server"
												Proxy_Last_Error = #Proxy_Error_Cant_Connect_To_Ident_Server
											Case 93
												Debug "Ident_Respond_Is_Wrong"
												Proxy_Last_Error = #Proxy_Error_Ident_Respond_Is_Wrong
										EndSelect
										CloseNetworkConnection(NID)
										NID = 0
									EndIf

								Case 2

									If Phase = 0
										ver    = PeekB(*Buffer) & 255
										method = PeekB(*Buffer + 1) & 255

										If method = 2
											;-Phase 2 SOCK5
											;Send Username/Password (if allowed)
											PokeB(*Buffer, 1)
											L = MemoryStringLength(*username)
											PokeB(*Buffer + 1, L)
											If L
												CopyMemory(*username, *Buffer + 2, L + 1)
											EndIf
											L + 2
											PokeB(*Buffer + L, MemoryStringLength(*userpass))
											If *userpass
												CopyMemory(*userpass, *Buffer + L + 1, MemoryStringLength(*userpass))
											EndIf
											SendNetworkData(NID, *Buffer, L + 1 + MemoryStringLength(*userpass))
											Phase + 1
										Else
											Phase + 2
										EndIf
									ElseIf Phase = 1
										status  = PeekB(*Buffer + 1) & 255
										If PeekB(*Buffer) = 1 And status = 0
											Phase + 1
										Else
											Debug "Wrong Password or Username"
											Proxy_Last_Error = #Proxy_Error_Wrong_Password_Or_Username
											CloseNetworkConnection(NID)
											NID = 0
											;Not supported
										EndIf

									EndIf

									If Phase = 2

										PokeB(*Buffer, 5)
										PokeB(*Buffer + 1, 1)
										PokeB(*Buffer + 2, 0)
										Select IP_Type
											Case 0
												PokeB(*Buffer + 3, 3)
												hi = MemoryStringLength(*ip_to_connect)
												PokeB(*Buffer + 4, hi)
												CopyMemory(*ip_to_connect, *Buffer + 5, hi)
												L = 5 + hi

											Case 1
												PokeB(*Buffer + 3, 1)
												L = 4 + IsIP(*ip_to_connect, *Buffer + 4)

											Case 2
												PokeB(*Buffer + 3, 4)
												L = 4 + IsIP(*ip_to_connect, *Buffer + 4)

										EndSelect
										hi = Int(Port_To_Connect / 256)
										lo = Port_To_Connect - (256 * hi)
										PokeB(*Buffer + L, hi)
										PokeB(*Buffer + L + 1, lo)
										SendNetworkData(NID, *Buffer, L + 2)
										Phase = 3

									ElseIf Phase = 3

										ver      = PeekB(*Buffer) & 255
										Reply    = PeekB(*Buffer + 1) & 255
										reserved = PeekB(*Buffer + 2) & 255
										atyp     = PeekB(*Buffer + 3) & 255

										If ver = 5 And Reply = 0

											;         							Select atyp
											;         								Case 1
											;           								;IPv4
											;           								ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
											;           								ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)
											;           								port.l = (PeekB(*buffer + 8) & 255) * 256
											;           								port + (PeekB(*buffer + 9) & 255)
											;         								Case 3
											;           								;Name
											;           								ip.s = ""
											;           								For i = 1 To (PeekB(*buffer + 4) & 255)
											;             								ip + Chr(PeekB(*buffer + 4 + i) & 255)
											;           								Next i
											;           								port.l = (PeekB(*buffer + 4 + i) & 255) * 256
											;           								port + (PeekB(*buffer + 5 + i) & 255)
											;         								Case 4
											;           								;IPv6
											;           								ip.s = Str(PeekB(*buffer + 4) & 255) + "." + Str(PeekB(*buffer + 5) & 255) + "."
											;           								ip + Str(PeekB(*buffer + 6) & 255) + "." + Str(PeekB(*buffer + 7) & 255)  + "."
											;           								ip + Str(PeekB(*buffer + 8) & 255) + "." + Str(PeekB(*buffer + 9) & 255)
											;           								port.l = (PeekB(*buffer + 10) & 255) * 256
											;           								port + (PeekB(*buffer + 11) & 255)
											;       								EndSelect
											;       								;Following IP and Port is just for information...
											;       								;this is proxy-internal and not necessarily the same as ip_to_connect/port_to_connect
											;       								Debug "Internal Proxy-IP:" + ip
											;       								Debug "Internal Proxy-Port:" + Str(port)
											Break
										Else
											Select Reply
												Case 1
													Debug "General_SOCK_ERROR"
													Proxy_Last_Error = #Proxy_Error_General_SOCK_ERROR
												Case 2
													Debug "Connection_Not_Allowed"
													Proxy_Last_Error = #Proxy_Error_Connection_Not_Allowed
												Case 3
													Debug "Network_Unreachable"
													Proxy_Last_Error = #Proxy_Error_Network_Unreachable
												Case 4
													Debug "Host_Unreachable"
													Proxy_Last_Error = #Proxy_Error_Host_Unreachable
												Case 5
													Debug "Connection_Refused"
													Proxy_Last_Error = #Proxy_Error_Connection_Refused
												Case 6
													Debug "TTL_Expired"
													Proxy_Last_Error = #Proxy_Error_TTL_Expired
												Case 7
													Debug "Command_Not_Supported"
													Proxy_Last_Error = #Proxy_Error_Command_Not_Supported
												Case 8
													Debug "AddressType_Not_Supported"
													Proxy_Last_Error = #Proxy_Error_AddressType_Not_Supported
												Default
													Debug "Unknown_SOCK_ERROR"
													Proxy_Last_Error = #Proxy_Error_Unknown_SOCK_ERROR
											EndSelect
											CloseNetworkConnection(NID)
											NID = 0
										EndIf

									EndIf

							EndSelect
							P = 0
						EndIf
					ElseIf Rv = -1
						Debug WSAGetLastError_()
						Proxy_Last_Error = #Proxy_Error_WinAPI_Error
						CloseNetworkConnection(NID)
						NID = 0
					EndIf
			EndSelect
			If Check_Timeout < ElapsedMilliseconds()
				Debug "Timed OUT..."
				Proxy_Last_Error = #Proxy_Error_Connection_TimedOUT
				CloseNetworkConnection(NID)
				NID = 0
			EndIf

		Until NID = 0

	Else
		Debug "No Respond from Proxy!"
		Proxy_Last_Error = #Proxy_Error_Proxy_Doesnt_Respond
	EndIf

	FreeMemory(*Buffer)
	ProcedureReturn NID

EndProcedure

Procedure.l Proxy_GetLastError()

	ProcedureReturn Proxy_Connect(0, 0, 0, 0)

EndProcedure

DataSection
	Proxy_HTTP_0:
	Data.s "CONNECT "
	Proxy_HTTP_1:
	Data.s " HTTP/1.0" + #CRLF$
	Proxy_HTTP_2:
	Data.s "Authorization: Basic "
	Proxy_HTTP_3:
	Data.s "Proxy-Authorization: Basic "
EndDataSection

Verfasst: 25.07.2007 12:00
von coder
Danke, für den Code! :allright:

Funktionieren tut es aber immer noch nicht!! :cry:
Ich habe es auf FreeProxy und auf dem SOCKS-Proxy von KEN! probiert.
Kriege immer einen TimeOut...

Verfasst: 02.08.2007 15:41
von coder
Ahh, die ganze Sache funktioniert jetz ja doch...

Nochmal danke für den Code @HeXOR

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

Verfasst: 23.04.2011 16:57
von Tombi
Gibt es da schon etwas neues?
Ich benötige dringend eine Möglichkeit per Socks5 zu verbinden,
jedoch funktioniert der ganze Spaß nicht mehr, sobald Username/Passwort zum Einsatz kommt.
Scheitert immer mit "Wrong username / password" - wobei ich via Proxifier sehen kann, das die Daten 100% stimmen.
Bei Socks5, welche keine AUTH benötigen, funktioniert es. :angry:

MFG,
duellking

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

Verfasst: 24.04.2011 16:54
von cxAlex
Funktioniert das hier? :

Code: Alles auswählen

; ------------------------------------------------------------------------------------
; Konstanten
; ------------------------------------------------------------------------------------

; Version
#SOCKS_Version = $05

; Methoden
; $03 - $7F IANA Assigned
; $80 - $FE Reserved for Private Methodes
#SOCKS_Method_NoAuthenticationRequired = $00
#SOCKS_Method_GSSAPI = $01
#SOCKS_Method_UserNamePassword = $02
#SOCKS_Method_NoAcceptableMethod = $00

; Socks Kommandos
#SOCKS_CMD_Connect = $01
#SOCKS_CMD_Bind = $02
#SOCKS_CMD_UDPAssociate = $03

; Adresstype
#SOCKS_ATYP_IPv4 = $01
#SOCKS_ATYP_DomainName = $03
#SOCKS_ATYP_IPv6 = $04
#SOCKS_ATYP_SOCKS4 = $05

; Antworten
; $09 - $FF IANA Assigned
#SOCKS_V4_REP_Succeeded = $5A
#SOCKS_REP_Succeeded = $00
#SOCKS_REP_GeneralSocksServerFailure = $01
#SOCKS_REP_ConnectionNotAllowedByRuleset = $02
#SOCKS_REP_NetworkUnreachable = $03
#SOCKS_REP_HostUnreachable = $04
#SOCKS_REP_ConnectionRefused = $05
#SOCKS_REP_TTLExpired = $06
#SOCKS_REP_CommandNotSupported = $07
#SOCKS_REP_AddressTypeNotSupported = $08

; Authentication
#SOCKS_AUTH_Ok = $00
#SOCKS_AUTH_Failure = $01

#Client_Step_Ver = $00
#Client_Step_Auth = $01
#Client_Step_GSSAPI = $02
#Client_Step_Cmd = $03
#Client_Step_Transmit = $04

; ------------------------------------------------------------------------------------
; Strukturen
; ------------------------------------------------------------------------------------

; Erste Anfrage
Structure SOCKS_Ver
  ver.a ; Version, muss $05 sein
  StructureUnion
    nMethods.a ; Anzahl methoden
    Method.a ; Methode
  EndStructureUnion
  Methods.a[255] ; Auswahl an Methoden
EndStructure

Structure SOCKS_V4_Ver
  ver.a
  rsv.a
  port.w
  ip.l
EndStructure

; Socks CMD
Structure SOCKS_Cmd
  ver.a ; Version, muss $05 sein
  cmd.a ; Kommando
  rsv.a ; Reserved muss $00 sein
  atyp.a ; Addresstyp
EndStructure

; Socks Reply
Structure SOCKS_Reply
  ver.a ; Version, muss $05 sein
  rep.a ; Antwort
  rsv.a ; Reserved muss $00 sein
  atyp.a ; Addresstyp
  addr.l ; Addresse
  port.w ; Port
EndStructure

; Octed - Struktur
Structure _SOCKS_Port_Oct
  high.a
  low.a
EndStructure

; ------------------------------------------------------------------------------------
; Proceduren
; ------------------------------------------------------------------------------------

; Port in Octed - Schreibweise
Procedure.w Port2Octed(Port)
  Protected Oct.w
  Protected t8Port._SOCKS_Port_Oct
    
  t8Port\high = Int(Port/256)
  t8Port\low = Port-(256*t8Port\high)
  Oct = PeekW(@t8Port)
  
  ProcedureReturn Oct
EndProcedure

; Octed in Port Schreibweise
Procedure Octed2Port(Oct)
  Protected *t8Port._SOCKS_Port_Oct
  Protected Port
  
  *t8Port = @Oct
  Port = *t8Port\high*256 + *t8Port\low
  
  ProcedureReturn Port
EndProcedure

Procedure IsIP(ip.s)
  Protected count, ret, i, a$, va
  ;ReturnValues :
  ;0 = no ip
  ;1 = IPv4 - IP
  count = CountString(ip, ".")
  If count = 3
    ret = 1
  Else
    ProcedureReturn 0
  EndIf
  For i = 0 To count
    a$ = StringField(ip, i + 1, ".")
    va = Val(a$)
    If a$ = "" Or Str(va)<>a$ Or va>255 Or va<0
      ProcedureReturn 0
    EndIf
  Next i
  ProcedureReturn ret
EndProcedure

EnableExplicit

InitNetwork()

Macro _SOCKS_Receive(_Mem, _MemSize)
  t = ElapsedMilliseconds()
  OverTime = #False
  Repeat
    Delay(5)
    If NetworkClientEvent(ConId) = #PB_NetworkEvent_Data
      ReceiveNetworkData(ConId, _Mem, _MemSize)
      Break
    EndIf
    If (ElapsedMilliseconds()-t) >= timeout
      OverTime = #True
    EndIf
  Until OverTime
EndMacro

; Verbindung über einen SOCKS54 Proxy herstellen
Procedure SOCKS4_Connect(proxy_host$, proxy_port, dest_host$, dest_port, User$ = "", timeout = 5000)
  Protected ConId, CmdSize, *Cmd.SOCKS_V4_Ver, t, OverTime, RtVar
  
  ; Verbindung zum Proxy herstellen
  ConId = OpenNetworkConnection(proxy_host$, proxy_port)
  
  If ConId
    CmdSize = SizeOf(SOCKS_V4_Ver) + SizeOf(User$) + SizeOf(Byte)
    *Cmd = AllocateMemory(CmdSize)
    If isIP(dest_host$)
      *Cmd\ver = $04 ; Socks V4
      *Cmd\rsv = 1 ; ?
      *Cmd\port = Port2Octed(dest_port) ; Port
      ; IP
      *Cmd\ip = MakeIPAddress(Val(StringField(dest_host$, 1, ".")), Val(StringField(dest_host$, 2, ".")), Val(StringField(dest_host$, 3, ".")), Val(StringField(dest_host$, 4, ".")))
      ; User
      PokeS(*Cmd + SizeOf(SOCKS_V4_Ver), User$)
      
      SendNetworkData(ConId, *Cmd, CmdSize) ; Connect senden
      _SOCKS_Receive(*CMD, CmdSize) ; Auf Antwort warten
  
      
      If (Not OverTime) And *Cmd\ver = #Null And *Cmd\rsv = #SOCKS_V4_REP_Succeeded ; Alles ok?
        RtVar = ConId ; Verbindung hergstellt
      Else
        CloseNetworkConnection(ConId)
      EndIf
    EndIf
    FreeMemory(*CMD)
  EndIf
  
  ProcedureReturn RtVar
EndProcedure

; Verbindung über einen SOCKS5 Proxy herstellen
Procedure SOCKS5_Connect(proxy_host$, proxy_port, dest_host$, dest_port, User$ = "", Pass$ = "", timeout = 5000)
  Protected ConId, Ver.SOCKS_Ver, *Cmd.SOCKS_Cmd, t, RtVar, CmdSize, Repl.SOCKS_Reply, OverTime
  
  ; Verbindung zum Proxy herstellen
  ConId = OpenNetworkConnection(proxy_host$, proxy_port)
  
  If ConId
    CmdSize = StringByteLength(User$) + StringByteLength(Pass$) + SizeOf(SOCKS_Cmd)
    *Cmd = AllocateMemory(CmdSize)
    
    Ver\Ver = #SOCKS_Version
    
    ; Phase 1: Anmelden
    If Not User$ ; Kein User, Offener Proxy
      Ver\NMethods = 1
      Ver\Methods[0] = #SOCKS_Method_NoAuthenticationRequired
    Else ; Offen oder Auth
      Ver\NMethods = 2
      Ver\Methods[0] = #SOCKS_Method_NoAuthenticationRequired
      Ver\Methods[1] = #SOCKS_Method_UserNamePassword
    EndIf
    
    SendNetworkData(ConId, @Ver, SizeOf(Word) + Ver\NMethods*SizeOf(Byte))
    _SOCKS_Receive(@Ver, SizeOf(Word)) ; Auf Antwort warten
    
    If Not (OverTime Or Ver\Ver <> #SOCKS_Version) ; alles Ok bisher
      Select Ver\Method
        Case #SOCKS_Method_NoAuthenticationRequired
          Ver\Method = #SOCKS_AUTH_Ok
          ; Nichts mehr zu tun, der Server verbindet ohne Passwort ...  
          
        Case #SOCKS_Method_UserNamePassword ; Der Server will ein Passwort
          ; Phase 2: Auth
          *Cmd\ver = #SOCKS_Version
          *Cmd\cmd = StringByteLength(User$)
          CopyMemory(@User$, *Cmd + 2*SizeOf(Byte), StringByteLength(User$))
          PokeA(*Cmd + 2*SizeOf(Byte) + StringByteLength(User$), StringByteLength(Pass$))
          CopyMemory(@Pass$, *Cmd + 2*SizeOf(Byte) + StringByteLength(User$), StringByteLength(Pass$))
          
          SendNetworkData(ConId, *Cmd, CmdSize) ; Auth senden
          _SOCKS_Receive(@Ver, SizeOf(Word)) ; Auf Antwort warten
          
          If (OverTime Or Ver\ver <> #SOCKS_Version) ; Fehler
            Ver\Method = #SOCKS_AUTH_FAILURE
          EndIf
          
      EndSelect
      
      If Ver\Method = #SOCKS_AUTH_Ok ; Jetzt kommen wir zum Connect
        ; Wir führen einfach eine Verbindung per DomainName durch, dadurch umgehen wir auch DNS - Filter
        CmdSize = SizeOf(SOCKS_Cmd) + 3*SizeOf(Byte) + StringByteLength(dest_host$)
        *CMD = ReAllocateMemory(*CMD, CmdSize)
        
        *CMD\ver = #SOCKS_Version
        *CMD\cmd = #SOCKS_CMD_Connect
        *CMD\rsv = #Null
        *CMD\atyp = #SOCKS_ATYP_DomainName
        PokeA(*CMD + SizeOf(SOCKS_Cmd), StringByteLength(dest_host$))
        CopyMemory(@dest_host$, *CMD + SizeOf(SOCKS_Cmd) + SizeOf(Byte), StringByteLength(dest_host$))
        PokeW(*CMD + SizeOf(SOCKS_Cmd) + SizeOf(Byte) + StringByteLength(dest_host$), Port2Octed(dest_port))
        
        SendNetworkData(ConId, *Cmd, CmdSize) ; Connect senden
        _SOCKS_Receive(@Repl, SizeOf(SOCKS_Reply)) ; Auf Antwort warten
        
        If Not (OverTime Or Repl\Ver <> #SOCKS_Version)
          If Repl\rep = #SOCKS_REP_Succeeded
            RtVar = #True
          EndIf
        EndIf
      EndIf
    EndIf
    
    FreeMemory(*Cmd)
    If Not RtVar
      CloseNetworkConnection(ConId)
      ConId = #Null
    Else
      RtVar = ConId
    EndIf
  EndIf
    
  ProcedureReturn RtVar
EndProcedure
Gruß, Alex

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

Verfasst: 25.05.2011 23:13
von Tsuki-Namida
mit SOKS5 kannich leider nichtverbinden....ich bekomme immer eine "0" zurück -.-
aber bevor ich hier wind mache ist es überhaupt möglich über den proxy zu einen server zu verbinden und senden sowie empfangen? ggf auch downloaden bzw uploaden?

Lg

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

Verfasst: 25.05.2011 23:23
von cxAlex
Sicher ist das möglich :)
Der Source ist aber sicher (nach bestem Wissen und Gewissen) korrekt und hält sich genau an die RFC Spezifikation.

Gruß, Alex