手从而通过验证的方法。而在验证有限制的代理是LOG如下: ----- HTTP/1.1 404 ERROR ....... ----- 进一步的研究表明,仅发出 "HTTP/1.1 404" 的字符传就可以欺骗从而通过验证,猎手显示 ”要密码“ :) --- 2.8版的猎手中还增加的对socks的验证, 但结果同上:) --- 至此,我们应该可以从分析的结果中找到代理的实现方法了,剩下就是通过程序来证明之。 但还有两个方面值得注意: 1。在上面的第一个log中,我附带了16进制的转换,这很重要!!早先我就是没有仔细查看它,走了很长的弯路。请注意字符传之间的分格符,"0x0d 0x0a" 也就是c 中的”\n";行了吗?且慢,最重要的就是最后的8bits!!!!!!!!! "0x0d 0x0a 0x0d 0x0a" 连续的两个"\n\n",当初我就是没有看到它, 始终得不到正确的答案。(在程序通不过测试后,我只好手动的找寻答案不行,最后再看了一边log,才发现问题所在,就象 linux 中 mail 命令以一个回车加上一个点代表信笺的结束一样,send代理命令是以连续的两个回车结束. 下面是代理猎手的gnuC 实现,注意,本程序只是解释了代理猎手的实现过程,没有多IP 的扫描功能。 ------------------------------cut here ----------------------------------- /* this codez describe how to search a PROXY server * * by * * zer9 * ==== * zer9@21cn.com * * test on slackware 2.0.33 * cc proxyht.c -o proxyht.c */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <sys/socket.h> #include <signal.h> #define DefaultProxyPort 8080 //default proxy port 8080 #define MSG1 "GET http://www.maxtor.com HTTP/1.1\n" //1 --change (1 ,2) #define MSG2 "Host: www.maxtor.com\n" //2 to search #define MSG3 "Accept: */*\n" // other sit e #define MSG4 "Pragma: no-cache\n" #define MSG5 "User-Agent: ProxyHT 0.01\n\n" #define KEYWORD "Maxtor Corp" // this is keyword #define TIMEOUT 30 void alarm_handler(int w) { alarm(0); printf("Time Out!\n"); } int main(int argc,char *argv[]) { struct in_addr Target; struct hostent *he; struct sockaddr_in sin; int s,ProxyPort; char recvbuf1[5000]; char recvbuf2[10000]; if(argc==2) ProxyPort=DefaultProxyPort; else if(argc==3) ProxyPort=atoi(argv[2]); else { printf("ProxyHT 0.01 by zer9 mail:zer9@21cn.com\n"); printf("usage: %s [proxy_port]\n",argv[0]); return 0; } if((he=gethostbyname(argv[1]))!=NULL) bcopy(he->h_addr,(char *)&Target.s_addr,he->h_length); else Target.s_addr=inet_addr(argv[1]); if(Target.s_addr==-1) { perror("gethostbyname"); return -1; } printf("ProxyHT 0.01 by zer9 mail: zer9@21cn.com\n"); if((s=socket(AF_INET,SOCK_STREAM,0))<0) { perror("socket"); return -1; } sin.sin_family=AF_INET; sin.sin_port=htons(ProxyPort); sin.sin_addr.s_addr=Target.s_addr; if(connect(s,(struct sockaddr*)&sin,sizeof(sin))<0) { perror("connect"); return -1; } bzero(recvbuf1,sizeof(recvbuf1)); bzero(recvbuf2,sizeof(recvbuf2)); printf("%s start verifying... waiting a while please\n",argv[1]); signal(SIGALRM,alarm_handler); send(s,MSG1,strlen(MSG1),0); send(s,MSG2,strlen(MSG2),0); send(s,MSG3,strlen(MSG3),0); send(s,MSG4,strlen(MSG4),0); send(s,MSG5,strlen(MSG5),0); 1alarm(TIMEOUT); recv(s,recvbuf1,sizeof(recvbuf1),0); recv(s,recvbuf2,sizeof(rec |