C语言写的Linux平台socks5代理程序信息来源:邪恶八进制信息安全团队()前几天MSN老上不去,我还以为是公司做了防火墙限制。于是把去年这个时候写得一个代理程序改了改,拿出来用。结果发现MSN是因为微软的问题,鄙视啊……因为写得比较急,这个只支持TCP代理,UDP的我没写,因为MSN用不上。这个代码可以随意修改分发,不过最好能给我一份。这是头文件://///////////////////////////////////////////////////////////////////////////////////////////////////////////////Socks5代理头文件,定义协议相关数据包结构//版本0.1,作者云舒//2007年1月9日凌晨1点15分,GF回家已经11天了。//2008年1月25日修改,今年GF一直在我身边,哈哈////参考://://协商方法服务器响应{charversion;//服务器支持的Socks版本,0x04或者0x05charselect_method;//服务器选择的方法,0x00为匿名,0x02为密码认证}METHOD_SELECT_RESPONSE;typedefstruct_method_select_request//协商方法服务端请求{charversion;//客户端支持的版本,0x04或者0x05charnumber_methods;//客户端支持的方法的数量charmethods[255];//客户端支持的方法类型,最多255个,0x00为匿名,0x02为密码认证}METHOD_SELECT_REQUEST;typedefstruct_AUTH_RESPONSE//用户密码认证服务端响应{charversion;//版本,此处恒定为0x01charresult;//服务端认证结果,0x00为成功,其他均为失败}AUTH_RESPONSE;typedefstruct_AUTH_REQUEST//用户密码认证客户端请求{charversion;//版本,此处恒定为0x01charname_len;//第三个字段用户名的长度,一个字节,最长为0xffcharname[255];//用户名charpwd_len;//第四个字段密码的长度,一个字节,最长为0xffcharpwd[255];//密码}AUTH_REQUEST;typedefstruct_SOCKS5_RESPONSE//连接真实主机,Socks代理服务器响应{charversion;//服务器支持的Socks版本,0x04或者0x05charreply;//代理服务器连接真实主机的结果,0x00成功charreserved;//保留位,恒定位0x00charaddress_type;//Socks代理服务器绑定的地址类型,IPV4为0x01,IPV6为0x04,域名为0x03charaddress_port[1];//如果address_type为域名,此处第一字节为域名长度,其后为域名本身,无0字符结尾,域名后为Socks代理服务器绑定端口}SOCKS5_RESPONSE;typedefstruct_SOCKS5_REQUEST//客户端请求连接真实主机{charversion;//客户端支持的Socks版本,0x04或者0x05charcmd;//客户端命令,CONNECT为0x01,BIND为0x02,UDP为0x03,一般为0x01charreserved;//保留位,恒定位0x00charaddress_type;//客户端请求的真实主机的地址类型,IPV4为0x00,IPV6为0x04,域名为0x03charaddress_port[1];//如果address_type为域名,此处第一字节为域名长度,其后为域名本身,无0字符结尾,域名后为真实主机绑定端口}SOCKS5_REQUEST;#endif主程序来了://///////////////////////////////////////////////////////////////////////////////////////////////////////////////Socks5程序,只支持TCP代理//版本0.1,作者云舒//2007年1月9日凌晨1点15分,GF回家已经11天了。//2008年1月25日修改,今年GF一直在我身边,哈哈////参考://://编译://gcc-osocks5-O2Socks5.c-lpthread(RedHatAS5测试)///////////////////////////////////////////////////////////////////////////////////////////////////////////////#includestdio.h#includenetinet/in.h#includenetdb.h#includesys/time.h#includesys/types.h#includeunistd.h#includestdlib.h#includesignal.h#includepthread.h#includeerrno.h#includestring.h#includesys/socket.h#includearpa/inet.h#includeSocks5.h#defineMAX_USER10#defineBUFF_SIZE1024#defineAUTH_CODE0x02#defineTIME_OUT6000000#defineUSER_NAMEyunshu#definePASS_WORDph4nt0m//Selectauthmethod,return0ifsuccess,-1iffailedintSelectMethod(intsock){charrecv_buffer[BUFF_SIZE]={0};charreply_buffer[2]={0};METHOD_SELECT_REQUEST*method_request;METHOD_SELECT_RESPONSE*method_response;//recvMETHOD_SELECT_REQUESTintret=recv(sock,recv_buffer,BUFF_SIZE,0);if(ret=0){perror(recverror);close(sock);return-1;}//printf(SelectMethod:recv%dbytes\n,ret);//ifclientrequestawrongversionorawrongnumber_methodmethod_request=(METHOD_SELECT_REQUEST*)recv_buffer;method_response=(METHOD_SELECT_RESPONSE*)reply_buffer;method_response-version=VERSION;//ifnotsocks5if((int)method_request-version!=VERSION){method_response-select_method=0xff;send(sock,method_response,sizeof(METHOD_SELECT_RESPONSE),0);close(sock);return-1;}method_response-select_method=AUTH_CODE;if(-1==send(sock,method_response,sizeof(METHOD_SELECT_RESPONSE),0)){close(sock);return-1;}return0;}//testpassword,return0forsuccess.intAuthPassword(intsock){charrecv_buffer[BUFF_SIZE]={0};charreply_buffer[BUFF_SIZE]={0};AUTH_REQUEST*auth_request;AUTH_RESPONSE*auth_response;//authusernameandpasswordintret=recv(sock,recv_buffer,BUFF_SIZE,0);if(ret=0){perror(recvusernameandpassworderror);close(sock);return-1;}//printf(AuthPass:recv%dbytes\n,ret);auth_request=(AUTH_REQUEST*)recv_buffer;memset(reply_buffer,0,BUFF_SIZE);auth_response=(AUTH_RESPONSE*)reply_buffer;auth_response-version=0x01;charrecv_name[256]={0};charrecv_pass[256]={0};//auth_request-name_lenisachar,maxnumberis0xffcharpwd_str[2]={0};strncpy(pwd_str,auth_request-name+auth_request-name_len,1);intpwd_len=(int)pwd_str[0];strncpy(recv_name,auth_request-name,auth_request-name_len);strncpy(recv_pass,auth_request-name+auth_request-name_len+sizeof(auth_request-pwd_len),pwd_len);//printf(username:%s\npassword:%s\n,recv_name,recv_pass);//checkusernameandpasswordif((strncmp(recv_name,USER_NAME,strlen(USER_NAME))==0)&&(strncmp(recv_pass,PASS_WORD,strlen(PASS_WORD))==0)){auth_response-result=0x00;if(-1==send(sock,auth_response,sizeof(AUTH_RESPONSE),0)){close(sock);return-1;}else{return0;}}else{auth_response-result=0x01;send(sock,auth_response,sizeof(AUTH_RESPONSE),0);close(sock);return-1;}}//pars