rendered paste bodySocks4Connect proto :DWORD,:DWORD,:DWORD,:DWORD
SOCKS4c struct
svers BYTE ? ;socks version 4/5
command BYTE ?
wPort WORD ?
dIp DWORD ?
SOCKS4c ends
CTEXT MACRO text:VARARG
local TxtName
.data
TxtName BYTE text,0
.code
EXITM <ADDR TxtName>
ENDM
;1)returns valid socket socket handle on success and -1 on error
;2)sockserv can be a host or ip
;3)example invoke Socks4Connect,CTEXT("200.219.166.196"),3128,CTEXT("microsoft.com"),80 ;<-highly anonymous proxy in brazil! :)
Socks4Connect proc sockserv:DWORD,socksport:DWORD,ohost:DWORD,oport:DWORD
LOCAL SockC:SOCKS4c
LOCAL SA:sockaddr_in
LOCAL xhand:DWORD
mov SockC.svers,4
mov SockC.command,1
invoke htons,oport
mov SockC.wPort,ax
invoke inet_addr,ohost
.if eax==INADDR_NONE
invoke gethostbyname,ohost
cmp eax,NULL
je xerror
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]
mov SockC.dIp,eax
.else
mov SockC.dIp,eax
.endif
mov SockC.dIp,eax
invoke socket,AF_INET,SOCK_STREAM,0
cmp eax,INVALID_SOCKET
je
mov xhand,eax
mov SA.sin_family, AF_INET
invoke htons,socksport
mov SA.sin_port,ax
invoke inet_addr,sockserv
.if eax==INADDR_NONE
invoke gethostbyname,sockserv
cmp eax,NULL
je xerror
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]
mov SA.sin_addr,eax
.else
mov SA.sin_addr,eax
.endif
invoke connect,xhand,addr SAm,sizeof SAm
.if eax==SOCKET_ERROR
.if (eax!=WSAEWOULDBLOCK)
jmp xerror
.endif
.endif
invoke send,xhand,addr SockC,sizeof SockC, 0
mov eax,xhand
ret
xerror:
mov eax,-1
ret
Socks4Connect endp