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
Alles anzeigen
Läuft in der Konsole, kann aber auch einfach zu einer Art Bouncer umfunktioniert werden
Kompiliert exakt 4kb groÃ?