War zum verbessern meiner ASM-skills gedacht.
Benutzt viel MASM-spezifischen Lamer code
socks4.inc:
Code
- .586.MODEL flat, stdcallOPTION CASEMAP:NONE ;Case sensitiveInclude windows.incInclude kernel32.incInclude masm32.incinclude wsock32.incIncludeLib kernel32.libIncludeLib masm32.libincludelib wsock32.libSOCKS4_REQUEST Struct ucVersion byte ? ucCommand byte ? wDestport word ? dwDestIp dword ?SOCKS4_REQUEST EndSMain PROTO;;macrosPrint_Text Macro txt:REQ ;;note txt is not a pointer Invoke StdOut,ADDR txtEndM.DATASOCKS_PORT DWord 8080;;;;;;;;;;;;;;;;;;;;;welcome DB "Welcome to the socks4 server by Hamtaro aka CorVu5: ",13,10, 0endmsg DB "socks4 quitted",0connection DB "SOCKS4 connection attempt!",13,10,"---------------------------",13,10,0senderror DB "Send error occured!",13,10,"---------------------------",13,10,0recverror DB "Recv error occured!",13,10,"---------------------------",13,10,0concon DB "Connection etablished",13,10,"---------------------------",13,10,0conclosed DB "Connection closed",13,10,"---------------------------",13,10,0conrcv1 DB "Data recvd from Client",13,10,"---------------------------",13,10,0conrcv2 DB "Data recvd from Tunnel",13,10,"---------------------------",13,10,0errstr DB 100 DUP (?)
Socks4.asm
Code
- Include socks4.Inc
- .CODE
- Start:
- Invoke Main
- Invoke ExitProcess,0
- SocksProc Proc lpParam : DWORD
- local recvsock : SOCKET
- local tunnelsock : SOCKET
- local tunneladdr_in : sockaddr_in
- local socks4req : SOCKS4_REQUEST
- local socks4answer : SOCKS4_REQUEST
- local buffer[4096] : BYTE
- local User[64]:byte
- local data : DWORD
- local set : fd_set
- local tv : timeval
- Print_Text concon
- mov eax,lpParam
- mov recvsock,eax
- invoke recv,recvsock,addr socks4req,sizeof socks4req,MSG_PEEK
- .if socks4req.ucVersion == 4 ;ist Socks4
- invoke recv,recvsock,addr socks4req,sizeof socks4req,0 ;socks4 struct abrufen
- invoke recv,recvsock,addr User,64,0 ;User abrufen
- .if socks4req.ucCommand == 1 ; Connection anfrage
- Print_Text connection
- ;;tunnelsocket einrichten
- invoke socket, PF_INET, SOCK_STREAM, 0
- .if eax == INVALID_SOCKET
- jmp qquit
- .endif
- mov tunnelsock, eax
- mov eax, socks4req.dwDestIp
- mov tunneladdr_in.sin_addr, eax
- mov tunneladdr_in.sin_family, AF_INET
- mov ax, socks4req.wDestport
- mov tunneladdr_in.sin_port, ax
- invoke connect,tunnelsock,addr tunneladdr_in, sizeof tunneladdr_in
- .if eax == SOCKET_ERROR
- ;;SOCKS4 Antwort schicken (Misserfolg)
- mov socks4req.ucVersion, 0
- mov socks4req.ucCommand, 91
- invoke send,recvsock,addr socks4req,sizeof SOCKS4_REQUEST,0
- jmp qquit
- .endif
- ;;SOCKS4 Antwort schicken (Erfolg)
- mov socks4req.ucVersion, 0
- mov socks4req.ucCommand, 90
- invoke send,recvsock,addr socks4req,sizeof SOCKS4_REQUEST,0
- .if eax == SOCKET_ERROR
- jmp qquit
- .endif
- ;;Ab jetzt alles tunneln was geht und kommt
- mov tv.tv_sec, 2
- .while 1
- ;WARTEN BIS WAS KOMMT
- mov set.fd_count,0
- mov eax,[recvsock]
- mov set.fd_array, eax
- inc set.fd_count
- mov eax,[tunnelsock]
- mov dword ptr [set.fd_array + 4], eax
- inc set.fd_count
- invoke select,0,addr set,0,0,addr tv
- .if eax == 0 || eax < 0
- jmp qquit
- .endif
- invoke __WSAFDIsSet,tunnelsock,addr set
- .if eax == TRUE
- ;WENN WAS VOM TUNNEL KOMMT
- invoke recv,tunnelsock,addr buffer,sizeof buffer,MSG_PEEK
- .if eax == 0
- jmp qquit
- .endif
- Print_Text conrcv2
- invoke recv,tunnelsock,addr buffer,sizeof buffer,0
- ; Print_Text buffer
- .if eax == 0 ;Connection ist geschlossen
- jmp qquit
- .endif
- .if eax == SOCKET_ERROR || eax < 0; SOCKET Error
- Print_Text recverror
- invoke WSAGetLastError
- invoke dwtoa, eax,addr errstr
- Print_Text errstr
- jmp qquit
- .endif
- invoke send,recvsock,addr buffer,eax,0 ;Das empfangene Weitersenden
- .if eax == SOCKET_ERROR ; SOCKET Error
- Print_Text senderror
- jmp qquit
- .endif
- .endif
- invoke __WSAFDIsSet,recvsock,addr set
- .if eax == TRUE
- ;WENN WAS VOM CLIENT KOMMT
- invoke recv,recvsock,addr buffer,sizeof buffer,MSG_PEEK
- .if eax == 0
- jmp qquit
- .endif
- Print_Text conrcv1
- invoke recv,recvsock,addr buffer,sizeof buffer,0
- .if eax == 0 ;Connection ist geschlossen
- ;Print_Text error
- jmp qquit
- .endif
- .if eax == SOCKET_ERROR || eax < 0 ;SOCKET Error
- Print_Text recverror
- invoke WSAGetLastError
- invoke dwtoa, eax,addr errstr
- Print_Text errstr
- jmp qquit
- .endif
- invoke send,tunnelsock,addr buffer,eax,0 ;Das empfangene Weitersenden
- .if eax == SOCKET_ERROR ; SOCKET Error
- Print_Text senderror
- jmp qquit
- .endif
- .endif
- ;ZzZzZZZzZ
- invoke Sleep,50
- .endw
- .endif
- .endif
- qquit::
- Print_Text conclosed
- invoke closesocket,recvsock
- invoke closesocket,tunnelsock
- Ret
- SocksProc EndP
- StartSocks Proc dwPort : Dword
- local WsaData : WSADATA
- local sock : SOCKET
- local socks4 : sockaddr_in
- local client : sockaddr
- invoke WSAStartup,101h, addr WsaData
- invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
- .if eax == SOCKET_ERROR
- jmp quit
- .endif
- mov sock,eax
- mov socks4.sin_family, AF_INET
- invoke htons, SOCKS_PORT
- mov socks4.sin_port, ax
- xor eax, eax
- mov socks4.sin_addr, eax
- invoke bind,sock,addr socks4, sizeof socks4
- .if eax == SOCKET_ERROR
- jmp quit
- .endif
- invoke listen,sock,SOMAXCONN
- .if eax == SOCKET_ERROR
- jmp quit
- .endif
- .while 1
- wait4connect::
- invoke accept,sock,addr client,0
- .if eax == SOCKET_ERROR
- jmp wait4connect
- .endif
- invoke CreateThread,0,0,addr SocksProc,eax,0,0
- Invoke Sleep,100
- .endw
- quit::
- Print_Text endmsg
- invoke WSACleanup
- Ret
- StartSocks EndP
- Main Proc
- Print_Text welcome
- ;;
- invoke StartSocks, SOCKS_PORT
- ;;
- RET
- Main EndP
- End Start
Läuft in der Konsole, kann aber auch einfach zu einer Art Bouncer umfunktioniert werden
Kompiliert exakt 4kb groÃ?