⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy.cpp

📁 自己写的socks5代理完整源代码!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*=========================================================================
Socks5 Proxy v1.0
powered by shadow 2004/11/11
my web:http://www.codehome.6600.org
QQ:176017352
NOTE:
     这个还是最早版的,用户验证和UDP响应的功能没实现[关键在于获取一个随机的未使用的端口还没测试成功]
ftp 和QQ 匿名代理经过测试都能使用。
如果你改好了请发一份给我:dreamshadow@mail.sdu.edu.cn
最新代码请关注我的站点,thanks.
建议参考我的http代理的线程思想
==========================================================================*/
#include "stdafx.h"
#include "Proxy.h"
#define LISTENPORT 808
//
#define PROXYVERSION 0x05
#define NOAUTHLOGIN 0x00
#define GSSAPI 0x01
#define AUTHLOGIN 0x02
#define NOMETHOD 0xff
//
#define BACKUP 100
#define MAXDATALEN 65535
//
#define CMD_CONNECT 0x01
#define CMD_BIND 0x02
#define CMD_UDP 0x03
//
#define ATYP_IPV4 0x01
#define ATYP_DOMAIN 0x03
#define ATYP_IPV6 0x04
//
#define REP_SUCCESS 0x00
#define REP_FAILED 0x01
#define REP_CANNOT_CONNECT 0x02
#define REP_NET_CANNOTTO 0x03
#define REP_PC_CANNOTTO 0x04
#define REP_CONNECT_DENIED 0x05
#define REP_TTL_TIMEOUT 0x06
#define REP_CMD_WRONG 0x07
#define REP_ATYP_WRONG 0x08
//
#define FD_NOEVENT 0
#define ANY_SIZE 100
#define MAX_ADAPTER_NAME 128
/*
· X’09’ – X’FF’ 未定义
*/
/*
· X’03’ -- X’7F’ 由IANA分配
· X’80’ -- X’FE’ 为私人方法所保留的
*/
typedef struct _CLIENTINFO{
   SOCKET clientsock;
   SOCKET udpsock;
   sockaddr_in remotesock;
}CLIENTINFO,*LPCLIENTINFO;
CLIENTINFO TcpClientInfo,UdpClientInfo;
//
typedef struct _SOCKINFO{
   SOCKET sourcesock;
   SOCKET destsock;
}SOCKINFO,*LPSOCKINFO;
SOCKINFO sockinfo;
//
typedef struct _MIB_TCPROW{ 
DWORD dwState; 
DWORD dwLocalAddr; 
DWORD dwLocalPort; 
DWORD dwRemoteAddr; 
DWORD dwRemotePort; 
}MIB_TCPROW,*PMIB_TCPROW; 

typedef struct _MIB_TCPTABLE{ 
DWORD dwNum_Of_Entries; 
MIB_TCPROW TCP_Table[ANY_SIZE]; 
}MIB_TCPTABLE,*PMIB_TCPTABLE; 

typedef struct _MIB_UDPROW { 
DWORD dwLocalAddr; 
DWORD dwLocalPort; 
} MIB_UDPROW, *PMIB_UDPROW; 

typedef struct _MIB_UDPTABLE { 
DWORD dwNumEntries; 
MIB_UDPROW table[ANY_SIZE]; 
} MIB_UDPTABLE, *PMIB_UDPTABLE; 

typedef struct _MIB_TCPROW_EX 
{ 
DWORD dwState; 
DWORD dwLocalAddr; 
DWORD dwLocalPort; 
DWORD dwRemoteAddr; 
DWORD dwRemotePort; 
DWORD dwProcessId; 
} MIB_TCPROW_EX, *PMIB_TCPROW_EX; 

typedef struct _MIB_TCPTABLE_EX 
{ 
DWORD dwNumEntries; 
MIB_TCPROW_EX table[ANY_SIZE]; 
} MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX; 

typedef struct _MIB_UDPROW_EX 
{ 
DWORD dwLocalAddr; 
DWORD dwLocalPort; 
DWORD dwProcessId; 
} MIB_UDPROW_EX, *PMIB_UDPROW_EX; 

typedef struct _MIB_UDPTABLE_EX 
{ 
DWORD dwNumEntries; 
MIB_UDPROW_EX table[ANY_SIZE]; 
} MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX; 
//
int Socks5ListenPort;
SOCKET Socks5ListenSock;
bool CanSockProxy;
//

long GetSocketEventId(SOCKET remotesock){
long EventId;
HANDLE hevent;
hevent=CreateEvent(NULL,0,0,0);
WSANETWORKEVENTS socket_events;
EventId=FD_NOEVENT;
if(WSAEventSelect(remotesock,hevent,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE)==SOCKET_ERROR) return EventId;
WSAEnumNetworkEvents(remotesock,hevent,&socket_events);
if(socket_events.lNetworkEvents!=0){
   switch(socket_events.lNetworkEvents){
         case FD_ACCEPT:EventId=FD_ACCEPT;break;
		 case FD_CONNECT:EventId=FD_CONNECT;break;
		 case FD_READ:EventId=FD_READ;break;
		 case FD_WRITE:EventId=FD_WRITE;break;
		 case FD_CLOSE:EventId=FD_CLOSE;break;
		 case FD_OOB:EventId=FD_OOB;break;
		 default:EventId=FD_NOEVENT;break;
         }
   }
else EventId=FD_NOEVENT;
return EventId;
}
//
unsigned long GetLocalIp()
{
char IP[MAX_PATH],*ip;
char pc_name[80];
struct in_addr in;
struct hostent *host;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,0);
ip=IP;
strcpy(ip,"Ip not get!");
if(WSAStartup(wVersionRequested,&wsaData)) return 0;
if(gethostname(pc_name,80)==SOCKET_ERROR){
   WSACleanup();
   return 0;
   }
