· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.NETWORKS —› SOCKS 5 на masm

Посл.отвђт Сообщенiе


Дата: Май 3, 2004 08:54:29

Здравствуйте. Пытаюсь сделать SOCKS 5 прокси. Я знаю что на WASM есть исходники SOCKS 4 проксей, но кто нибудь имеет представление как осуществить SOCKS 5?


Дата: Май 3, 2004 12:31:58

www.rfc.net - тут написано


Дата: Май 3, 2004 14:29:39 · Поправил: Hangatyr

А в чем проблема? Если знаешь, как реализовать socks4, то трудностей быть не должно - v4 и v5 принципиально не отличаются.
p.s. Я что-то не видел на wasm.ru исходников socks-проксей - http есть, а вот socks что-то не нашел...


Дата: Май 5, 2004 19:33:43

Да этих socks-проксей чё-т в инете тоже нету :(


Дата: Май 5, 2004 22:27:26 · Поправил: comrade

могу свой на C дать (socks4)
есть ещё на назме от 'vecna', но там не фига не понятно (socks4)


Дата: Май 20, 2004 17:49:59

День добрый ! Вот, по многочисленным заявкам трудящихся. Исходник SOCKS 5 сервера. Пока что реализовал поддержку только TCP/IP соединений, до метода UDP ASSOCIATE никак руки не дойдут. Код приведен ниже. Тестируйте, пользуйтесь на здоровье. VetabetA.

; ______________________________________________________________________ ____
; | |
; | SOCKS 5 proxy server. By default it uses 1080 port for |
; | communication. Only CONNECT and BIND methods supplied. However that is |
; | sufficient for all TCP/IP-based communication protocols such as |
; | well-known HTTP, SMTP, POP3 and FTP. Compiled by MASM32 v.6.0 |
; | Tested on Ufasoft SocksChain 3.8, Dark Mailer 1.19 and Windows |
; | Commander 5.11 |
; |_____________________________________________________________________ ___|


.486
.model flat, stdcall
.nolist
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\ws2_32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\ws2_32.lib

FDZERO MACRO fds
mov fds.fd_count, 0
ENDM

FDSET MACRO hSocket, fds
mov eax, hSocket
mov ecx, fds.fd_count
shl ecx, 2
mov fds.fd_array[ecx], eax
inc fds.fd_count
ENDM

return MACRO arg
mov eax, arg
db 0c3h
ENDM


Server_Thread PROTO :DWORD
Session_Thread PROTO :DWORD


.data
.list

IPPORT_PROXY equ 1080

CMD_CONNECT equ 1
CMD_BIND equ 2
CMD_UDP_ASSOCIATE equ 3

SD_RECEIVE equ 0
SD_SEND equ 1
SD_BOTH equ 2

ATYP_IPv4 equ 1
ATYP_DNS equ 3
ATYP_IPv6 equ 4

Server_Running dd TRUE
ServerThreadID dd 0

szBoxText db "Press OK to stop server",0
szBoxTitle db "SOCKS 5 proxy",0

.code

Begin:
invoke CreateThread, NULL, 0, addr Server_Thread, NULL, 0, addr ServerThreadID
;
; Show a MessageBox and wait any actions
;
invoke MessageBox, NULL, addr szBoxText, addr szBoxTitle, MB_OK
mov Server_Running, FALSE
invoke Sleep, 500
invoke ExitProcess, NULL

;*******************************************************************;
; A Thread of Server
;
Server_Thread proc Param:DWORD

LOCAL hServerSocket :DWORD
LOCAL SessionThreadID :DWORD
LOCAL Server_WSADATA :WSADATA
LOCAL Server_sockaddr :sockaddr_in

invoke WSAStartup, 101h, addr Server_WSADATA
invoke socket, AF_INET, SOCK_STREAM, IPPROTO_IP
mov hServerSocket, eax
invoke htons, IPPORT_PROXY
mov [Server_sockaddr.sin_port], ax
invoke htonl, INADDR_ANY
mov [Server_sockaddr.sin_addr], eax
mov [Server_sockaddr.sin_family], AF_INET
invoke bind, hServerSocket, addr Server_sockaddr, sizeof Server_sockaddr
invoke listen, hServerSocket, SOMAXCONN
;
; Wait a connection from anybody
;
.repeat
invoke accept, hServerSocket, NULL, NULL
.if eax==INVALID_SOCKET
mov Server_Running, FALSE
.else
lea esi, Session_Thread
lea edx, SessionThreadID
invoke CreateThread, NULL, 0, esi, eax, 0, edx
.endif
.until Server_Running==FALSE

invoke closesocket, hServerSocket
call WSACleanup
ret

Server_Thread endp
;********************************************************************;
;
;********************************************************************;
; This Thread has created and executed after anybody
;successfully connected to the SOCKS-port
;
Session_Thread proc Param:DWORD

Answer_Size equ 1460

LOCAL Target_sockaddr :sockaddr_in
LOCAL fds :fd_set
LOCAL timewait :timeval

LOCAL timeout :DWORD
LOCAL hTargetSocket :DWORD
LOCAL hClientSocket :DWORD
LOCAL pSockaddr_in :DWORD
LOCAL cchSockaddr_in :DWORD
LOCAL Dst_Port :WORD
LOCAL Dst_IP :DWORD
LOCAL szHost [80h]:BYTE
LOCAL IOBuffer [1500]:BYTE


mov eax, Param
mov hClientSocket, eax ; store a socket handle of connected Client

mov timewait.tv_sec, 1 ; set a time-out (1 second)
mov timewait.tv_usec, 0
FDZERO fds

;
; Get an initial ("salutatory") request from Client
;
FDSET hClientSocket, fds
invoke select, 10h, addr fds, NULL, NULL, addr timewait
cmp eax, SOCKET_ERROR
je Close_Client_Socket

invoke recv, hClientSocket, addr IOBuffer, Answer_Size, NULL
cmp eax, SOCKET_ERROR
je Close_Client_Socket
or eax, eax
je Close_Client_Socket

.if (IOBuffer[0]==5) ;only SOCKS5 protocol supported
mov IOBuffer[1], 0 ;authentification is not required
.else
mov IOBuffer[0], 5
mov IOBuffer[1], 0ffh
.endif
invoke send, hClientSocket, addr IOBuffer, 2, NULL

FDSET hClientSocket, fds
invoke select, 10h, addr fds, NULL, NULL, addr timewait
cmp eax, SOCKET_ERROR
je Close_Client_Socket
;
; Get a request from Client which contents of connection characteristics
;
invoke recv, hClientSocket, addr IOBuffer, Answer_Size, NULL
cmp eax, SOCKET_ERROR
je Close_Client_Socket
or eax, eax
je Close_Client_Socket

cmp IOBuffer[0], 05 ;only SOCKS5 protocol supported
jne Close_Client_Socket
mov al, IOBuffer[1] ;get a CMD (command)
;
; Check a Method (CONNECT, BIND or UDP ASSOCIATE)
;
;
;------------------------ Proceed with CONNECT method---------------------------;
;
.if al==CMD_CONNECT
mov al, IOBuffer[3] ;get ATYP (type of host address)
call Check_ATYP
call Establish_Connect
;
;------------------------ Proceed with a BIND method----------------------------;
;
.elseif al==CMD_BIND
call Establish_Bind

;----------------------- Proceed with UDP ASSOCIATE method----------------------;
;
.elseif al==CMD_UDP_ASSOCIATE
.endif
;--------------------------------------------------------------------- ----------;

Close_Client_Socket:
invoke shutdown, hClientSocket, SD_SEND
invoke closesocket, hClientSocket
ret

;********************************************************************* *****************;
; This procedure checks a value of ATYP field in the client request. It also initializes
; Destination IP and Destination Port variables
;
Check_ATYP:
.if al==ATYP_IPv4
mov eax, dword ptr [IOBuffer+4]
mov Dst_IP, eax ; get DST.ADDR (destination IP)
mov ax, word ptr [IOBuffer+8]
mov Dst_Port, ax ; get DST.PORT (destination port)
.elseif al==ATYP_DNS
mov al, IOBuffer[4] ; get size of Host name
lea esi, IOBuffer[5]
lea edi, szHost
movzx ecx, al
cld
rep movsb
sub al, al
stosb
lodsw ; get DST.PORT (destination port)
mov Dst_Port, ax
invoke gethostbyname, addr szHost
.if eax!=0
mov eax, [eax+0ch]
mov eax, [eax] ; EAX->begin the list of addresses
mov eax, [eax] ; get first IP address from list
mov Dst_IP, eax
.endif
.elseif al==ATYP_IPv6
.endif
return 0
;--------------------------------------------------------------------- -------------------;
;
;--------------------------------------------------------------------- -------------------;
; Procedure that realizes a CONNECT method
;
Establish_Connect:
invoke socket, AF_INET, SOCK_STREAM, IPPROTO_IP
mov hTargetSocket, eax
mov [Target_sockaddr.sin_family], AF_INET
invoke htonl, INADDR_ANY
mov [Target_sockaddr.sin_addr], eax
mov [Target_sockaddr.sin_port], 0
invoke bind, hTargetSocket, addr Target_sockaddr, sizeof Target_sockaddr
mov [Target_sockaddr.sin_family], AF_INET
mov eax, Dst_IP
mov [Target_sockaddr.sin_addr], eax
mov ax, Dst_Port
mov [Target_sockaddr.sin_port], ax
mov IOBuffer[0], 5
invoke connect, hTargetSocket, addr Target_sockaddr, sizeof Target_sockaddr
;
; If the result of "connect()" call is a NULL - it's all right. Otherwise, we have to
;set an ERROR in the answer of our SOCKS-server
;
.if eax==0
mov al, 0
.elseif (eax==WSAENETDOWN)||(eax==WSAENETUNREACH)
mov al, 3
.elseif eax==WSAECONNREFUSED
mov al, 5
.elseif eax==WSAETIMEDOUT
mov al, 4
.else
mov al, 1
.endif

mov IOBuffer[1], al
mov IOBuffer[2], 0
mov IOBuffer[3], ATYP_IPv4
mov cchSockaddr_in, sizeof Target_sockaddr
invoke getsockname, hTargetSocket, addr Target_sockaddr, addr cchSockaddr_in
mov eax, [Target_sockaddr.sin_addr]
mov dword ptr [IOBuffer+4], eax
mov ax, [Target_sockaddr.sin_port]
mov word ptr [IOBuffer+8], ax
invoke send, hClientSocket, addr IOBuffer, 10, NULL ; send a notification
call Transfer_Data
invoke shutdown, hTargetSocket, SD_SEND
invoke closesocket, hTargetSocket
return 0
;
;--------------------------------------------------------------------- -------------------;
;
;--------------------------------------------------------------------- -------------------;
; Procedure that realizes a CONNECT method
;
Establish_Bind:
invoke gethostname, addr szHost, sizeof szHost ; get a Network name of our Host
invoke gethostbyname, addr szHost
mov eax, [eax+0ch]
mov eax, [eax] ;EAX->begin the list of addresses
mov eax, [eax] ;get first IP address from list
mov Dst_IP, eax
invoke socket, AF_INET, SOCK_STREAM, IPPROTO_IP
mov hTargetSocket, eax
mov [Target_sockaddr.sin_family], AF_INET
mov eax, Dst_IP
mov [Target_sockaddr.sin_addr], eax
mov [Target_sockaddr.sin_port], 0
;
; Open a port on the our side
;
invoke bind, hTargetSocket, addr Target_sockaddr, sizeof Target_sockaddr
mov IOBuffer[0], 5
mov IOBuffer[1], 0
mov IOBuffer[2], 0
mov IOBuffer[3], ATYP_IPv4
mov cchSockaddr_in, sizeof Target_sockaddr
invoke getsockname, hTargetSocket, addr Target_sockaddr, addr cchSockaddr_in
mov eax, [Target_sockaddr.sin_addr]
mov dword ptr [IOBuffer+4], eax
mov ax, [Target_sockaddr.sin_port]
mov word ptr [IOBuffer+8], ax
invoke send, hClientSocket, addr IOBuffer, 10, NULL ; send a first notification
invoke listen, hTargetSocket, 1
mov cchSockaddr_in, sizeof Target_sockaddr
;
; Wait a connection of anybody
;
invoke accept, hTargetSocket, addr Target_sockaddr, addr cchSockaddr_in
push eax
invoke shutdown, hTargetSocket, SD_SEND
invoke closesocket, hTargetSocket
pop eax
mov hTargetSocket, eax ; store a handle of connected socket
mov IOBuffer[0], 5
mov IOBuffer[1], 0
mov IOBuffer[2], 0
mov IOBuffer[3], ATYP_IPv4
mov eax, [Target_sockaddr.sin_addr]
mov dword ptr [IOBuffer+4], eax
mov ax, [Target_sockaddr.sin_port]
mov word ptr [IOBuffer+8], ax
invoke send, hClientSocket, addr IOBuffer, 10, NULL ; send the second notification
call Transfer_Data
invoke shutdown, hTargetSocket, SD_SEND
invoke closesocket, hTargetSocket
return 0
;-------------------------------------------------------------------;
;
;-------------------------------------------------------------------;
; This procedure transfers data between Client and Target
;
; !!! WARNING : don't try to debug this code - you'll get a wrong result !!!
;
Transfer_Data:
mov timewait.tv_sec, 30 ; maximal wait time is 30 seconds
mov timewait.tv_usec, 0
.while (TRUE) ; endless cycle starts here
invoke Sleep, 100
FDZERO fds
FDSET hClientSocket, fds
FDSET hTargetSocket, fds
invoke select, 10h, addr fds, NULL, NULL, addr timewait
.if (eax==SOCKET_ERROR)
.break
.endif
;
; Is a data from Client has arrived ?
; (if YES, get an answer from Client and redirect it to the Target)
;
invoke __WSAFDIsSet, hClientSocket, addr fds
.if (eax!=0)
invoke recv, hClientSocket, addr IOBuffer, Answer_Size, NULL
.if (eax==SOCKET_ERROR)||(eax==0)
.break
.endif
invoke send, hTargetSocket, addr IOBuffer, eax, NULL
.if (eax==SOCKET_ERROR)
.break
.endif
.endif
;
; Is a data from Target has arrived ?
; (if YES, get an answer from Target and redirect it to the Client)
;
invoke __WSAFDIsSet, hTargetSocket, addr fds
.if (eax!=0)
invoke recv, hTargetSocket, addr IOBuffer, Answer_Size, NULL
.if (eax==SOCKET_ERROR)||(eax==0)
.break
.endif
invoke send, hClientSocket, addr IOBuffer, eax, NULL
.if (eax==SOCKET_ERROR)
.break
.endif
.endif
.endw
return 0
;-------------------------------------------------------------------;
Session_Thread endp
;*******************************************************************;

End Begin


Дата: Май 20, 2004 18:15:59

VetabetA

Красиво, но лучше бы ты дополнительно исходник в аттач прицепил, да и тег [code] ему не помешал бы ;-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097