|
|
| Посл.отвђт | Сообщен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 |