|| Author: Berniee,Fakedminded/EOF || Back to articles ||
                                   Using proxy
                               berniee/fakedminded
                                      2006


1.Introduction

  In this article I will try to give you a hint on how you can use proxies in your 
codes. I will not get deep in this subject meaning that I will not discuss Authentication
too.
PS:all the following is tested on CCProxy(c).

2.Proxy types:

Proxy types that I am going to discuss here are socks (v.4) and http proxy.

3.Socks proxy:

I will explain this briefly -socks proxy according to my own researches(rfc!).
Inorder to get connected to socks proxy first you need to send a packet(duh!),
and according to rfc 
--the packet should be like this:

                +----+----+----+----+----+----+----+----+----+----+....+----+
		| VN | CD | DSTPORT |      DSTIP        | USERID       |NULL|
		+----+----+----+----+----+----+----+----+----+----+....+----+
 # of bytes:	   1    1      2              4           variable       1


vn=is the version of rfc which   we are going to use 4(one byte)
cd=is the order to the proxy '1'-->connect,while '2'--->bind(not going to talk about it here)(1byte)
dstport=destination port so obvious(2 bytes==word)
dstip=destination IP address (4 bytes==dword!)
userid=variable size it said to be something to do with identd(I think Authentication--
not my bussiness here--)
Null=must be ended with null byte.

now  lets put it in a structure:

socks_s struct

vn db ?
cd db ?
dstport dw ?
dstip dd ?
userID db 256 dup(?)
nell db ?

socks_s ends

and we just fill the previous structure and send it.(check the code at the end)

--and the response should be somehting like this(rfc):
           	+----+----+----+----+----+----+----+----+
		| VN | CD | DSTPORT |      DSTIP        |
		+----+----+----+----+----+----+----+----+
 # of bytes:	   1    1      2              4


vn=the version of the reply code and should be 0.
cd=state that our request is accomplished or not.Again from rfc:

	90: request granted
	91: request rejected or failed
	92: request rejected becasue SOCKS server cannot connect to
	    identd on the client
	93: request rejected because the client program and identd
	    report different user-ids

dtport=port that we wanted to connect to of the requested IP address.
dstip=Ip address we requested to connect to.
...well for me I saw that other thing is resent back to me is the userid!

so we are going to check the cd of the recieved packet .

See the following code that will try to connect to mx1.mail.yahoo.com,through socks 
proxy.(change the proxy IP to get it work)

;-----------------------cut from here

 .586
.model flat,stdcall
option casemap:none

socks_s struct

vn db ?
cd db ?
dstport dw ?
dstip dd ?
userID db 256 dup(?)
db ?

socks_s ends

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

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib


.data
db "sock4",0
ip_sock db "xxx.xxx.xxx.xxx",0    ;change that according to socks proxy address
_server db "mx1.mail.yahoo.com",0 ;our requested address!
USERid db "Guest",0               ; :)   

.data?

socks_send socks_s<?>

ws WSADATA <?>
sock_addr sockaddr_in<?>
buffer db 256 dup(?)           ;where to put the recieved packet
socket_ dd ?

.code
start:

call Intialize_wsocket
cmp eax,-1
je exit

invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
mov socket_,eax

mov sock_addr.sin_family,AF_INET
xor eax,eax
invoke htons,1080               ;most socks proxies have this port change it if not.
mov sock_addr.sin_port,ax
invoke inet_addr,offset ip_sock
cmp eax,INADDR_NONE
je exit
mov sock_addr.sin_addr.S_un.S_addr,eax
invoke connect,socket_,addr sock_addr,sizeof sock_addr
cmp eax,SOCKET_ERROR
je exit
;nvoke inet_addr,offset dstIP  ;if you are using IP address not domain 
invoke gethostbyname,offset _server

or eax,eax
jz exit
mov eax,[eax+12]
mov eax,[eax]
mov eax,[eax]

mov socks_send.vn,4   ;socks v.4
mov socks_send.cd,1   ;order===>connect

mov socks_send.dstport,1900h           ;port 25==>19h==>1900h(in dword)
mov socks_send.dstip,eax               ;the ip we supposed to get from gethostbyname()
invoke lstrcpy,offset socks_send.userID,offset USERid
mov socks_send.nell,0


invoke send,socket_,offset socks_send,sizeof socks_send,0
invoke recv,socket_,offset buffer,512,0


mov eax,offset buffer
cmp byte ptr [eax+1],90                 ;checking if the request is granted
jne exit
invoke recv,socket_,offset buffer,256,0


invoke MessageBox,0,offset ip_sock,offset buffer,0


exit:
invoke ExitProcess,0

Intialize_wsocket:
invoke WSAStartup,001h,addr ws
or eax,eax
jz failed_to_intialize

ret

failed_to_intialize:
mov eax,-1
ret

end start
;----------------------stop cutting 




4.HTTP proxy:
HTTP proxy is dependant on http protocol,well here I am going to discuss how it works
by the 'CONNECT'method ,and Again I will not explain how to use authentication.

to use http proxy,you just send the following packet:
CONNECT servername:port HTTP/1.1   

where :
CONNECT is the order we send to the proxy
servername whether it is an IP address or domain name(depend on proxy to resolve it)
port it is the port to connect to!
HTTP/1.1 Hypertext Transfer Protocol

try it on telnet it is fun.

I am to0 tired to write anything else,so I will depend on you to develop the code.

5.Final Words:
Hoping you understand the point I wanted to reach from all this,you have to go on 
googling to see how the Authentication is done,and then code nice things.

xxxxxxxxxxxxfakedminded(2006) from the lands of the Ultimate Free-Damn! :\xxxxxxxxxxx