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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Beitrag 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...
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Beitrag von coder »

Ahh, die ganze Sache funktioniert jetz ja doch...

Nochmal danke für den Code @HeXOR
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

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

Beitrag 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
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

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

Beitrag 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
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten