给出国的同学一点小惊喜(1)

申请基本上提交完了,每天干的事情就是检查申请状态和看主页上挂的流量统计。每看到多一个美国IP访问都好兴奋,同时好急躁:哎呀老师怎么还不联系我呀,是因为不满意吗?被照片吓到了吗?想想看其他同学一定也有这样的心理,于是就想着写个小程序伪装各种各样的美国IP访问其他同学的主页来给他们一点小惊喜~ :-D

一开始想着通过伪造IP头伪装IP,但稍微想一下就发觉有点难度。通过伪造IP头只能伪造网络层的IP包,可是TCP/IP协议是需要三次握手的。服务器发回的包都路由到错误的IP上去了,我连服务器的手都看不到,更别提握手了。而在没有收到服务器ACK+SYN包的情况下也不可能伪装ACK包完成三次握手,因为服务器SYN包的序列号不知道。如果通过一定的试探和预测的确有可能在一定概率下猜中服务器SYN包号,但这样的开发成本实在是太高了,所以这种方案只有放弃。

接下来比较容易想到的思路就是Proxy乐。好在网上Proxy的资源一抓一大把。写个小程序用美国Proxy不断访问同学网页不就好了吗?这个想法相当现实。开搞。

但是在用C#实现的时候遇到了困难。C#中进行网络连接最容易想到的自然是WebRequest类,不仅占用资源小,而且自带Proxy属性,直接指定就好。但写出来程序之后才发现完全没用。究其原因,是因为流量统计一般用的都是JavaScript脚本,需要执行一小段程序获取系统参数如系统版本,浏览器版本等等才能进行统计。但WebRequest只是把JavaScript脚本下载了下来,没有解释执行,自然就没有用了。

为了解决这个问题,比较直观的想法是:流量统计的原理必然是调用某些Web API,JS脚本的目的仅仅在于取参数,实质上的操作还是通过访问某个URL实现的。我对这个URL进行WebRequest不就结了。为了获取这个URL,需要分析这个JavaScript脚本。遗憾的是cnzz的脚本似乎经过了混淆…反正JS小白我看不太懂。没办法,只好用电脑算结果乐。把这个JS文件结尾加个alert(结果)再运行,得到一个地址。然后访问这个地址。唉…还是没反应…

蓦然反应过来,那我直接在C#通过某种方式运行JS脚本不就好了?笨死了。速度调用WinForm.WebBrowser控件开搞。成功~好了好了,写段几十行的小代码就可以给同学带来惊喜了~

这里面的几个教训是:

1. C#是一种傻瓜化的语言,应用的时候应该按照从高级到低级的顺序来思考,尽可能多的把任务交给.NET Framework来完成,别动不动就钻到最底层去。

2. 写程序的时候不要急躁,一步一步来,确认了第n步的成功再进行第(n + 1)步。否则会给调试带来很多不确定因素,欲速则不达。

3. 写程序的时候要确保一个完善畅通的信息反馈机制,保证自己知晓每一步是否成功非常关键,不可想当然假设某步肯定成功了。说不定这一步就是查了半天没查出来的障碍。

P.S. 其实好用的Proxy还是不好找的…sigh…

posted on 2010-01-25 22:55  grapeot  阅读(444)  评论(0编辑  收藏  举报

导航