您的位置:首页 > 编程语言 > C#

使用C#登录QQ空间的过程分析与实现

2009-12-16 22:33 281 查看
本篇文章主要是具体地分析如何用C#登录QQ空间之类在安全验证方面稍微复杂一点的网站,希望对大家有所帮助。

大家知道,一般而言,我们要登录网站时,都要提交两样最基本的东西-----就像去餐厅吃饭一定要交钱一样----这两样东西就是用户名与密码。当然有些餐厅比较先进一点,还得再加上验证码。我们输入这些数据之后,就将其提交到服务器进行验证,认证成功之后我们就具有所需要的权限,比如可以发帖子之类。

关于如何在.net中登录带验证码的网站 ,可以参考深蓝的文章:

/article/4756982.html 使用C#登录带验证码的网站

那么,我们只要能够模拟浏览器将数据发送给服务器,并保存好我们的登录凭证(Cookie),接下来就可以进行我们所要的操作而不会再看见诸如”你没有登录“之类的提示。接下来重点讲一下如何实现登录。

一开始, 一般需要使用网络嗅探器来捕获浏览器和服务器的HTTP协议交互过程,得到我们与服务器间的通话记录。这里使用http analyzer 来分析。

打开http analyzer ,点击"start",然后再登录网站,接下来就可以停止了,然后在那一长串的数据中,找到最前面那个POST,就是我们登录的那一刻与服务器的通话了。选中它,再看Post Data选项,我们来分析下到底传了什么上去。



u:自然就是我们的用户名了

p:这个东西看起来挺BT的,先放着。

verifycode:顾名思义,自然就是我们输入的验证码了。(看来变量名取得好听一点确实是好事)

接下来是些取得不太好的变量名,不过还好重要性并不大:

aid,ul,fp,h,ptredirect,ptlang,from_ui,dumy

由于在几次登录中,它们的值都是一样, 所以在我们的模拟登录中,也不妨再继续使用以上这些值。

接下来我们重点来看下"p"是什么东西。我们在文章开头就讲过,去餐厅吃饭一定要交钱,这里我们似乎就忘了掏我们的钱包了。看下钱包,原来还有密码没有交出来。那么,p大概是跟密码有关了。只是如果我们的键盘没有坏的话,刚才输入的密码似乎没有这么变态,那么到底是怎么回事呢?好在我们有其他的法宝还没用,并且掌握了罪犯的指纹(p的名字)。由于p只是表单里面的变量,并且之前我们没有再与服务器交互,所以p应该是我们在自己的客户端上改变的,那么,我们可以使用调试脚本的工具来看看"p"到底是什么东西,这里使用的是FireFox+ FireBug的办法 (FireBug是个插件,没有的话得去下载了)。

在Firefox中打开qzone.qq.com,再打开firebug,首先看看登录时用了哪个函数,我们选Inspect,再选中页面上负责登录的那个button,然后再找下,可以看到下面这段:

<form style="margin: 0px;" target="_self" onreset="return onFormReset(loginform)" onsubmit="return ptui_onLoginEx(loginform, 'qq.com')" method="post" action="http://ptlogin2.qq.com/login" name="loginform" autocomplete="off" id="loginform">

那么就知道登录时先要调用ptui_onLoginEx 这个函数,然后我们接下来的任务,就是要看看到底它是如何工作的。我的方法是这样:

1.先输入错误的密码,模拟一下登录,使firebug能够得到脚本调用的情况。

2.然后点"script",再点击上面的*.js(就是捕捉到的js脚本),可以看到这样的调用情况:

点击onLoginEx 之后,再设个断点:

这样当脚本执行到这里时,就会中断了。

3.在网页上输入信息并按登录,这时就中断了,我们的任务是看看"p"这个变量到底是如何变化的,那么首先我们要找到它(这里采用的是在Dom窗口中监视的办法):

然后就可以在DOM窗口中看到'p'的情况了(主要看的是value值)。

4.接下来的步骤比较麻烦一点,我们先按F11,那么又进入了子函数,这时回到DOM窗口,刷新后发现P的值没有任何变化。那么再继续跟踪。不用几步(这里要懂得F10和F11的区别,但总之,执行了N步之后,我们总是可以达到目的),我们可以发现在函数“preprocess”执行完后,p的值就忽然变态了。那么这个引起p的变态的凶手总算是找到了。

我们看下preprocess函数,它的名称取得还算不错:

1 function preprocess(A) {
2 var B = "";
3 B += A.verifycode.value;
4 B = B.toUpperCase();
5 A.p.value = md5(md5_3(A.p.value) + B);
6 return true;
7 }

短短7行,做的事情也并不复杂,就是加密而已,而且参数也只有一个,从“A.verifycode.value”和“A.p.value ”看,这个参数应该是代表form变量。这个参数有点大了。实际上,重要的是verifycode和p,从

“A.p.value = md5(md5_3(A.p.value) + B);”

可以看出,在这里经过处理之后,所返回的就是变态的p了。

这样我们就知道p到底是如何来的了。

那么我们如果能在程序中调用这个函数,并传入参数,便可以得到所要的p了。

关于如何在.net中调用js函数,可以参考程辰的文章:

http://www.cnblogs.com/cy19870114/archive/2008/11/27/1342441.html

QQ空间及邮箱验证码登录的校验方式及自动登录的解决方案

实际上,我们要调用的是在Comm.js中的preprocess函数,并用需要两个参数,密码和验证码,我们可以在comm.js文件中将这个函数这样改一下:

1 function preprocess(pass,verifycode) {

2 verifycode=verifycode.toUpperCase();

3 return md5(md5_3(pass) + verifycode);

4 }
这样即使算上末尾的括号,它的行数都少得可怜,只有4行而已。当然,这里的目的不全是为了减少代码,主要还是为了传递参数的方便。

最后,需要的数据都已经清楚,我们将其向服务器Post之后,便可以成功登录了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gar08888/archive/2009/07/12/4342180.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: