荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: michaelx (好好学习), 信区: DotNET
标  题: 用C#写二级代理验证程序
发信站: 荔园晨风BBS站 (Tue Jun 10 13:16:46 2003), 站内信件

原文见:
http://sunrise.szu.edu.cn/Forum/Topic/d041cc3a-3c41-4e0f-b3a2-8eb81b173b67.xml

                             用C#写二级代理验证程序

                                                                michaelx

                                               http://sunrise.szu.edu.cn

用手工验证二级代理的速度相当麻烦。先要找个proxy
list,然后用httport映射,最后用ie来测试。通常像我这么懒的人每次做这些体力劳动都
很不耐烦,一直想写个这样的软件,可惜上网找了很多资料都没有这方面的介绍,之后就打
消了这个念头。最近在研究网络控制时,无意发现了二级代理的原理,还写了个软件证明了
自己的分析是正?
返摹?

现在就同大家分享一下(如果谁兴趣写代理这方面的软件,欢迎交流):

一、分析:

先找个二级代理,用httport映射,用ie访问google。需要找个sniffer软件分析(自己找)

看图1,会发现有个http协议的包,内容是一个connect指令(重点)。看看所有连接的内容
吧:

CONNECT 218.106.168.3:3128 HTTP/1.0
Proxy-Authorization: Basic ****************************
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)

HTTP/1.0 200 Connection established

GET http://www.google.com/intl/zh-CN_ALL/images/logo.gif HTTP/1.0
Accept: */*
Referer: http://www.google.com
Accept-Language: zh-cn
Pragma: no-cache
If-Modified-Since: Fri, 21 Mar 2003 22:53:03 GMT; length=9106
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Data Center;
MyIE2; .NET CLR 1.1.4322)
Host: www.google.com
Proxy-Connection: Keep-Alive
Cookie: PREF=ID=4e86bce6372935b1:TM=1054198249:LM=1054198249:S=BIoGj_ybbXoIM_k_

HTTP/1.0 304 Not Modified
Date: Mon, 09 Jun 2003 14:27:04 GMT
Expires: Mon, 18 Jan 2038 02:45:59 GMT
Proxy-Connection: keep-alive

上面的红色是本机向代理发送的内容,蓝色是接收的内容。(注:*号内容经作者修改)。
第一条指令CONNECT 218.106.168.3:3128,意思系要求代理服务61.144.235.41连接二级代理
218.106.168.3:3128。如果收到HTTP/1.0 200 Connection established,证明连接成功了
,这时
发送到61.144.235.41的内容就会“原封不动”地转发到218.106.168.3:3128。这样就好像
把218.106.168.3的3128端口映射到61.144.235.41的8080端口。接着那些内容就是http协议
的,
比较简单不解释了。二级代理的工作其实就是这么简单。

二、编成实现:

首先要连接61.144.235.41:8080,因为用Tcp连接,所以选择了TcpClient来实现。

   TcpClient tc=new  TcpClient();
   tc.Connect(this.ip,this.port);

然后要发送connect指令,因为*号内容的用户名和密码,所以不给大家看,咔咔。
写了个BuildHeader的方法来生成connect指令的内容。其中Authorization的内容是用
Base64编码的。

  public string BuildHeader(string ip,int port,bool needauth)
  {
   string header="CONNECT "+ip+":"+port.ToString()+" HTTP/1.0\r\n";
   if(needauth)
   {
    Byte[] auth=Encoding.ASCII.GetBytes(this.username+":"+this.password);

    header+="Proxy-Authorization: Basic "+System.Convert.ToBase64String(auth,0,
auth.Length)+"\r\n";
   }
   header+="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)\r\n";
   header+="\r\n";
   return header;
  }
然后把构造好的指令发送出去。

Byte[] sendbuf=Encoding.ASCII.GetBytes(this.BuildHeader(ip,port,true));
Byte[] receivebuf=new Byte[255];
NetworkStream ns=tc.GetStream();
ns.Write(sendbuf,0,sendbuf.Length);

然后判断是否连接成功

int c=ns.Read(receivebuf,0,receivebuf.Length);
string string_con="";
while(c>0)
{
    string_con+=Encoding.ASCII.GetString(receivebuf,0,c);
    c=ns.Read(receivebuf,0,receivebuf.Length);
}
 if (string_con.IndexOf("Connection established")>0)
{
//连接成功了!
}

接着当然是要测试下二级代理能否正常工作。
访问一下www.google.com吧

string string_get=this.BuildGet(url);
Byte[] getbuf=Encoding.ASCII.GetBytes(string_get);
ns.Write(getbuf,0,getbuf.Length);

其中BuildGet方法的代码如下:

  public string BuildGet(string url)
  {
   string string_get="GET "+url+" HTTP/1.0\r\n"
    +"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, */*\r\n"
    +"Accept-Language: zh-cn\r\n"
    +"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Data
Center; .NET CLR 1.1.4322)\r\n"
    +"Host: www.google.com\r\n"
    +"Proxy-Connection: Keep-Alive\r\n\r\n";
   return string_get;
  }

把接收到的内容判断一下是否包含关键字(Google),如果包含就证明二级代理能正常工作了
^_^。
当然你可以用其他网址来验证,关键字也可以自己选择。例如可以用
http://sunrise.szu.edu.cn来验证。

二级代理的验证就完成了,哈哈,大功告成!
PS:想验证二级代理的其他属性就要自己动动脑筋了,例如代理是否支持connect模式。

原理明白了其他事就好办,例如写个像httport那样的mapping软件,加上调度功能。相信不
难,关键系效率问题。

三、ProxyChecker

ProxyChecker是为了证明自己分析的正确性写的。为了提高验证的准确性,所以效率不是很
高。
加上最近几天网络很不正常,有时发connect指令给学校的代理都会出错,暂时无法继续调
试。
已完成的功能:
1.通过免费ip列表判断代理是否免费;
2.通过网址验证二级代理;
3.判断二级代理是否支持connect模式;
4.管理HTTPort的map列表,读取、添加、删除。
5.修改IE的代理设置。


PS:图2为ProxyChecker。

 --

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.55.18]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店