if(!(host=gethostbyname(pc_name))){
   WSACleanup();
   return 0;
   }
in.s_addr=*((unsigned long *)host->h_addr_list[0]);
strcpy(ip,inet_ntoa(in));
WSACleanup();
return in.s_addr;
}
//
unsigned long GetDomainIp(char domainname[250])
{
char IP[MAX_PATH],*ip;
struct in_addr in;
struct hostent *host;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,0);
ip=IP;
strcpy(ip,"Ip not get!");
if(WSAStartup(wVersionRequested,&wsaData)) return 0;
if(!(host=gethostbyname(domainname))){
   WSACleanup();
   return 0;
   }
in.s_addr=*((unsigned long *)host->h_addr_list[0]);
strcpy(ip,inet_ntoa(in));
WSACleanup();
return in.s_addr;
}
//
int GetValidPort(){
int port;
HINSTANCE hdll;
int CurrentUsePort[1000];
int portnum,i;
unsigned long table_len;
MIB_TCPTABLE tcp_table;
MIB_UDPTABLE udp_table;
port=0;
DWORD (*GetTcpTable)(PMIB_TCPTABLE,PDWORD,bool);
DWORD (*GetUdpTable)(PMIB_UDPTABLE,PDWORD,bool);
hdll=LoadLibrary("iphlpapi.dll");
if(!hdll) return port;
(FARPROC &)GetTcpTable=GetProcAddress(hdll,"GetTcpTable");
(FARPROC &)GetUdpTable=GetProcAddress(hdll,"GetUdpTable");
if(GetTcpTable){
   TRACE("get tcp table\r\n");
   table_len=(unsigned long)sizeof(tcp_table);
   GetTcpTable(&tcp_table,(PDWORD)&table_len,false);
   }
if(GetUdpTable){
   TRACE("get udp table\r\n");
   table_len=sizeof(MIB_UDPTABLE);
   //GetUdpTable(&udp_table,&table_len,1);
   }
FreeLibrary(hdll);
return port;
}
//
int SendMethodToClient(SOCKET remotesock,unsigned char methodid){
  unsigned char data[2];
  data[0]=PROXYVERSION; 
  data[1]=methodid;
  while(!send(remotesock,(const char *)data,sizeof(data),0)) ;
  return 1;
}
//
int SendRepToClient(SOCKET remotesock,unsigned char Rep,unsigned long ipmark,int port){
char data[10];
unsigned long ip;
data[0]=PROXYVERSION;
data[1]=Rep;
data[2]=0x00;
data[3]=ATYP_IPV4;
port=htons(port);
memcpy((void *)&data[8],(const void *)&port,2);
ip=ipmark;
//ip=inet_addr("202.194.4.218");
memcpy((void *)&data[4],(const void *)&ip,4);
while(!send(remotesock,data,sizeof(data),0));
return 1;
} 
//
UINT DeailThread(LPVOID info){
LPSOCKINFO psockinfo;
SOCKET sourcesock,destsock;
char data[MAXDATALEN];
long eventid;
int datalen;
psockinfo=(LPSOCKINFO)info;
sourcesock=psockinfo->sourcesock;
destsock=psockinfo->destsock;
TRACE("deail thread ok!\r\n");
while(true){
     eventid=GetSocketEventId(sourcesock);
	 switch(eventid){
	    case FD_CLOSE:
		   TRACE("s fdclosed\r\n");
		   closesocket(destsock);
		   return 1;
		   break;
		case FD_READ:
		   TRACE("s fdread\r\n");
		   datalen=recv(sourcesock,data,sizeof(data),0);
		   if(datalen>0){
		      while(!send(destsock,data,datalen,0));
			  TRACE("send s to d\r\n");
			  }
		   break;
		default:break;
		}
     eventid=GetSocketEventId(destsock);
	 switch(eventid){
	    case FD_CLOSE:
		   closesocket(sourcesock);
		   TRACE("d fdclosed\r\n");
		   return 1;
		   break;
		case FD_READ:
		   TRACE("d fd read\r\n");
		   datalen=recv(destsock,data,sizeof(data),0);
		   if(datalen>0){
		      while(!send(sourcesock,data,datalen,0));
			  TRACE("send d to s\r\n");
			  }
		   break;
		default:break;
		}
	 Sleep(1);
	 }
}
//
UINT ReciveThread(LPVOID info){
LPSOCKINFO psockinfo;
SOCKET sourcesock,destsock;
char data[MAXDATALEN];
long eventid;
int datalen;
psockinfo=(LPSOCKINFO)info;
sourcesock=psockinfo->sourcesock;
destsock=psockinfo->destsock;
TRACE("deail recive thread ok!\r\n");
while(true){
     eventid=GetSocketEventId(sourcesock);
	 switch(eventid){
	    case FD_CLOSE:
		   TRACE("s fdclosed\r\n");
		   closesocket(destsock);
		   return 1;
		   break;
		default:break;
		}
     eventid=GetSocketEventId(destsock);
	 switch(eventid){
	    case FD_CLOSE:
		   closesocket(sourcesock);
		   TRACE("d fdclosed\r\n");
		   return 1;
		   break;
		default:break;
		}
     datalen=recv(sourcesock,data,sizeof(data),0);
	 if(datalen==0){
	   closesocket(sourcesock);
	   closesocket(destsock);
	   TRACE("s fdclosed\r\n");
	   break;
	   }
	 if(datalen>0){
	    while(!send(destsock,data,datalen,0));
        }
	 Sleep(1);
	 }
return 1;
}
//
UINT SendThread(LPVOID info){
LPSOCKINFO psockinfo;
SOCKET sourcesock,destsock;
char data[MAXDATALEN];
long eventid;
int datalen;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -